Saltar al contenido

¿Cómo puedo utilizar Lambda para detener e iniciar las instancias de Amazon EC2 a intervalos regulares?

6 minutos de lectura
0

Quiero detener e iniciar automáticamente mis instancias de Amazon Elastic Compute Cloud (Amazon EC2) para reducir mi uso de Amazon EC2.

Descripción breve

Utilice AWS Lambda y Amazon EventBridge para detener e iniciar automáticamente las instancias de EC2.

Nota: La siguiente resolución es un ejemplo de solución simple. Para una solución más avanzada, use Instance Scheduler en AWS. Para obtener más información, consulte Automatizar el inicio y la detención de instancias de AWS.

Para usar Lambda con el fin de detener e iniciar instancias de EC2 a intervalos regulares, complete los siguientes pasos:

  1. Cree una política de AWS Identity and Access Management (IAM) y un rol de IAM personalizados para su función de Lambda.
  2. Cree funciones de Lambda que detengan e inicien sus instancias de EC2.
  3. Pruebe sus funciones de Lambda.
  4. Cree programaciones de EventBridge que ejecuten la función siguiendo un horario.

A veces, una función de Lambda detiene una instancia y no puede volver a iniciarla. Esto ocurre cuando un volumen de Amazon Elastic Block Store (Amazon EBS) está cifrado y el rol de Lambda no está autorizado a usar la clave de cifrado. Para obtener más información, consulte Política de claves de AWS KMS obligatorias para su uso con volúmenes cifrados.

Resolución

Requisito previo: Obtenga los ID de las instancias de EC2 que desee detener e iniciar.

Creación de una política y un rol de IAM para la función de Lambda

Siga estos pasos:

  1. Use el editor de políticas JSON para crear una política de IAM. Introduzca 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.

  3. Asocie la política de IAM al rol de IAM.

Nota: Si utiliza un volumen de Amazon Elastic Block Store (Amazon EBS), es posible que necesite una configuración adicional. Si el volumen de Amazon EBS está cifrado con una clave de AWS Key Management Service (AWS KMS) administrada por el cliente, agregue kms:CreateGrant a la política de IAM.

Creación de funciones de Lambda que detengan e inicien las instancias

Siga estos pasos:

  1. Abra la consola de Lambda y, a continuación, seleccione Crear una función.

  2. Seleccione Autor desde cero.

  3. Bajo Información básica, introduzca la siguiente información:
    En Nombre de la función, introduzca un nombre que describa la función, como StopEC2Instances o StartEC2Instances.
    En Tiempo de ejecución, seleccione Python 3.9.
    Para Permisos, expanda Cambiar el rol de ejecución predeterminado.
    Bajo Rol de ejecución, seleccione Uso de un rol existente.
    Bajo Rol existente, elija el rol de IAM.

  4. Seleccione Crear función.

  5. Seleccione la pestaña Código.

  6. En la pestaña lambda_funciton.py de Código fuente, introduzca el siguiente código en el editor de código en stop_instances:

    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))

    En start_instances, introduzca el siguiente código en el editor de código:

    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))

    Nota: Sustituya us-west-1 por la región de AWS en la que se encuentran las instancias e instanceIds por los ID de las instancias que desea detener e iniciar.

  7. Seleccione Desplegar.

  8. En la pestaña Configuración, seleccione Configuración general y, a continuación, seleccione Editar.

  9. Configure el Tiempo de espera en 10 segundos y, a continuación, seleccione Guardar.

Pruebe sus funciones de Lambda

Siga estos pasos:

  1. Abra la consola de Lambda y, a continuación, seleccione Funciones.
  2. Seleccione una de las funciones.
  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 un evento de prueba, seleccione Crear un evento de prueba nuevo.
  6. Introduzca un nombre de evento y, a continuación, seleccione Crear.
    Nota: No cambie el código JSON para el evento de prueba.
  7. Para ejecutar la función, seleccione Probar.
  8. Repita los pasos 1 a 7 para la otra función.

Compruebe el estado de sus instancias

Consola de Amazon EC2

Antes y después de realizar la prueba, compruebe el estado de sus instancias para confirmar que sus funciones trabajan.

CloudTrail

También puede usar AWS CloudTrail para confirmar que la función de Lambda ha detenido o iniciado la instancia.

Siga estos pasos:

  1. Abra la consola de CloudTrail.
  2. En el panel de navegación, seleccione Historial de eventos.
  3. En la lista desplegable Atributos de búsqueda, seleccione Nombre del evento.
  4. En la barra de búsqueda, escriba StopInstances para revisar los resultados. A continuación, introduzca StartInstances.

Si no hay resultados, entonces la función de Lambda no habrá detenido ni iniciado las instancias.

Creación de reglas de EventBridge que ejecuten las funciones de Lambda

Siga estos pasos:

  1. Abra la consola de EventBridge.
  2. Seleccione Crear regla.
  3. Introduzca un nombre para su regla, como, StopEC2Instances o StartEC2Instances.
  4. (Opcional) En Descripción, introduzca una descripción de la regla.
  5. En Tipo de regla, seleccione Programar y, a continuación, seleccione Continuar en el Programador de EventBridge.
  6. En Patrón de programación, en Ocasión, seleccione Programación periódica.
  7. En Tipo de programación, seleccione Programación basada en frecuencia o Programación basada en cron y, a continuación, realice uno de los siguientes pasos:
    En Programación basada en frecuencia, introduzca un valor de frecuencia y, a continuación, seleccione un intervalo de tiempo en minutos, horas o días.
    Alternativa:
    En Programación basada en cron, introduzca una expresión que indique a Lambda cuándo debe detener la instancia.
    Nota: Las expresiones Cron se evalúan en UTC. Asegúrese de adaptar la expresión para su zona horaria.
  8. En la página Seleccionar destinos, seleccione Función de Lambda en la lista desplegable Destino.
  9. En Función, seleccione la función que detiene o inicia las instancias.
  10. Seleccione Saltar a Revisar y crear y, a continuación, elija Crear.

Nota: También puede crear reglas que reaccionen a los eventos en su cuenta de AWS.

Información relacionada

Tutorial: Creación de una regla programada de EventBridge para las funciones de AWS Lambda

Eventos de los servicios de AWS

Opciones de facturación y compra de Amazon EC2

OFICIAL DE AWSActualizada hace un año