¿Cómo detengo e inicio las instancias de Amazon EC2 a intervalos regulares utilizando Lambda?
Quiero reducir mi uso de Amazon Elastic Compute Cloud (Amazon EC2) deteniendo e iniciando automáticamente las instancias de EC2.
Descripción breve
Para detener e iniciar automáticamente las instancias de EC2, se puede utilizar AWS Lambda y Amazon EventBridge.
Nota: La siguiente solución es sencilla. Para obtener una solución más avanzada, utilice AWS Instance Scheduler. Para obtener más información, consulte Automatizar el inicio y la detención de las instancias de AWS.
Para usar Lambda para detener e iniciar instancias de EC2 a intervalos regulares, realice los siguientes pasos:
1. Cree una política y un rol de ejecución de AWS Identity and Access Management (IAM) personalizados para la función Lambda.
2. Cree funciones de Lambda que detengan e inicien las instancias de EC2.
3. Pruebe las funciones de Lambda.
4. Cree reglas de EventBridge que ejecuten la función siguiendo un cronograma.
Nota: También puede crear reglas que reaccionen a los eventos que tengan lugar en la cuenta de AWS.
Solución
Nota: Si recibe el error Error del cliente al iniciar después de realizar los siguientes pasos, consulte Cuando inicio la instancia con volúmenes cifrados adjuntos, la instancia se detiene inmediatamente con el error «error del cliente al iniciar».
Obtenga los ID de las instancias de EC2 que desee detener e iniciar. A continuación, siga estos pasos.
Cree una política y un rol de ejecución de IAM para la función Lambda
1. Cree una política de IAM mediante el editor de políticas JSON. Copie y pegue el siguiente documento de la política JSON en el editor de políticas:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "ec2:Start*", "ec2:Stop*" ], "Resource": "*" } ] }
2. Cree un rol de IAM para Lambda.
Importante: Al adjuntar a Lambda una política de permisos, asegúrese de elegir la política de IAM que haya acabado de crear.
Cree funciones de Lambda que detengan e inicien sus instancias de EC2
1. Abra la consola de Lambda y, a continuación, seleccione Crear función.
2. Seleccione Crear desde el principio.
3. En Información básica, añada la siguiente información:
En Nombre de la función, introduzca un nombre que la identifique como la función que se utiliza para detener las instancias de EC2. Por ejemplo, «StopEC2Instances».
En Versión ejecutable, seleccione Python 3.9.
En Permisos, expanda Cambiar el rol de ejecución predeterminado.
En Rol de ejecución seleccione Utilizar el rol existente.
En Rol existente, seleccione el rol de IAM que haya creado.
4. Seleccione Crear función.
5. En Código, Código fuente, copie y pegue el siguiente código en el panel de editor de códigos: (**lambda\ ** _function). Este código detiene las instancias de EC2 que se identifiquen.
Ejemplo de código de función para detener instancias de EC2
import boto3 region = 'us-west-1' instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.stop_instances(InstanceIds=instances) print('stopped your instances: ' + str(instances))
Importante: En región, sustituya «us-west-1» por la región de AWS en la que se encuentren las instancias. En instancias, sustituya los ID de instancia de EC2 de ejemplo por los ID de las instancias específicas que desee detener e iniciar.
6. Seleccione Implementar.
7. En la pestaña Configuración, seleccione Configuración general y Editar. Configure el Tiempo de espera en 10 segundos y, a continuación, seleccione Guardar.
Nota: Configure los ajustes de la función Lambda si es necesario para su caso de uso. Por ejemplo, para detener e iniciar varias instancias se puede utilizar un valor diferente en Tiempo de espera y Memoria.
8. Para crear otra función, repita los pasos 1 a 7. Para que esta función inicie sus instancias de EC2, realice los siguientes pasos de forma diferente:
En el paso 3, introduzca un Nombre de función diferente del que utilizó anteriormente. Por ejemplo, "StartEC2Instances".
En el paso 5, copie y pegue el siguiente código en el panel editor de códigos: (**lambda\ ** _function).
Ejemplo de código de función para iniciar instancias de EC2
import boto3 region = 'us-west-1' instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.start_instances(InstanceIds=instances) print('started your instances: ' + str(instances))
**Importante:**En región e instancias utilice los mismos valores que utilizó en el código para detener las instancias de EC2.
Pruebe las funciones de Lambda
1. Abra la Consola de Lambda y, a continuación, seleccione Funciones.
2. Seleccione una de las funciones que haya creado.
3. Seleccione la pestaña Código.
4. En la sección Código fuente, seleccione Probar.
5. En el cuadro de diálogo Configurar evento de prueba, seleccione Crear nuevo evento de prueba.
6. Introduzca el Nombre del evento. A continuación, seleccione Crear.
Nota: No cambie el código JSON del evento de prueba. La función no lo utiliza.
7. Para ejecutar la función, seleccione Probar.
8. Repita los pasos 1 a 7 con la otra función que haya creado.
Compruebe el estado de las instancias de EC2
Consola de gestión de AWS
Para confirmar que las funciones operen según lo previsto, se puede comprobar el estado de sus instancias de EC2 antes y después de realizar las pruebas.
AWS CloudTrail
Se puede utilizar CloudTrail para comprobar si hay eventos y confirmar que la función de Lambda haya detenido o iniciado la instancia de EC2.
1. Abra la consola de CloudTrail.
2. En el panel de navegación, seleccione Historial de eventos.
3. Seleccione la lista desplegable Atributos de búsqueda y, a continuación, seleccione el Nombre del evento.
4. Para revisar los resultados, escriba StopInstances (Detener instancias) en la barra de búsqueda.
5. Para revisar los resultados, escriba StartInstances (Iniciar instancias) en la barra de búsqueda.
Si no hay resultados, la función de Lambda no habrá detenido ni iniciado las instancias de EC2.
Crear reglas de EventBridge que ejecuten las funciones de Lambda
1. Abra la consola de EventBridge.
2. Seleccione Crear regla.
3. Introduzca el Nombre de su regla, por ejemplo, «StopEC2Instances» (Detener instancias de EC2). (Opcional) En Descripción, introduzca la descripción de la regla.
4. En Tipo de regla, seleccione Programar y, a continuación, seleccione Continuar en EventBridge Scheduler.
5. En «Patrón de la programación», seleccione Programación recurrente. Siga uno de estos pasos:
En Patrón de programación, en Repetición, seleccione Programación recurrente. A continuación, siga uno de estos pasos:
Si el Tipo de programación es Programación por frecuencia (rates), en Frecuencia de expresión, introduzca el valor de la frecuencia y seleccione un intervalo de tiempo en minutos, horas o días.
Si el Tipo de programación es Programación por cron, en Expresión cron introduzca una expresión que indique a Lambda cuándo detener la instancia. Para obtener información sobre la sintaxis de las expresiones, consulte Programar las expresiones de las reglas.
Nota: Las expresiones cron se evalúan en UTC. Asegúrese de adaptar la expresión a la zona horaria de preferencia.
6. En Seleccionar objetivos, seleccione Función Lambda en la lista desplegable Destino.
7. En Función seleccione la función que detenga las instancias de EC2.
8. Seleccione Omitir para revisar y crear y, a continuación, seleccione Crear.
9. Para crear una regla que permita iniciar las instancias de EC2, repita los pasos 1 a 8. Siga estos pasos de forma diferente:
Introduzca el nombre de la regla, por ejemplo, «StartEC2Instances» (Iniciar instancias de EC2).
(Opcional) En Descripción, introduzca la descripción de la regla, como «Iniciar las instancias de EC2 todas las mañanas a las 7 de la mañana».
En el paso 5, en Expresión cron introduzca una expresión que indique a Lambda cuándo iniciar las instancias.
En el paso 7, en Función seleccione la función que inicie las instancias de EC2.
Información relacionada
Tutorial: Programar funciones de Lambda con EventBridge
Eventos de los servicios de AWS
Añadir acciones de detención a las alarmas de Amazon CloudWatch
Vídeos relacionados

Contenido relevante
- OFICIAL DE AWSActualizada hace 3 meses
- OFICIAL DE AWSActualizada hace 4 meses
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace un año