Saltar al contenido

¿Cómo utilizo el Programador de EventBridge para detener e iniciar instancias de Amazon EC2 a intervalos regulares?

6 minutos de lectura
0

Quiero usar el Programador de Amazon EventBridge para detener e iniciar automáticamente mis instancias de Amazon Elastic Compute Cloud (Amazon EC2).

Descripción breve

Para detener e iniciar automáticamente las instancias de EC2, utiliza el programador de EventBridge para llamar directamente a las API StartInstances y StopInstances de Amazon EC2. Alternativamente, puedes usar el programador para invocar una función de AWS Lambda para detener e iniciar las instancias. Se recomienda utilizar las API de Amazon EC2 como objetivo del programador para evitar la necesidad de crear funciones de Lambda adicionales.

Para una solución más avanzada, utiliza el programador de instancias en AWS.

Resolución

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

Uso del programador para llamar directamente a las API de Amazon EC2

Cómo crear una política y un rol de IAM para el Programador de EventBridge

Sigue estos pasos:

  1. Utiliza el editor de políticas de JSON para crear una política de AWS Identity and Access Management (IAM) que permita al Programador de EventBridge detener e iniciar la instancia.
    Ejemplo de política:
    {    
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:Start*",
                    "ec2:Stop*"
                ],
                "Resource": "*"
            }
        ]
    }
    Nota: Si usas un volumen de Amazon Elastic Block Store (Amazon EBS) cifrado con una clave de AWS Key Management Service (AWS KMS) administrada por el cliente, añade kms:CreateGrant a la política. Si la función de Lambda no tiene acceso a la clave de cifrado, solo podrás detener la instancia, pero no reiniciarla. Para obtener más información, consulta Política de claves de AWS KMS obligatorias para su uso con volúmenes cifrados.
  2. Abre la consola de IAM.
  3. Selecciona Roles y, a continuación, Crear rol.
  4. En Tipo de entidad de confianza, selecciona Política de confianza personalizada.
  5. Introduce la siguiente política de IAM:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "scheduler.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": "AWS_ACCOUNT_ID"
                    }
                }
            }
        ]
    }
    Nota: Sustituye AWS_ACCOUNT_ID por el ID de tu cuenta de AWS.
  6. Selecciona Siguiente.
  7. En Políticas de permisos, selecciona la política de IAM que creaste en el paso 1.
  8. En Nombre de rol, introduce un nombre como EventBridge_Scheduler_Role.
  9. Selecciona Crear rol.

Cómo crear la programación con el programador de EventBridge

Crea una programación para la API StopInstances y otra para la API StartInstances. Configura los siguientes ajustes al crear la programación:

  • En Target API (API de destino), selecciona All APIs (Todas las API) y, a continuación, busca Amazon EC2.
  • Selecciona StopInstances o StartInstances y, a continuación, introduce los ID de instancia.
  • En Settings - optional (Configuración [opcional]), en Permisos, elige Seleccionar un rol existente y, a continuación, selecciona el rol de IAM que creaste.

Uso del programador para invocar funciones de Lambda

Cómo crear 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 que permita a Lambda detener e iniciar la instancia.
    Ejemplo de política:
    {    "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": "*"
            }
        ]
    }
    Nota: Si utilizas un volumen de Amazon EBS cifrado con una clave de AWS KMS administrada por el cliente, añade kms:CreateGrant a la política. Si la función de Lambda no tiene acceso a la clave de cifrado, solo podrás detener la instancia, pero no reiniciarla. Para obtener más información, consulta Política de claves de AWS KMS obligatorias para su uso con volúmenes cifrados.
  2. Crea un rol de IAM para Lambda.
  3. Asocia la política de IAM al rol de IAM.

Cómo crear funciones de Lambda que detengan e inicien las instancias

Sigue estos pasos:

  1. Abre la consola de Lambda.
  2. Selecciona Crear función y, a continuación, selecciona Crear desde cero.
  3. En Información básica, configura los siguientes ajustes:
    En Nombre de función, introduce un nombre que describa la función, como StopEC2Instances o StartEC2Instances.
    En Versión ejecutable, selecciona Python 3.14.
    En Permisos, expande Cambiar el rol de ejecución predeterminado.
    En Rol de ejecución, selecciona Uso de un rol existente.
    En Rol existente, selecciona el rol de IAM que hayas creado.
  4. Selecciona Crear función.
  5. Selecciona la pestaña Código y, a continuación, selecciona la pestaña lambda_funciton.py.
  6. En Código fuente, introduce el siguiente código en el editor de código para configurar la parada de instancia:
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        ec2.stop_instances(InstanceIds=instances)
        print('stopped your instances: ' + str(instances))
    Para configurar el inicio de la instancia, introduce el siguiente código en el editor de código:
    import boto3  
    region = 'us-west-1'
    instances = ['i-12345acdb12345abcd', 'i-12345acdb12345abcd']
    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 de las instancias e i-12345acdb12345abcd por los ID de las instancias.
  7. Selecciona Desplegar.
  8. Selecciona la pestaña Configuración y, luego, Configuración general.
  9. Selecciona Editar.
  10. En Tiempo de espera, selecciona 10 segundos y, a continuación, selecciona Guardar.

Nota: Si has asociado la función a Amazon Virtual Private Cloud (Amazon VPC), valida que la función pueda acceder al punto de enlace de Amazon EC2 a través de Internet. Alternativamente, configura un punto de enlace de la nube virtual privada (VPC) para Amazon EC2.

Cómo probar las funciones de Lambda

Prueba las funciones de Lambda para detener e iniciar instancias.

Antes y después de ejecutar la prueba, comprueba el estado de tus instancias para confirmar que las funciones se ejecutan correctamente.

Para 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.
    Nota: Si no hay resultados, entonces la función de Lambda no habrá detenido ni iniciado las instancias.

**Crea una programación con el programador de EventBridge para ejecutar las funciones de Lambda **

Crea una programación para ejecutar las funciones de Lambda. En Select target (Seleccionar objetivo), selecciona Templated targets (Objetivos con plantilla) y, a continuación, selecciona AWS Lambda Invoke (Invocar AWS Lambda). Utiliza las funciones de Lambda que has creado.