hero_picture
Cover Image for Amazon EventBrigdeとAWS LambdaでAMI登録解除時にスナップショットも削除する

Amazon EventBrigdeとAWS LambdaでAMI登録解除時にスナップショットも削除する

こんにちは、クラウドソリューション事業部の本田です。みなさまいかがお過ごしでしょうか?実はこの10月でシーズに入社して早いもので1年になります。色々と濃い1年になりましたが、引き続きやっていきます。

本日はちょっと嬉しい設定を紹介したいと思います。AMIの登録を解除した際に、そちらに紐づいているスナップショットを削除してくれる設定です。Amazon EventBridgeとAWS Lambdaを利用します。

AMIの登録を解除してもスナップショットが残る

EC2からイメージを作るAMIですが、AMI自体の登録を解除してもそちらに紐づいているスナップショットは残ってしまいます。スナップショットはサイズに応じて課金されますので、残っていると地味にコストがかかってきます。

登録解除時にスナップショットを削除するようにする

例えばEC2に紐づくEBSはEC2を削除する際に合わせて削除することが可能ですが、AMIに紐づくスナップショットは合わせて削除することができず、AMIの登録を解除した後に、スナップショットも削除する必要があります。ついつい忘れてしまいますよね。そんなお悩みを以下の構成で自動で削除できるようにします。

構成図

EC2のコンソール、AWS CLIなどでAMIを解除すると、Lambdaを起動するようにEventBridgeを設定します。

実際に設定していく

それでは実際に設定いきましょう。まずはLambdaの設定を行います。

Amazon Lambda

今回はランタイムをNode.js16にしています。以下のコードを設定しています。

1const AWS = require('aws-sdk');
2const ec2 = new AWS.EC2();
3
4
5exports.handler = (event, ctx) => {
6
7    const target = JSON.stringify(event);
8    const eventJson = JSON.parse(target);
9
10    const filters = {
11        Filters: [
12           {
13            'Name': 'description',
14            'Values': [
15                'Created by CreateImage(*) for ' + eventJson.detail.ImageId,
16            ]
17         }
18        ],
19       };
20
21    ec2.describeSnapshots(filters, function(err, data) {
22        if (err) { console.log(err, err.stack); // an error occurred
23    } else {
24        const objdata = data["Snapshots"];
25        objdata.forEach(o => {
26            const snapshotId = {
27                SnapshotId: o.SnapshotId
28            };
29            console.log(snapshotId);
30            ec2.deleteSnapshot(snapshotId, function(err, data) {
31                if (err) { console.log(err, err.stack); // an error occurred
32                } else {
33                    console.log(data);
34                }// successful response
35                });
36        });
37    }
38});
39};
40

Eventbridgeに渡させるjsonの中に、AMIのIDが含めれますのでこちらのIDをフィルターにしてスナップショットのIDを探して、対象のスナップショットを削除するというものです。Lambdaのロールには以下の権限を追加しています。

・ec2:DescribeImages

・ec2:DeleteSnapshot

・ec2:DescribeSnapshots

Amazon EventBrigde

Lambdaを設定したので、次にEventBridgeを設定します。ルールタイプを「イベントパターンを持つルール」とし、以下のイベントパターンを設定します。

1{
2  "source": ["aws.ec2"],
3  "detail-type": ["EC2 AMI State Change"],
4  "detail": {
5    "State": ["deregistered"]
6  }
7}

AMIの登録解除を行うと、そのAMIがderegisteredというステータスになりますので、こちらの条件の際に上記で設定したLambdaを実行するように設定します。

動作確認

実際に動作を確認しましょう。検証用に以下のAMIを作成しました。

こちらのAMIには以下のスナップショットが紐づいています。

それではAMIの登録を解除してみます。EC2のコンソールから、AMIを選択し登録を解除します。削除してから先ほどのスナップショットを確認すると。

はい、消えておりました。確認完了です。

最後に

利用状況や作成してから時間などを見てAMIを定期的に解除していく仕組みなんかと組みわせるのも良いのではないでしょうか。地味ではありますが、コスト削減にもなりますし、念の為仕込んでおくのも良いかと思います。円安もすごいのでコスト削減やっていきましょ〜〜