AWS Lambda のスケジュールイベントで定期的に RDS の Snapshot を作成する
AWS Lambda でスケジュールイベントの設定ができるようになりました。
- Amazon Web Services ブログ: 【AWS発表】AWS Lambdaのアップデート – Python, VPC, 実行時間の延長, スケジュールなど
- http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started-scheduled-events.html
これにより cron で実行していたスクリプトを Lambda に移行できます。
cron の冗長化は面倒ですし、cron のためだけに EC2 を起動しなくて良いので便利ですね。
そこで(?)、Lambda から AWS の API を叩いて定期的に RDS の Snapshot を作成してみます。
Create Lambda Function
- 「Get started now」か 「Create Lambda Function」を押下
Select blueprint
Lambda のテンプレートを選択します。
- Python 2.7 を選択
- 「lambda-canary」か「hello-world-python」を選択
- (一通り設定した後にスケジュールイベントの設定をしたかったので「hello-world-python」を選択)
Configure function
Lambda の設定をします。
- Name, Description を入力
Lambda function code
Lambda のコードを作成します。
- 以下のコードを入力する
lambda_handler
の以下の変数を適宜修正delete_days
: 指定日経過したら削除する- 削除する必要がなければ
delete_snapshots
ごと削除
- 削除する必要がなければ
snapshot_prefix
: Snapshot 名の prefixinstances
: RDS の Instance 名を配列で指定
- Snapshot 名の時刻は、JST に変換する必要がなければ
tz=JST()
を削除
追記 2017-01-11 14:09
Aurora の場合は以下のコードで snapshot を取ることができます。
Lambda function handler and role
Lambda function handler はソースコード中の関数を指定します。
handler を変更すれば lambda_handler
以外の関数を実行することも可能です。
また、Lambda 実行に必要な IAM role も設定します。
こちらもテンプレートがありますが、
RDS の Snapshot を操作するものは用意されていないので、
IAM policy を修正します。
- 「Basic execution role」を押下
- IAM role 設定画面に遷移する
- ポップアップブロックしていると設定できないようです
- IAM role 設定画面に遷移する
- 「編集」を押下
- (ドキュメントを読んで)「OK」を押下
- 以下の json を入力する
Advanced settings
メモリやタイムアウトの時間を設定します。
数台分の Snapshot を作るだけの想定ですので、
タイムアウトは 10 秒で設定します。
Review
- 確認して「Create function」を押下
スケジュールイベントの設定
スケジュールイベントの設定を行います。
cron の書式が若干違うので、
詳しくは以下のドキュメントを参照してください。
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started-scheduled-events.html
(執筆時は、)設定する時間は UTC ですので、
日本時間で設定しないように注意してください。
- 「Event sources」タブの「Add event source」を押下
- 「Scheduled Event」を押下
- Name, Description を入力
- Schedule expression を入力
- (cron(0 4 * ? * *))
- (例は日本時間で毎13:00 に実行)
- (cron(0 4 * ? * *))
これで、スケジュールイベントの設定完了です。
あとは、時間になれば対象 Instance の Snapshot が作成されます。
CloudWatch
CloudWatch に実行ログが出力されます。
- ログを選択
print などで出力した結果やエラーログが出力されます。
まとめ
AWS Lambda で RDS の Snapshot を作成する方法を紹介しました。
EC2を使わないようにできるので、
可能な範囲で Lambda で実行させるようにすると運用が楽になりそうです。
また、紹介したコードでは省略しましたが、
実際に使う場合は Snapshot 作成に成功・失敗したかを、
チャットなどに通知するようにしたほうが良いですね。