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

Última actualización: 13-01-2022

Quiero reducir el uso de Amazon Elastic Compute Cloud (EC2) al detener e iniciar mis instancias de EC2 de forma automática. ¿Cómo puedo utilizar AWS Lambda y Amazon EventBridge para hacerlo?

Descripción breve

Nota: Este ejemplo de configuración es una solución sencilla. Para obtener una solución más sólida, utilice AWS Instance Scheduler. Para obtener más información, consulte ¿Cómo detengo e inicio instancias con AWS Instance Scheduler?

Para detener e iniciar instancias de EC2 en intervalos regulares con Lambda, realice lo siguiente:

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 desencadenen la función en un horario.
Nota: también puede crear reglas que se desencadenen en un evento que suceda en su cuenta de AWS.

Resolución

Nota: Si recibe un Error de cliente en el lanzamiento después de completar el siguiente procedimiento, 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, haga lo siguiente:

Cree una política de IAM y un rol de ejecución para su función 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 Lambda que detengan e inicien sus instancias de EC2

1.    En la consola de AWS Lambda, elija Create function (Crear una función).

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

3.    En Basic information (Información básica), agregue lo siguiente:
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 del editor de código (lambda_function). Este código detendrá las instancias de EC2 que identifique.

Código de función de ejemplo: 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 seleccione Save (Guardar).

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

8.    Repita los pasos del 1 al 7 para crear otra función. Haga lo siguiente 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, “ComenzarInstanciasDeEC2”.
En el paso 5, copie y pegue el siguiente código en el panel del editor del editor de código (lambda_function):

Código de función de ejemplo: 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 Lambda

1.    En la consola de AWS Lambda, elija Functions (Funciones).

2.    Elija una de las funciones que haya creado.

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

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

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 es necesario cambiar el código de JSON para el evento de prueba; la función no lo usa.

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

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

Consejo: 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.

Cree reglas de EventBridge que desencadenen las funciones Lambda

1.    Abra la consola de EventBridge.

2.    Seleccione Create rule (Crear regla).

3.    Ingrese un Name (Nombre) para la regla, como “DetenerInstanciasDeEC2”. Si lo desea, puede ingresar una Description (Descripción).

4.    En Define pattern (Definir patrón), seleccione Schedule (Programar).

5.    Realice una de las siguientes acciones:

En Fixed rate of (Tasa fija de), ingrese un intervalo de tiempo en minutos, horas o días.
Para la Cron expression (Expresión cron), ingrese una expresión que le indique a Lambda cuándo debe detener las instancias. Para obtener información sobre la sintaxis de las expresiones, consulte Cómo 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 Lambda) en el menú desplegable Target (Destino).

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

8.    Desplácese hacia abajo y seleccione Create (Crear).

9.    Repita los pasos del 1 al 8 a fin de crear una regla para iniciar sus instancias de EC2. Haga lo siguiente de manera diferente:

Ingrese un nombre para la regla, como “IniciarInstanciasDeEC2”.
(Opcional) Introduzca una Description (Descripción), como “Inicia las instancias de EC2 todas las mañanas a las 7:00 a. m.”
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.

(Opcional) Utilice AWS Instance Scheduler para automatizar el procedimiento

Para obtener más información, consulte Cómo automatizar el inicio y la detención de instancias de AWS.