EC2: detenerlo con Python y Lambda

ec2

Configure Python y Lambda para detener automáticamente EC2 en un horario

EC2 — Nuestro escenario:

Nuestro equipo de ingeniería de DevOps suele utilizar un laboratorio de desarrollo para probar las versiones de nuestra aplicación. Los gerentes se quejan del costo creciente de nuestro laboratorio de desarrollo y necesitan ahorrar dinero deteniendo nuestras 3 instancias EC2 después de que todos los ingenieros hayan terminado.

Use su secuencia de comandos en una función de Lambda con el tiempo de ejecución de Python 3.9. Asegúrese de que la lambda se ejecute en un horario establecido todos los días. Nadie debería estar trabajando en el entorno de desarrollo después de las 9:00 p. m.

¡Empecemos!


1 | Lanzar tres instancias de AWS EC2 con Python

Para comenzar, lanzaremos tres instancias EC2 con el siguiente código de Python:

import boto3
client = boto3.client('ec2')
resp=client.run_instances(ImageId='ami-0cff7528ff583bf9a',
        InstanceType='t2.micro',
        MinCount=3,
        MaxCount=3,
        KeyName= 'LUIT_Project14',
        TagSpecifications=[
            {
                'ResourceType': 'instance',
                'Tags': [{'Key': 'Name','Value': 'Linux Server'},
                {'Key': 'Env','Value': 'Dev'}]
                          },
                      ],
                      )
for i in resp['Instances']:
    print("Instance ID Created is :{} Instance Type Created is : {}" .format(i['InstanceId'],i['InstanceType']))

Como puede ver en ambas imágenes, hemos lanzado con éxito tres instancias EC2 de Linux.


2 | Crear nueva política de IAM y adjuntar al rol para la función Lambda

Navegue a IAM y cree un nuevo rol para nuestra función Lambda:

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Sid": "VisualEditor0",
   "Effect": "Allow",
   "Action": [
     "ec2:DescribeInstances",
     "ec2:StartInstances",
     "ec2:DescribeTags",
     "logs:*",
     "ec2:DescribeInstanceTypes",
     "ec2:StopInstances",
     "ec2:DescribeInstanceStatus"
   ],
   "Resource": "*"
  }
 ]
}

  • Adjunte la política que acabamos de crear a su nuevo rol:

Ahora que se han creado nuestra política y nuestros roles, podemos pasar al siguiente paso.


3 | Cree la función Lambda para detener las instancias EC2 en función de las etiquetas

El tercer paso en este proyecto será crear nuestra función Lambda. También asignaremos el rol que creamos en el paso anterior para que nuestra función pueda iniciar y detener nuestras instancias según sea necesario.

  • Navegue a la consola de Lambda y haga clic en Crear función:

EC2

  • Escriba el siguiente código en Lambda Code Editor:
import json
import boto3

ec2 = boto3.resource('ec2', region_name='us-east-1')

def lambda_handler(event, context):
    instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']},{'Name': 'tag:Env','Values':['Dev']}])
    for instance in instances:
        id=instance.id
        ec2.instances.filter(InstanceIds=[id]).stop()
        print("Instance ID is stopped"+instance.id)

    return "success"

EC2


4 | Crear EventBridge para Lambda para detener instancias

¡Este es nuestro paso final! Aquí, crearemos una regla de EventBridge que active nuestras instancias EC2 para que se detengan según la hora del día que especifiquemos.

EC2

  • Defina un horario. Para nuestro escenario, nadie debería estar trabajando en el entorno de desarrollo después de las 9:00 p. m. y todas las instancias deberían detenerse a las 9:00 p. m.

EC2

  • Seleccione la función Lambda como destino, luego seleccione la función Lambda que creamos anteriormente para detener la instancia EC2. Haga clic en Crear.

EC2

Ejecutamos nuestro código y ahora esperaremos hasta las 9:00 p. m. para ver si las instancias se detienen cuando configuramos el disparador.

EC2

Como puede ver en la imagen de arriba, la función Lambda fue exitosa y detuvo las instancias a las 9 p. m. en punto.


Felicitaciones, acaba de usar Python y Lambda para detener automáticamente las instancias EC2.

Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Laravel:

Recent Post