#!/bin/bash # # This script uses AWS API to create RedShift clusters and snapshots. # #----------------- list_snapshots() -------------------------------------------------- list_snapshots() { echo "List of snapshots..." echo "---------------------" echo "" arr_snapshots=(`aws redshift describe-cluster-snapshots | grep SnapshotIdentifier | awk '{ print $2 }' | sed 's/"//g' `) echo ${arr_snapshots[@]} | tr " " "\n" | nl arr_snapshots_len=${#arr_snapshots[@]} echo "" } #----------------- list_clusters() --------------------------------------------------- list_clusters() { echo "List of clusters..." echo "---------------------" echo "" arr_clusters=(`aws redshift describe-clusters | grep ClusterIdentifier | awk '{ print $2 }' | sed 's/,//' | sed 's/"//g' `) echo ${arr_clusters[@]} | tr " " "\n" | nl arr_clusters_len=${#arr_clusters[@]} echo "" } #----------------- check_confirmation() ------------------------------------------- check_confirmation() { # this loop checks if nothing or empty/white string was inputted while [ 1 ] do printf "Do you want to proceed? (y/n): " read response [ ! -z "$response" ] && break done [ "$response" == "n" ] && continue || [ "$response" != "y" ] && break } #------------------------------------------------------------------------------------- main_menu() { echo "What would you like to do?" echo "==========================" echo "" echo " (1) List clusters" echo " (2) List snapshots" echo " (3) Create cluster from snapshot" echo " (4) Create snapshot from cluster (also deletes the cluster)" echo " (5) Quit" echo "" } #----------------- start main loop --------------------------------------------------- clear # Display snapshots and clusters list_snapshots list_clusters # This loop runs continuously until user enters q to quit while [ 1 ]; do # Display menu choices main_menu # read user choice printf "Choice: " read input echo "" case "$input" in (1) # display clusters list_clusters continue ;; (2) # display snapshots list_snapshots continue ;; (3) # Create cluster from snapshot echo "You chose to create a cluster from a snapshot. Which snapshot do you want to use? Number: " echo "" list_snapshots echo " b Back to main menu" echo "" printf "Which snapshot do you want to use to create a cluster? Number: " read input re='^[0-9qb]+$' # regular expression while ! [[ $input =~ $re ]] do echo "" echo "Not a valid choice. Please try again." echo "" echo ${arr_snapshots[@]} | tr " " "\n" | nl echo "" echo " b Back to main menu" echo "" printf "Which snapshot do you want to use to create a cluster? Number: " read input # if input contains a space, go back to top of while-loop [[ $input = *[[:space:]]* ]] && continue done [ $input == "q" ] && echo "Goodbye" && exit [ $input == "b" ] && continue while [ $input -gt $arr_snapshots_len ] || [ $input -lt "1" ] || ! [[ $input =~ $re ]] do echo "" echo "Not a valid choice. Please try again." echo "" echo ${arr_snapshots[@]} | tr " " "\n" | nl echo "" echo " b Back to main menu" echo "" printf "Which snapshot do you want to use to create a cluster? Number: " read input done choice=`expr $input - 1` snapshot_choice=${arr_snapshots[${choice}]} echo "You chose "$snapshot_choice echo "" # if user hits return without typing anything, re-ask question. while [ 1 ] do printf "Please enter cluster name: " read cluster_name # replace any spaces with dash cluster_name=`echo $cluster_name | sed 's/ /-/g'` [ ! -z "$cluster_name" ] && break done cmd="aws redshift restore-from-cluster-snapshot --cluster-identifier $cluster_name --snapshot-identifier $snapshot_choice" echo "About to execute the following command:" echo "" echo $cmd echo "" # confirm to continue check_confirmation echo "Creating cluster: $cluster_name. Please wait. This will take some time..." eval $cmd echo "" # display message again after json ouput echo "Creating cluster: $cluster_name. Please wait. This will take some time..." # check when cluster creation is done. Echo out running counter to show progress. count=0 while [ 1 ] do aws redshift describe-clusters --cluster-identifier $cluster_name | grep ClusterStatus | grep available > /dev/null if [ $? -eq 0 ] then break fi count=`expr $count + 1` printf "$count " sleep 2 done echo "" echo "Cluster $cluster_name created." echo "" # show list of clusters. It will now include new cluster. list_clusters continue ;; (4) # Create snapshot from cluster echo "You chose to create snapshot from a cluster. Which cluster do you want to use? Number: " echo "" list_clusters echo " b Back to main menu" echo "" printf "Which cluster do you want to use to create a snapshot? Number: " read input re='^[0-9qb]+$' # regular expression while ! [[ $input =~ $re ]] do echo "" echo "Not a valid choice. Please try again." echo "" echo ${arr_clusters[@]} | tr " " "\n" | nl echo "" echo " b Back to main menu" echo "" echo "" printf "Which cluster do you want to use to create a snapshot? Number: " read input # if input contains a space, go back to top of while-loop [[ $input = *[[:space:]]* ]] && continue done [ $input == "q" ] && echo "Goodbye" && exit [ $input == "b" ] && continue while [ $input -gt $arr_clusters_len ] || [ $input -lt "1" ] || ! [[ $input =~ $re ]] do #echo "There are only $arr_clusters_len clusters. Please choose again." echo "" echo "Not a valid choice. Please try again." echo "" echo ${arr_clusters[@]} | tr " " "\n" | nl echo "" echo " b Back to main menu" echo "" printf "Which cluster do you want to use to create a snapshot? Number: " read input done choice=`expr $input - 1` cluster_choice=${arr_clusters[${choice}]} echo "You chose "$cluster_choice echo "" # if user hits return without typing anything, re-ask question. while [ 1 ] do printf "Please enter snapshot name: " read snapshot_name # replace any spaces with dash snapshot_name=`echo $snapshot_name | sed 's/ /-/g'` [ ! -z "$snapshot_name" ] && break done timestamp=`date +'%Y%m%d-%H%M'` cmd="aws redshift delete-cluster --cluster-identifier $cluster_choice --final-cluster-snapshot-identifier $snapshot_name-$timestamp" echo "About to execute the following command:" echo "" echo $cmd echo "" # confirm to continue check_confirmation echo "Creating snapshot: $snapshot_name-$timestamp. Please wait. This will take some time..." eval $cmd echo "" # display message again after json ouput echo "Creating snapshot: $snapshot_name-$timestamp. Please wait. This will take some time..." # check when snapshot creation is done. Echo out running counter to show progress. count=0 while [ 1 ] do aws redshift describe-cluster-snapshots --snapshot-identifier $snapshot_name-$timestamp | grep Status | grep available > /dev/null if [ $? -eq 0 ] then break fi count=`expr $count + 1` printf "$count " sleep 2 done echo "" echo "Snapshot $snapshot_name-$timestamp created." echo "" # show list of snapshots. It will now include new cluster. list_snapshots continue ;; ([q5]) echo "Goodbye" break ;; esac done