Implementei a função lambda assim
import boto3
import os
from datetime import datetime
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
instance_ids = os.environ['INSTANCE_IDS'].split(",")
for instance_id in instance_ids:
new_ami = ec2.create_image(
InstanceId=instance_id,
Name=f"Backup-{instance_id}-{datetime.now().strftime('%Y-%m-%d-%H-%M-%S')}",
NoReboot=True
)
new_ami_id = new_ami['ImageId']
waiter = ec2.get_waiter('image_available')
waiter.wait(ImageIds=[new_ami_id])
print(f"AMI {new_ami_id} is now available")
encrypted_ami = ec2.copy_image(
SourceImageId=new_ami_id,
SourceRegion=context.invoked_function_arn.split(":")[3],
Name=f"Encrypted-Backup-{instance_id}-{datetime.now().strftime('%Y-%m-%d-%H-%M-%S')}",
Encrypted=True
)
return {"status": "AMIs created, encrypted, and old AMIs managed"}
Como tirar um snapshot ec2.get_waiter
requer uma quantidade considerável de tempo, a função expira mesmo se eu colocar a quantidade máxima de ms. Qual é o fluxo correto para realizar essa tarefa?
Você deve dividir a função Lambda em duas funções Lambda separadas, uma que cria a AMI e outra que executa a cópia da AMI.
Para acionar automaticamente a segunda função Lambda quando a AMI tiver sido criada, você configuraria uma regra EventBridge para acionar a função Lambda quando um evento AMI ocorresse com um
State
valor deavailable
. Você poderia adicionar um filtro à regra para acionar somente quando o nome da AMI começasse comBackup
.