Al usar AWS re:Post, aceptas las AWS re:Post Términos de uso

¿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

Utiliza 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, usa Instance Scheduler en AWS. Para obtener más información, consulta Automate starting and stopping AWS instances (Automatización del 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, sigue estos pasos:

  1. Crea una política de AWS Identity and Access Management (IAM) y un rol de IAM personalizados para tu función de Lambda.
  2. Crea funciones de Lambda que detengan e inicien tus instancias de EC2.
  3. Prueba tus funciones de Lambda.
  4. Crea 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, consulta Required AWS KMS key policy for use with encrypted volumes (Política de claves de AWS KMS obligatorias para su uso con volúmenes cifrados).

Resolución

Requisito previo: Obtén los ID de las instancias de EC2 que desees detener e iniciar.

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

Sigue estos pasos:

  1. Usa el editor de políticas JSON para crear una política de IAM. Introduce 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. Crea un rol de IAM para Lambda.

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

Nota: Si utilizas un volumen de Amazon Elastic Block Store (Amazon EBS), es posible que necesites 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, añade kms:CreateGrant a la política de IAM.

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

Sigue estos pasos:

  1. Abre la consola de Lambda y, a continuación, selecciona Crear una función.

  2. Selecciona Autor desde cero.

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

  4. Selecciona Crear función.

  5. Selecciona la pestaña Código.

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

    import boto3region = '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, introduce el siguiente código en el editor de código:

    import boto3region = '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: Sustituye 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 deseas detener e iniciar.

  7. Selecciona Desplegar.

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

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

Prueba tus funciones de Lambda

Sigue estos pasos:

  1. Abre la consola de Lambda y, a continuación, selecciona Funciones.
  2. Selecciona una de las funciones.
  3. Selecciona la pestaña Código.
  4. En la sección Código fuente, selecciona Probar.
  5. En el cuadro de diálogo Configurar un evento de prueba, selecciona Crear un evento de prueba nuevo.
  6. Introduce un nombre de evento y, a continuación, selecciona Crear.
    Nota: No cambies el código JSON para el evento de prueba.
  7. Para ejecutar la función, selecciona Probar.
  8. Repite los pasos 1 a 7 para la otra función.

Comprueba el estado de tus instancias

Consola de Amazon EC2

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

CloudTrail

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

Sigue estos pasos:

  1. Abre la consola de CloudTrail.
  2. En el panel de navegación, selecciona Historial de eventos.
  3. En la lista desplegable Atributos de búsqueda, selecciona Nombre del evento.
  4. En la barra de búsqueda, escribe StopInstances para revisar los resultados. A continuación, introduce 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

Sigue estos pasos:

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

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

Información relacionada

Tutorial: Create an EventBridge scheduled rule for AWS Lambda functions (Tutorial: Creación de una regla programada de EventBridge para las funciones de AWS Lambda)

Events from AWS services in EventBridge (Eventos de los servicios de AWS en EventBridge)

Opciones de facturación y compra de Amazon EC2

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un mes