こんにちは、@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を定期的に作成・削除する方法について紹介しました。
色々方法があると思うので、この方法が良さそうであれば参考にしてください。