AMI登録解除時、スナップショットを自動で削除するように設定してみました!

こんにちは、SIOS Coati開発担当の黒田です。

EC2のAMIは、EC2のバックアップ用途等で利用することが多いと思いますが、
不要になったAMIを削除する際は、「AMIの登録解除」と「スナップショットの削除」の
両方を実行しなければなりません。

その為、不要になったAMIを削除する作業は、地味に面倒な作業であります。
また、不要になったAMIを削除する際に、AMIと関連しているスナップショットの削除を
忘れてしまって不要なスナップショットが残り無駄なコストがかかってしまったり、
誤って必要なスナップショットを削除してしまうかもしれません。

なので今回は、AWS Lambda と Amazon CloudWatch Events を利用して、AMI登録解除時、
関連するスナップショットを自動で削除する設定方法を紹介したいと思います。

1. ポリシー作成とロール作成

AWS Lambda で使用するポリシーとロールを作成します。

AWSへログイン後、AWSマネージドコンソールからIAMへ移行してください。

ポリシー作成

IAM画面からポリシーの「ポリシーの作成」を選択します。

ビジュアルエディターから以下のポリシーを選択し、ポリシーを作成してください。

  • DescribeSnapshots
  • DeleteSnapshot

ロール作成

IAM画面からポリシーの「ポリシーの作成」を選択します。

「信頼されたエンティティの種類を選択の」AWSサービスの中から「Lambda」を選択し、

「次のステップ:アクセス権限」を選択してください。

以下のポリシーを選択してください。

  • AmazonEC2DeleteSnapshots(今回作成したポリシー)
  • AWSLambdaBasicExecutionRole

「ロール作成」を選択しロールを作成します。

2. AWS Lambda 関数の作成

AMIと関連するスナップショットを削除するAWS Lambda関数を作成します。

AWSマネージドコンソールからAWS Lambdaへ移行し、「関数の作成」を選択してください。

「一から作成」を選択し、以下の情報を入力してください。

  • 名前: delete_snapshot_after_ami_deregister_image
  • ランタイム: Python 3.6
  • 既存のロール: delete_snapshot_after_ami_deregister_image(今回作成したロールです。)
  • コード: 以下のサンプルコードを参照してください。
  • タイムアウト: 30秒(環境により変更してください。)

 

サンプルコード

 

「関数の作成」を選択し、内容を確認して関数を作成してください。

3. Amazon CloudWatch Events設定

AMIの登録解除を契機にAWS Lambda関数を実行するように設定します。

AWSマネージドコンソールからAWS CloudWatchのルールへ移行し、「ルールの作成」を選択してください。

イベントソースの「イベントパターン」を選択し、以下の情報を選択と入力してください。

  • サービス名: EC2
  • イベントタイプ: AWS API Call via CloudTrail
  • 特定のオペレーション : DeregisterImage

ターゲットの「Lambda 関数」を選択し、以下の情報を選択してください。

  • delete_snapshot_after_ami_deregister_image(今回作成したLambda関数を選択)

「設定の詳細」を選択し、内容を確認して設定を完了してください。

4. 動作の確認

AMIの登録を解除したときにAMIと関連するスナップショットが
自動で削除されることを確認してください。

5. まとめ

今回の設定で、AMIの登録解除時に自動でスナップショットを削除するので、
もういちいち個別でスナップショットを削除する必要がありません。

地味な自動化ではありますが、AMIを多く利用している方にとっては、
格段に運用が楽になると思います。

 

参考にさせてもらったページ

AMI削除時にスナップショットも自動で削除するCloudWatch Events

 

SNSでもご購読できます。