Saltar al contenido

Cómo iniciar y detener la instancia de AWS EC2 según una programación basada en el tiempo

Solución:

Solución 1:

Actualizar

AWS ha lanzado una herramienta llamada “Programador de instancias”, que incluye una guía de configuración completa que está vinculada desde esa página. Parece ser una mejora del Programador de EC2 que describo a continuación, con algunas características más, pero es esencialmente lo mismo.

La siguiente guía seguirá funcionando, pero probablemente sea mejor mirar el programador de instancias para nuevas instalaciones.

Publicación original

AWS tiene una herramienta llamada EC2 Scheduler que le brinda un control muy flexible sobre el inicio y la detención de instancias EC2.

La herramienta le permite definir horas de inicio y finalización predeterminadas cuando configura la herramienta, que puede cambiar más tarde. Puede elegir qué instancias se controlan, usted y puede especificar diferentes horas de inicio y finalización para cada instancia mediante etiquetas.

Si bien es una gran herramienta, la documentación es algo vaga y confusa. Es como si la documentación hubiera sido escrita por un ingeniero que escribió la herramienta y supiera todo sobre ella, en lugar de un escritor técnico.

Nota : si tiene comentarios o correcciones, se agradecen los comentarios. Si tiene una pregunta basada en esto, inicie su propia pregunta.

¿Qué es EC2 Scheduler?

Esta herramienta es una función Lambda que funciona con Cloudwatch Events y DynamoDB. Se implementa mediante una plantilla de Cloudformation, que también configura los roles y políticas de IAM necesarios. Puedes leer sobre la arquitectura aquí.

Arquitectura del planificador de AWS EC2

Despliegue

Empiece por ir a esta página y hacer clic en “lanzar solución”. En este momento, el enlace directo está aquí, pero podría cambiar.

Seleccione la región en la que desea implementar los recursos en la parte superior de la consola. El script controla las instancias EC2 en cualquier región, pero se ejecuta en una región.

Etiquetado de instancias EC2

Esto está cubierto en la documentación aquí, pero no es tan simple como podría ser.

Usted controla qué instancias se inician y se detienen al etiquetar sus instancias.

El caso más simple requiere que etiquete cada instancia EC2 que desee que se inicie y se detenga de acuerdo con la programación. Para hacer esto, busque su instancia EC2 en la consola, haga clic en etiquetas y cree esta etiqueta

Etiquetado de instancias EC2 para Scheduler

Para habilitar copiar y pegar:

  • Clave: planificador: ec2-startstop
  • Valor: verdadero

Si desea que una instancia específica se inicie y se detenga en un horario diferente, agregue información adicional a la clave y el valor de la etiqueta. Por ejemplo, si desea que una instancia comience a las 1500 UTC y se detenga a las 2400 UTC los martes, jueves y viernes, ingrese lo siguiente.

Clave: planificador: ec2-startstop: late Valor: 1500; 2400; utc; tue, thu, fri

Tenga en cuenta que la palabra “tarde” puede ser cualquier cadena, “tarde” no tiene un significado especial.

Puede convertir UTC a su hora local utilizando esta herramienta.

Puede utilizar el editor de etiquetas para etiquetar instancias de forma masiva. Eso podría permitirle configurar más fácilmente el etiquetado masivo, lo que podría ser útil para tener diferentes configuraciones para desarrollo, prueba y producción. Sin embargo, dudo que uses esto en producción.

Parámetros de CloudFormation

Cuando ejecuta la plantilla de CloudFormation, debe ingresar muchos parámetros. La mayoría se puede dejar por defecto. Estos son algunos de los parámetros más importantes.

  • Nombre de la pila: llámelo como quiera. Es como se llama en CloudFormation.
  • Nombre de etiqueta personalizada: esta es la “clave” de la etiqueta que colocó en la instancia EC2. Déjelo en el valor predeterminado a menos que tenga una buena razón o necesite varias instalaciones.
  • Hora de inicio / parada predeterminada: hora UTC predeterminada para iniciar y detener las instancias
  • DynamoDB: la configuración se almacena en DynamoDB. Puede cambiar el nombre de la tabla y demás. Debido a que el nivel gratuito de DynamoDB no caduca, es poco probable que se cobre a la mayoría de las personas.
  • (segunda pantalla) Permisos: esto es una pista falsa, consulte la sección a continuación. Déjelo como predeterminado y ejecútelo como administrador cuando intente configurar EC2 Scheduler.
  • Opciones de notificación: me resultó útil configurar notificaciones SNS para poder validar que funcionaba. No he pasado el tiempo para averiguar cómo deshabilitarlos, simplemente lo eliminé y volví a ejecutar la plantilla de Cloudformation para reinstalarlos.

Permisos, políticas y roles

La sección Permisos / rol de IAM de la plantilla de CloudFormation es una pista falsa, es decir, es en gran medida irrelevante. Especifica solo el rol usado para ejecutar el script de CloudFormation, no hace ninguna diferencia en los recursos creados o el rol usado cuando se ejecuta la función lambda. En retrospectiva, esto es obvio, pero no lo era para mí cuando comencé.

Independientemente de la función que ejecute esta secuencia de comandos, la misma función y los permisos en línea se crean dentro de IAM. La función Lambda se ejecuta utilizando un “rol de programador ec2” que crea el script.

He incluido mis políticas a continuación en caso de que sean útiles para alguien.

Eventos y métricas de CloudWatch

Si desea ver los registros de su función Lambda, vaya a Eventos de Cloudwatch. La tala es bastante buena. También hay métricas, por lo que puede ver cuándo se ejecuta, el tiempo de ejecución, etc.

Adicional

El código de la función lambda está disponible en Github.

Políticas

Por lo general, estos no son necesarios, pero podrían ser para alguien, así que los incluiré.

Política para el rol de IAM


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        ,
        
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        ,
        
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        
    ]

Política de confianza para el rol de IAM


  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Principal": 
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      ,
      "Action": "sts:AssumeRole"
    
  ]

Solucion 2:

Si solo desea iniciar y detener instancias, aquí hay otra versión de esto que también hace uso del servicio Lambda. Asume que desea controlar una identificación de instancia específica. Puede controlar varias instancias agregando más ID separados por una coma. (por ejemplo: ‘i-3453453’, ‘i-45656745’). Puede encontrar el ID de su instancia en la sección Instancias de la consola de AWS.

En la consola Lambda

  1. Abra la consola de AWS Lambda y elija la función Crear.
  2. Elija Autor desde cero.
  3. Introduzca un nombre para su función, como “StopEC2Instances”.
  4. Para Runtime, seleccione Python 2.7
  5. Expanda el menú desplegable Rol y elija Crear un rol personalizado. Esto abre una nueva pestaña o ventana en su navegador.
  6. En el menú desplegable Función de IAM, seleccione Crear una nueva función de IAM e ingrese un Nombre de función, como “lambda_start_stop_ec2”.
  7. Elija Ver documento de política, Editar y luego elija Aceptar cuando se le solicite leer la documentación. Reemplace todo el texto de la política con esto:

Código a continuación


  "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": "*"
    
  ]

  1. Elija Permitir para terminar de crear el rol y regresar a la consola de AWS Lambda.
  2. Para detener sus instancias, reemplace todo el texto en el editor de código de función con lo siguiente:

Código a continuación

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

Recuerde reemplazar los valores de región e instancia por los suyos.

  1. En el menú desplegable Runtime, elija Python2.7.
  2. En Configuración básica, ingrese 10 segundos para la función Tiempo de espera.
  3. Elija Guardar.
  4. Repita todos los pasos para crear otra función que iniciará sus instancias, pero luego use este script de Python para iniciarlo todo:

Código a continuación

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

Programar las funciones

Aquí creará un evento de CloudWatch que activará su función Lambda por la noche

  1. Abra la consola de Amazon CloudWatch.
  2. Elija Eventos y luego elija Crear regla.
  3. Elija Programación en Origen del evento.
  4. Ingrese un intervalo de tiempo o una expresión cron que le indique a Lambda cuándo detener sus instancias. Para obtener más información sobre la sintaxis correcta, consulte Sintaxis de expresión de programación para reglas.

Nota: Las expresiones Cron se evalúan en UTC. Asegúrese de ajustar la expresión para su zona horaria preferida. Aquí hay un ejemplo que ejecutará la función todos los días a las 08:00 GMT / UTC):

0 08 * * ? *
  1. Elija Agregar destino y luego elija la función Lambda.
  2. En Función, elija la función Lambda que detiene sus instancias.
  3. Elija Configurar detalles.
  4. Ingrese la siguiente información en los campos provistos: En Nombre, ingrese un nombre significativo, como “StopEC2Instances”. En Descripción, agregue una descripción significativa, como “detiene las instancias EC2 todos los días por la noche”. En Estado, seleccione Activado.
  5. Elija Crear regla.

Para reiniciar sus instancias por la mañana, repita estos pasos y use su hora de inicio preferida. Si desea enviar un mensaje de correo cuando las funciones fallan, puede configurar un tema SNS y configurar el envío de ese mensaje en Depuración en la Ventana de creación de funciones Lmbda.

La fuente de todo esto se puede encontrar aquí: documentación de AWS

Te mostramos comentarios y puntuaciones

Eres capaz de respaldar nuestro trabajo dejando un comentario y dejando una puntuación te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *