Amazon Lightsailの自動バックアップ設定( AWS Lambda + Amazon CloudWatch を利用 )

Amazon Lightsailを使って構築したサーバの自動バックアップ設定をまとめます。

利用プロダクトは、Amazon CloudWatch(スケジューリング)とAWS Lambda(バッチプログラム実行)です。

要件として、

  • 毎日AM5時に自動実行して新しいスナップショットを取得
  • 新しいスナップショットを取得時に一番古いものを消す
  • スナップショットは5世代まで保持
  • 手動で取得したスナップショットは勝手に消さないようにする。(名前で判別)

とします。

AWS Lambda上にバッチプログラムを用意します。

バックアップ対象のLightsailインスタンス名、何世代まで残すか、スナップショット名前を環境変数から取得するようにして汎用性を高めてあります。
Pythonを利用した例が多いのでそれを参考に作成しました。

 

環境変数で外だしにしたもの

環境変数名 設定値
instancename (Lightsailのインスタンス名を指定)
maxsnaps 5(保持する世代数。必要に応じて調整)
snapname (5、6文字くらいを推奨です。)
ここで指定した名前を元に最終的に
autosnap-{snapname}-yyyymmdd-hhnnss
というスナップショット名で作成されます。

CloudWatch Eventsにてスケジューラの設定をします。

cron式で毎日AM5時起動するように設定します。

 

ロール(IAM)の設定

これの設定がわからなくて難航しました。パーミッションエラーが出るときはこの設定を疑ってください。

インラインポリシーの追加でLightsailに関するsnapshot関連のアクション権限を追加します。

項目 設定値
サービス Lightsail
アクション GetInstanceSnapshots
GetInstanceSnapshot
CreateInstanceSnapshot
DeleteInstanceSnapshot
リソース すべてのリソース

きちんと動くかテストします。

テストイベントを用意&実行して作成したバッチプログラムが正しく動くかテストをします。
正しく動くと次のようなログが出力されます。

最後にCloudWatch Eventsを有効化して完成です。

実施イメージはこのようになります。

プログラムを作る際に何度もテストしたため同じ日に沢山スナップショット作成されてます(笑)。

これで手動スナップショットを残しつつ自動スナップショットを5世代残す形にできました。