tkuchikiの日記

新ブログ https://blog.tkuchiki.net

AWS Lambda のスケジュールイベントで定期的に RDS の Snapshot を作成する

AWS Lambda でスケジュールイベントの設定ができるようになりました。

これにより cron で実行していたスクリプトを Lambda に移行できます。
cron の冗長化は面倒ですし、cron のためだけに EC2 を起動しなくて良いので便利ですね。

そこで(?)、Lambda から AWSAPI を叩いて定期的に RDS の Snapshot を作成してみます。

Create Lambda Function

  • 「Get started now」か 「Create Lambda Function」を押下

Select blueprint

Lambda のテンプレートを選択します。

f:id:tkuchiki:20151106111308p:plain

  • Python 2.7 を選択
  • 「lambda-canary」か「hello-world-python」を選択
    • (一通り設定した後にスケジュールイベントの設定をしたかったので「hello-world-python」を選択)

Configure function

Lambda の設定をします。

f:id:tkuchiki:20151106112043p:plain

  • Name, Description を入力

Lambda function code

Lambda のコードを作成します。

f:id:tkuchiki:20151106112138p:plain

  • 以下のコードを入力する
    • lambda_handler の以下の変数を適宜修正
      • delete_days : 指定日経過したら削除する
        • 削除する必要がなければ delete_snapshots ごと削除
      • snapshot_prefix : Snapshot 名の prefix
      • instances : 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 を修正します。

f:id:tkuchiki:20151106112555p:plain

  • 「Basic execution role」を押下
    • IAM role 設定画面に遷移する
      • ポップアップブロックしていると設定できないようです

f:id:tkuchiki:20151106112839p:plain

  • 「編集」を押下

f:id:tkuchiki:20151106113006p:plain

  • (ドキュメントを読んで)「OK」を押下
  • 以下の json を入力する

Advanced settings

メモリやタイムアウトの時間を設定します。
数台分の Snapshot を作るだけの想定ですので、
タイムアウトは 10 秒で設定します。

f:id:tkuchiki:20151106113555p:plain

Review

  • 確認して「Create function」を押下

スケジュールイベントの設定

スケジュールイベントの設定を行います。
cron の書式が若干違うので、
詳しくは以下のドキュメントを参照してください。

http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started-scheduled-events.html

(執筆時は、)設定する時間は UTC ですので、
日本時間で設定しないように注意してください。

f:id:tkuchiki:20151106114226p:plain

  • 「Event sources」タブの「Add event source」を押下

f:id:tkuchiki:20151106113755p:plain

  • 「Scheduled Event」を押下

f:id:tkuchiki:20151106114508p:plain

  • Name, Description を入力
  • Schedule expression を入力
    • (cron(0 4 * ? * *))
      • (例は日本時間で毎13:00 に実行)

f:id:tkuchiki:20151106115118p:plain

これで、スケジュールイベントの設定完了です。
あとは、時間になれば対象 Instance の Snapshot が作成されます。

CloudWatch

CloudWatch に実行ログが出力されます。

f:id:tkuchiki:20151106115250p:plain

  • ログを選択

f:id:tkuchiki:20151106115328p:plain

print などで出力した結果やエラーログが出力されます。

まとめ

AWS Lambda で RDS の Snapshot を作成する方法を紹介しました。
EC2を使わないようにできるので、
可能な範囲で Lambda で実行させるようにすると運用が楽になりそうです。
また、紹介したコードでは省略しましたが、
実際に使う場合は Snapshot 作成に成功・失敗したかを、
チャットなどに通知するようにしたほうが良いですね。