Redshiftを擬似的に停止・再起動するバッチ処理

2014.11.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Redshiftを夜間に停止し、再起動したいことがあったのですが、検索したところ、Redshiftには停止するためのコマンドがなさそうです。なので、擬似的に停止・再起動を行うため

  1. 停止・・・クラスタのスナップショットを取得後、削除
  2. 再起動・・・スナップショットよりクラスタを起動

するという方法を取りました。

実際の処理

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?