Para programar un apagado automático para una instancia EC2 en AWS, puedes utilizar una combinación de AWS CloudWatch Events (con Event Bridge) y Lambday. Este método te permite crear un evento programado que lance la ejecución de una lambda para detener la instancia EC2 en el momento especificado, y volverla a reactivar el momento que determines. De esta forma podemos por ejemplo programar el autoapagado de instancias en periodos donde la actividad de nuestra aplicación no sea necesaria.
Aquí tienes una guía paso a paso para lograrlo:
Paso 1: Crear Lambdas para apagado y encendido:
El código de la lambda será el siguiente:
import boto3 def lambda_handler(event, context): instance_id = 'i-0e1ce132234568ae' ec2 = boto3.client('ec2') try: response = ec2.stop_instances(InstanceIds=[instance_id]) print(f"Stopping instance {instance_id}: {response}") return { 'statusCode': 200, 'body': f"Stopping instance {instance_id}: {response}" } except Exception as e: print(f"Error stopping instance {instance_id}: {str(e)}") return { 'statusCode': 500, 'body': f"Error stopping instance {instance_id}: {str(e)}" }
El único cambio necesario para la lambda de arrancado de instancias sería utilizar el método start_instances, en vez de stop_instances.
Paso 2: modifica el rol generado para las lambdas, para que tenga permisos para arrancar y parar instancias. Para ello modifica los roles asociados a ellas en IAM añadiendoles una JSON policy como la siguiente:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ec2:StartInstances", "ec2:StopInstances" ], "Resource": "arn:aws:ec2:*:198751412234:instance/*" } ] }
Paso 3: Asocia el evento programado para la ejecución de las lambdas. Para ello acudimos a Cloudwatch:
- Click en la parte izquierda en: Events - Rules
- Create Rule - Schedule (también puede realizarse dede EventBridge - Scheduler)
- Configuramos la regla. Por ejemplo apagado a la 01:00 am todos los días del año, y encendido a las 06:00 am.
En caso de hacerlo por EvenBridge quedaría así: