EC2: detenerlo con Python y Lambda

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

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!

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


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:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]