AWS LambdaでEC2のAMIを定期的に自動作成・削除する方法!

AWS
この記事は約4分で読めます。

こんにちは、@Manabu です。

EC2のバックアップを取得する方法は、いくつかあると思います。

今回は、Lambdaを使用して、EventsBridgeで定期的にAMIを作成し、最新のもの以外は削除する処理を実装したいと思います。

私の環境では、DBをEC2内部に用意しており、DBの状態を最新にするためにもAMIは最新の状態にしておきたいので、今回の方法を検討しました。

Lambda関数の作成

Lambda関数の作成方法については、これまで紹介してきているので、以下を参考にして下さい。

AWS Lambdaを活用してEC2上のApacheを再起動してみた!

関数に付与する権限と、Pythonのソースコードだけ紹介します。

関数に付与する権限

今回は、EC2のAMIに関して操作するため、適切な権限を付与する必要があります。

テストなので、EC2のFull権限を付与して実行しています。

Pythonコード

関数の作成ができたら、Pythonのコードをデプロイしてテストします。

import boto3
from datetime import datetime, timedelta

ec2 = boto3.client('ec2')

def create_ami(instance_id, ami_name):
  response = ec2.create_image(
    InstanceId=instance_id,
    Name=ami_name,
   NoReboot=True
  )
  return response['ImageId']

def delete_old_ami(days):
  delete_date = datetime.now() - timedelta(days=days)
  images = ec2.describe_images(
    Owners=['self']
  )['Images']

  for image in images:
    creation_date = datetime.strptime(image['CreationDate'], '%Y-%m-%dT%H:%M:%S.%fZ')
    if creation_date < delete_date:
      ec2.deregister_image(ImageId=image['ImageId'])
      # スナップショットも削除する
      for block_device in image['BlockDeviceMappings']:
        if 'Ebs' in block_device:
          ec2.delete_snapshot(SnapshotId=block_device['Ebs']['SnapshotId'])

def lambda_handler(event, context):
  instance_id = 'i-************' # 対象のEC2インスタンスIDを設定
  ami_name = f"Backup-{datetime.now().strftime('%Y-%m-%d')}"

  # AMIの作成
  ami_id = create_ami(instance_id, ami_name)
  print(f"Created AMI: {ami_id}")

  # 前日以前のAMIを削除
  delete_old_ami(1) # 1日前のAMIを削除

こちらを実行することで、AMIは最新のものが作成され、それ以外のAMIは削除されます。

EventsBridgeをトリガーに設定

定期実行させるために、EventsBridgeをトリガーに設定します。

方法は、以下の記事を参考にして下さい。

AWS EventBridgeを使ってLambda関数をスケジュール実行してみた!

これでLambda関数を定期的に実行させることができます。

まとめ

今回は、Lambdaを使用してEC2のAMIを定期的に作成・削除する方法について紹介しました。

色々方法があると思うので、この方法が良さそうであれば参考にしてください。