AMI登録解除時の、スナップショット自動削除を設定してみた

    この記事は公開してから1年以上経過しており、情報が古い可能性がありますのでご了承ください。

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

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

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

    なので今回は、AWS LambdaAmazon 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秒(環境により変更してください。)

    サンプルコード

    import boto3
    import logging
    from time import sleep
    from botocore.exceptions import ClientError
    
    client = boto3.client('ec2') 
    
    def lambda_handler(event, context):
        # 削除された対象のAMI IDを取得
        image_id = event['detail']['requestParameters']['imageId']
        
        # 削除対象のスナップショットを取得
        response = client.describe_snapshots(
            Filters=[
                { 'Name': 'description',
                  'Values': [ 'Created by CreateImage(*) for ' + image_id + ' from *',
                   ]
                }
             ]
        )
    
        # スナップショットの削除
        for i in response['Snapshots']:
            try:
                return client.delete_snapshot(SnapshotId=i['SnapshotId'])
            except ClientError as e:
                logging.error("Delete snapshot error: %s", e)

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

    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

    製品サイト

    Amazon EC2上のアプリケーションを自動監視・自動復旧するサービスやってます。
    1インスタンスにつき1時間5円と低コストが特徴で他の監視ツールとの連携も可能です。
    ご興味あればぜひ。

    SNSでもご購読できます。