Redshiftを擬似的に停止・再起動するバッチ処理
はじめに
Redshiftを夜間に停止し、再起動したいことがあったのですが、検索したところ、Redshiftには停止するためのコマンドがなさそうです。なので、擬似的に停止・再起動を行うため
- 停止・・・クラスタのスナップショットを取得後、削除
- 再起動・・・スナップショットよりクラスタを起動
するという方法を取りました。
実際の処理
1.実行環境
今回はWindowsサーバを使用する案件だったので、バッチ処理として作成しました。停止・再起動をそれぞれバッチとして実装し、タスクスケジューラから実行したい時間に呼び出すようにします。
バッチからは、Redshiftに対してAWS CLIのコマンドを発行します。なのでバッチを実行するサーバには、予めAWS CLIをインストールしておく必要があります。
2.停止処理
先に書いたように、AWS CLIのコマンドを発行してRedshiftのスナップショットを取得し、削除します。また再起動時に指定するためのスナップショット名を、テキストファイルに保存します。
@echo off cd %~dp0 call config.bat set SNAPSHOT_NAME=%SNAPSHOT_PREFIX%-%NOW_DATE_FORMATED% rem ============================== rem 削除処理実行 rem ============================== aws redshift delete-cluster --cluster-identifier %CLUSTER_NAME% --final-cluster-snapshot-identifier %SNAPSHOT_NAME% rem ============================== rem スナップショット名保存 rem ============================== echo %SNAPSHOT_NAME% > %SNAPSHOT_NAME_FILE%
3行目では、バッチを実行するディレクトリを動的に取得し、そこに移動しています。これを行わないと、タスクスケジューラから呼び出した時に実行するディレクトリが変わってしまうためです。次の4行目で、後で見る各種定義を記述した「config.bat」を読み込んでいます。6行目で、予めスナップショット名を決定します。後はコメントに書いてある通り、削除時にスナップショットを取得し、スナップショット名をファイルに出力しています。
3.再起動処理
こちらも基本的にはAWS CLIにコマンドを投げるだけのバッチです。
@echo off cd %~dp0 call config.bat rem ============================== rem スナップショットファイル名取得 rem ============================== for /f "delims=" %%a in (%SNAPSHOT_NAME_FILE%) do ( set SNAPSHOT_NAME=%%a goto break ) :break rem ============================== rem リストア実行 rem ============================== aws redshift restore-from-cluster-snapshot ^ --cluster-identifier %CLUSTER_NAME% ^ --snapshot-identifier %SNAPSHOT_NAME% ^ --availability-zone %AVAILABILITY_ZONE% ^ --cluster-subnet-group-name %SUBNET_GROUP% ^ --cluster-parameter-group-name %PARAMETER_GROUP% ^ --vpc-security-group-ids %VPC_SECURITY_GROUP%
1~4行目までは、削除処理と同じです。スナップショットファイル名の取得は、ファイルから一行取得するだけなので、もう少しまともな書き方があるかもしれません。再起動を行う「リストア実行」についてですが、今回はスナップショット名のほかに、AZやセキュリティグループなどの指定をしています。
4.定義ファイル
最後に、上記のバッチから読み込まれていた「config.bat」です。これの値は、案件によって変わってくるかと思います。
@echo off rem ============================== rem 実行対象環境定義 rem ============================== set ENV=xxx set VPC_SECURITY_GROUP=YourSecurityGroup rem ============================== rem 各種定数定義 rem ============================== set CLUSTER_NAME=YourClusterName set SNAPSHOT_PREFIX=YourSnapshotPrefix set SUBNET_GROUP=YourSubnetGroup set PARAMETER_GROUP=YourParameterGroup set SNAPSHOT_NAME_FILE=YourSnapshotFileName set NOW_DATE_FORMATED=%date:~-10,4%-%date:~-5,2%-%date:~-2,2%-%TIME:~0,2% set AVAILABILITY_ZONE=YourAvailabilityZone
まとめ
今回はWindowsのバッチでしたが、AWS CLIのコマンドを実行するだけなので、Linuxの場合でも応用できると思います。
参考サイト
How can I shut down a RedShift cluster from the command line?