¿Cómo detengo e inicio instancias de Amazon EC2 en intervalos regulares con Lambda?

8 minutos de lectura
0

Quiero reducir el uso de Amazon Elastic Compute Cloud (Amazon EC2) al detener e iniciar mis instancias de EC2 de forma automática.

Descripción breve

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

Nota: La siguiente resolución es una solución sencilla. Para obtener una solución más avanzada, utilice AWS Instance Scheduler. Para obtener más información, consulte Cómo automatizar el inicio y la detención de instancias de AWS.

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

1.    Cree una política y un rol de ejecución de AWS Identity and Access Management (IAM) personalizados para su función Lambda.

2.    Cree funciones Lambda que detengan e inicien sus instancias de EC2.

3.    Pruebe las funciones Lambda.

4.    Cree reglas de EventBridge que ejecuten la función en un horario.
Nota: También puede crear reglas que reaccionen a los eventos que tienen lugar en su cuenta de AWS.

Resolución

Nota: Si recibe un Error de cliente en el lanzamiento después de completar los siguientes pasos, consulte Cuando inicio mi instancia con volúmenes cifrados adjuntos, la instancia se detiene inmediatamente debido al error “error de cliente en el lanzamiento”.

Obtenga los identificadores de las instancias de EC2 que desee detener e iniciar. Luego, siga estos pasos.

Cree una política de IAM y un rol de ejecución para su función de Lambda

1.    Cree una política de IAM mediante el editor de políticas de JSON. Copie y pegue el siguiente documento de política de 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 una política de permisos a Lambda, asegúrese de elegir la política de IAM que acaba de crear.

Crear funciones de Lambda que detengan e inicien sus instancias de EC2

1.    Abra la consola de Lambda y, a continuación, elija Create function (Crear función).

2.    Elija Author from scratch (Crear desde cero).

3.    En Basic information (Información básica), agregue la siguiente información:

En Function name (Nombre de función), ingrese un nombre que la identifique como la función utilizada para detener las instancias de EC2. Por ejemplo, “DetenerInstanciasDeEC2”.
Para Runtime (Tiempo de ejecución), elija Python 3.9.
En Permissions (Permisos), expanda Change default execution role (Cambiar el rol de ejecución predeterminado).
En Execution role (Rol de ejecución), elija Use an existing role (Usar un rol existente).
En Existing role (Rol existente), elija el rol de IAM que haya creado.

4.    Elija Create function (Crear función).

5.    En Code (Código), Code source (Fuente de código), copie y pegue el siguiente código en el panel del editor en el editor de código: ( lambda_function). Este código detendrá las instancias de EC2 que identifique.

Código de función de ejemplo 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 region (región), sustituya “us-west-1” por la región de AWS en la que se encuentren sus instancias. En instances (instancias), sustituya los ID de las instancias de EC2 de ejemplo por los ID de las instancias específicas que desee detener e iniciar.

6.    Elija Deploy (Implementar).

7.    En la pestaña Configuration (Configuración), elija General configuration (Configuración general) y, luego, Edit (Editar). Establezca el Timeout (Tiempo de espera) en 10 segundos y luego elija Save (Guardar).

Nota: Establezca la configuración de la función de Lambda según sea necesario para su caso de uso. Por ejemplo, para detener e iniciar varias instancias, puede utilizar un valor diferente para Timeout (Tiempo de espera) y Memory (Memoria).

8.    Repita los pasos del 1 al 7 para crear otra función. Complete los siguientes pasos de manera diferente para que esta función inicie las instancias de EC2:

En el paso 3, ingrese un Function name (Nombre de función) diferente al que utilizó anteriormente. Por ejemplo, “IniciarInstanciasDeEC2”.
En el paso 5, copie y pegue el siguiente código en el panel del editor en el editor de código: ( lambda_function).

Código de función de ejemplo 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 region (región) e instances (instancias), utilice los mismos valores que utilizó en el código para detener sus instancias de EC2.

Probar las funciones de Lambda

1.    Abra la consola de Lambda y, a continuación, elija Functions (Funciones).

2.    Elija una de las funciones que haya creado.

3.    Elija la pestaña Code (Código).

4.    En la sección Code source (Fuente de código), elija Test (Prueba).

5.    En el cuadro de diálogo Configure test event (Configurar evento de prueba), elija Create new test event (Crear nuevo evento de prueba).

6.    Ingrese un Event name (Nombre de evento). A continuación, elija Create (Crear).

Nota: No cambie el código JSON del evento de prueba. La función no lo utiliza.

7.    Elija Test (Prueba) para ejecutar la función.

8.    Repita los pasos del 1 al 7 para la otra función que haya creado.

Compruebe el estado de sus instancias de EC2

Consola de administración de AWS

Puede comprobar el estado de sus instancias de EC2 antes y después de las pruebas para confirmar que sus funciones se ejecuten como se espera.

AWS CloudTrail

Puede utilizar CloudTrail para comprobar si hay eventos y confirmar que la función de Lambda detuvo o inició la instancia de EC2.

1.    Abra la consola de CloudTrail.

2.    En el panel de navegación, elija Event history (Historial de eventos).

3.    Elija la lista desplegable Lookup attributes (Atributos de búsqueda) y luego, Event name (Nombre del evento).

4.    En la barra de búsqueda, ingrese DetenerInstancias para revisar los resultados.

5.     En la barra de búsqueda, ingrese IniciarInstancias para revisar los resultados.

Si no hay resultados significa que la función de Lambda no detuvo ni inició las instancias de EC2.

Crear reglas de EventBridge que ejecuten las funciones de Lambda

1.    Abra la consola de EventBridge.

2.    Seleccione Create rule (Crear regla).

3.    Ingrese un nombre para la regla, como, por ejemplo, “DetenerInstanciasDeEC2”. (Opcional) Ingrese una descripción para la regla en Description (Descripción).

4.    En Rule type (Tipo de regla), elija Schedule (Programar) y, a continuación, elija Continue in EventBridge Scheduler (Continuar en EventBridge Scheduler).

5.    Para crear un patrón de programación, elija Recurring schedule (Programa recurrente). Complete uno de los pasos siguientes:

En Schedule pattern (Patrón de programación), en Occurrence (Ocurrencia), elija Recurring schedule (Programa recurrente). A continuación, complete uno de los pasos siguientes:
Si el Schedule type (Tipo de programa) es Rate-based schedule (Programa basado en tarifas), en Rate expression (Expresión de tarifas), ingrese un valor de tarifa y elija un intervalo de tiempo en minutos, horas o días.
Si elSchedule type (Tipo de programación) es una Cron-based schedule (Programación basada en cron), en Cron expression (Expresión cron), ingrese una expresión que le indique a Lambda cuándo debe detener la instancia. Para obtener información sobre la sintaxis de las expresiones, consulte Programar expresiones para reglas.
Nota: Las expresiones cron se evalúan en UTC. Asegúrese de ajustar la expresión a su zona horaria preferida.

6.    En Select targets (Seleccionar destinos), elija Lambda function (Función de Lambda) en la lista desplegable Target (Destino).

7.    En Function (Función), elija la función que detiene sus instancias de EC2.

8.    Elija Skip to review and create (Omitir para revisar y crear) y, a continuación, elija Create (Crear).

9.    Repita los pasos del 1 al 8 a fin de crear una regla para iniciar sus instancias de EC2. Complete los siguientes pasos de forma diferente:

Ingrese un nombre para la regla, como “IniciarInstanciasDeEC2”.
(Opcional) En Description (Descripción), ingrese una descripción para la regla, como “Inicia las instancias de EC2 todas las mañanas a las 7:00 h”.
En el paso 5, para la Cron expression (Expresión cron), ingrese una expresión que le indique a Lambda cuándo debe iniciar las instancias.
En el paso 7, para Function (Función), elija la función que inicia las instancias de EC2.


Información relacionada

Tutorial: Cómo programar las funciones de Lambda con EventBridge

Eventos de los servicios de AWS

Agregar acciones de detención a las alarmas de Amazon CloudWatch

Instancias reservadas programadas

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 3 meses