2010-03-09 56 views
84

¿Puedo iniciar y finalizar automáticamente mi instancia de Amazon utilizando la API de Amazon? ¿Puedes describir cómo se puede hacer esto? Lo ideal sería comenzar la instancia y detener la instancia en intervalos de tiempo específicos todos los días.Apagado automático e Iniciar la instancia de Amazon EC2

+2

¿Qué ocurre con los datos de su instancia de EC2 cuando se apaga? ¿Persiste o tienes que reconstruirlo de nuevo? –

+0

Iniciar y terminar automáticamente la instancia utilizando la API de Amazon puede causar pérdidas de datos en ese evento. Recomendaría Stop and Recover Actions con [* AWS CloudWatch Alarms *] (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/UsingAlarmActions.html) – hyip

+0

Istead of Amazon API, sugeriría para [* Programar EC2 Iniciar/Detener usando AWS Lambda *] (http://stackoverflow.com/a/38371889/4058484), en su caso, le cuesta menos de $ 0,0004 USD/mes. – hyip

Respuesta

99

Por si alguien se tropieza con esta vieja pregunta, hoy en día puede lograr lo mismo agregando un horario a un grupo de autoescalamiento: aumente la cantidad de instancias en un grupo de autoescalamiento a 1 en determinados momentos y disminuya volver a 0 después.

Y puesto que esta respuesta está recibiendo una gran cantidad de puntos de vista, pensé para enlazar con una guía muy útil acerca de esto: Running EC2 Instances on a Recurring Schedule with Auto Scaling

+3

Mejor sugerente aquí. –

+5

Probé el método descrito en el enlace, y de hecho inicia/detiene las instancias a las horas especificadas en el tutorial. Sin embargo, me di cuenta en la consola web de AWS que cuando se inicia una instancia con este método, no se inicia con una clave (por ejemplo, puede entrar en ella), y tampoco parece tener las mismas cosas que yo. instalado en mi microinstancia que utilizo como prueba (no soy un experto en la nube, pero creo que esto significa que esta nueva instancia que está activada no está conectada al EBS) ¿Hay alguna manera de iniciar y detener la * misma * instancia en un horario? –

+0

@KiranK. ¿eso significa que la nueva instancia no está adjunta al volumen EBS actualmente utilizado? que usaste? –

16

Le recomiendo que eche un vistazo a EC2 Getting Started Guide, que le muestra cómo hacer lo que necesita con las herramientas de línea de comandos EC2. Puede programar fácilmente esto en un trabajo cron (en Linux/UNIX) o trabajo programado en Windows para llamar a los comandos de inicio y detención en un momento dado.

Si desea hacer esto desde su propio código, puede usar las API de SOAP o REST; vea el Developer Guide para más detalles.

1

Puede consultar Ylastic para hacerlo. La alternativa parece ser tener una máquina ejecutándose que apaga/inicia otras instancias usando un trabajo cron o una tarea programada.

Obviamente, si solo quiere una instancia, esta es una solución costosa, ya que una máquina siempre debe estar ejecutándose, y pagar ~ 80 dólares al mes por una máquina para ejecutar trabajos cron no es rentable.

-8

No puede hacer esto automáticamente, o al menos no sin cierta programación y manipulación de API en los archivos de script. Si desea una solución confiable para detener, reiniciar y administrar sus imágenes (presumiblemente para controlar los costos en su entorno), entonces puede consultar LabSlice. Descargo de responsabilidad: yo trabajo para esta empresa.

3

Si no es una misión crítica: una cosa simplista es programar el archivo por lotes para ejecutar 'SHUTDOWN' (ventanas) a las 3 a.m. todos los días. Entonces, al menos, no corre el riesgo de dejar accidentalmente una instancia no deseada ejecutándose indefinidamente.

¡Obviamente, esto es solo la mitad de la historia!

24

Puede probar el uso de las herramientas de la API de Amazon EC2 directamente. Hay realmente solo dos comandos que necesita: ec2-start-instances y ec2-stop-instances. Asegúrese de que los variables que el medio ambiente tales como EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY, etc. están correctamente configurados y todas las credenciales de AWS, certificado y archivos de claves privadas están en la ubicación correcta - puede encontrar más información en la API de AWS EC2 documentación de herramientas.

Primero puede probar el comando con la mano y luego, cuando todo funciona bien, configure crontab Unix o Tareas programadas en Windows. Puede encontrar el siguiente ejemplo para el archivo Linux/etc/crontab (no olvide que todas las variables de entorno mencionadas anteriormente deben estar presentes para el usuario 'cuenta-cuenta').

/etc/crontab 
0 8  * * * your-account ec2-start-instances <your_instance_id> 
0 16 * * * your-account ec2-stop-instances <your_instance_id> 
# Your instance will be started at 8am and shutdown at 4pm. 

Soy un desarrollador para el proyecto BitNami Nube, donde empaquetamos los herramientas AWS (incluyendo los que he mencionado) en un país libre, fácil de usar instalador que es posible que desee probar: BitNami CloudTools pack stack

+2

Para esto todavía necesita tener otra instancia. Porque cerrar no es el problema sino la puesta en marcha. Crone o cualquier cosa no se ejecutará en una computadora muerta después de que se haya cerrado. –

+0

Seguí [estos pasos] (http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/set-up-ec2-cli-linux.html#set-up-ec2-cli-tools-on- amazon-linux) para configurar AWS CLI Tools en mi instancia de AMazon Linux. La instancia de detención funciona bien. Pero al iniciar una instancia ya detenida, se genera un error de 400, no se encuentra el Id. De instancia. ¿Cómo puedo comenzar una instancia ya detenida? –

5

La empresa donde trabajo habían clientes pidiendo regularmente sobre esto, así que hemos escrito una aplicación de programación EC2 software gratuito disponible aquí:

http://blog.simple-help.com/2012/03/free-ec2-scheduler/

Funciona en Windows y Mac, le permite crear varias programaciones diarias/semanales/mensuales y le permite usar filtros coincidentes para incluir grandes cantidades de instancias fácilmente o incluye las que agrega en el futuro.

15

que escribió el código en Python, utilizando la biblioteca de Boto, para hacer esto. Puede ajustar esto para su propio uso. Asegúrese de ejecutar esto como parte de un trabajo cron, y luego podrá iniciar o apagar tantas instancias como necesite durante la ejecución de trabajos cron.

#!/usr/bin/python 
# 
# Auto-start and stop EC2 instances 
# 
import boto, datetime, sys 
from time import gmtime, strftime, sleep 

# AWS credentials 
aws_key = "AKIAxxx" 
aws_secret = "abcd" 

# The instances that we want to auto-start/stop 
instances = [ 
    # You can have tuples in this format: 
    # [instance-id, name/description, startHour, stopHour, ipAddress] 
    ["i-12345678", "Description", "00", "12", "1.2.3.4"] 
] 

# -------------------------------------------- 

# If its the weekend, then quit 
# If you don't care about the weekend, remove these three 
# lines of code below. 
weekday = datetime.datetime.today().weekday() 
if (weekday == 5) or (weekday == 6): 
    sys.exit() 

# Connect to EC2 
conn = boto.connect_ec2(aws_key, aws_secret) 

# Get current hour 
hh = strftime("%H", gmtime()) 

# For each instance 
for (instance, description, start, stop, ip) in instances: 
    # If this is the hour of starting it... 
    if (hh == start): 
     # Start the instance 
     conn.start_instances(instance_ids=[instance]) 
     # Sleep for a few seconds to ensure starting 
     sleep(10) 
     # Associate the Elastic IP with instance 
     if ip: 
      conn.associate_address(instance, ip) 
    # If this is the hour of stopping it... 
    if (hh == stop): 
     # Stop the instance 
     conn.stop_instances(instance_ids=[instance]) 
+0

¿Esto también es posible para los ambientes de Elastic Beanstalk? –

0

Creo que la pregunta inicial fue un poco confusa. Depende de lo que Pasta necesite: 1.lanzamiento/finalización (almacén de instancias): escalado automático es la solución correcta (respuesta de Nakedible) 2.start/stop instancia de inicio de EBS - Escala automática no ayuda, utilizo scripts programados a distancia (es decir, ec2 CLI).

1

AutoScaling está limitado a las instancias de terminación. Si desea detener una instancia y conservar el estado del servidor, una secuencia de comandos externa es el mejor enfoque.

Puede hacer esto ejecutando un trabajo en otra instancia que se ejecuta 24/7 o puede utilizar un servicio de terceros como Ylastic (mencionado anteriormente) o Rocket Peak.

Por ejemplo en C# el código para detener un servidor es bastante sencillo:

public void stopInstance(string instance_id, string AWSRegion) 
     { 
      RegionEndpoint myAWSRegion = RegionEndpoint.GetBySystemName(AWSRegion); 
      AmazonEC2 ec2 = AWSClientFactory.CreateAmazonEC2Client(AWSAccessKey, AWSSecretKey, myAWSRegion); 
      ec2.StopInstances(new StopInstancesRequest().WithInstanceId(instance_id)); 
     } 
1

mi humilde opinión, la adición de un horario a un grupo de escalado automático es la mejor "nube como" enfoque como se mencionó antes.

Sin embargo, en caso de no poder terminar sus casos y el uso de otros nuevos, por ejemplo, si usted tiene direcciones IP elásticas asociadas con etc

Se puede crear un script de Ruby para iniciar y detener las instancias de base a una fecha intervalo de tiempo.

#!/usr/bin/env ruby 

# based on https://github.com/phstc/amazon_start_stop 

require 'fog' 
require 'tzinfo' 

START_HOUR = 6 # Start 6AM 
STOP_HOUR = 0 # Stop 0AM (midnight) 

conn = Fog::Compute::AWS.new(aws_access_key_id:  ENV['AWS_ACCESS_KEY_ID'], 
          aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) 

server = conn.servers.get('instance-id') 

tz = TZInfo::Timezone.get('America/Sao_Paulo') 

now = tz.now 

stopped_range = (now.hour >= STOP_HOUR && now.hour < START_HOUR) 
running_range = !stopped_range 

if stopped_range && server.state != 'stopped' 
    server.stop 
end 

if running_range && server.state != 'running' 
    server.start 

    # if you need an Elastic IP 
    # (everytime you stop an instance Amazon dissociates Elastic IPs) 
    # 
    # server.wait_for { state == 'running' } 
    # conn.associate_address server.id, 127.0.0.0 
end 

Tenga una mirada en amazon_start_stop para crear un planificador gratis con Heroku Scheduler.

1

Aunque hay formas de lograr esto utilizando la escala automática, es posible que no sea adecuado para todas las ocasiones, ya que termina las instancias.Los trabajos cron no funcionarán nunca en una sola instancia (aunque se pueden usar perfectamente para situaciones como detener una instancia única y programar otras instancias cuando se ejecutan muchas instancias). Puede usar llamadas API como StartInstancesRequest y StopInstancesRequest para lograr lo mismo, pero nuevamente debe confiar en un tercer recurso. Hay muchas aplicaciones para programar instancias de AWS con muchas características, pero para una solución simple, recomendaría una aplicación gratuita como snapleaf.io

2

AWS Data Pipeline funciona bien. https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/

Si desea excluir días del inicio (por ejemplo, fin de semana), agregue un objeto ShellCommandPrecondition.

En AWS Console/Data Pipeline, cree una nueva canalización. Es más facil de editar/importar una definición (JSON)

{ 
"objects": [ 
{ 
    "failureAndRerunMode": "CASCADE", 
    "schedule": { 
    "ref": "DefaultSchedule" 
    }, 
    "resourceRole": "DataPipelineDefaultResourceRole", 
    "role": "DataPipelineDefaultRole", 
    "pipelineLogUri": "s3://MY_BUCKET/log/", 
    "scheduleType": "cron", 
    "name": "Default", 
    "id": "Default" 
}, 
{ 
    "name": "CliActivity", 
    "id": "CliActivity", 
    "runsOn": { 
    "ref": "Ec2Instance" 
    }, 
    "precondition": { 
    "ref": "PreconditionDow" 
    }, 
    "type": "ShellCommandActivity", 
    "command": "(sudo yum -y update aws-cli) && (#{myAWSCLICmd})" 
}, 
{ 
    "period": "1 days", 
    "startDateTime": "2015-10-27T13:00:00", 
    "name": "Every 1 day", 
    "id": "DefaultSchedule", 
    "type": "Schedule" 
}, 
{ 
    "scriptUri": "s3://MY_BUCKET/script/dow.sh", 
    "name": "DayOfWeekPrecondition", 
    "id": "PreconditionDow", 
    "type": "ShellCommandPrecondition" 
}, 
{ 
    "instanceType": "t1.micro", 
    "name": "Ec2Instance", 
    "id": "Ec2Instance", 
    "type": "Ec2Resource", 
    "terminateAfter": "50 Minutes" 
} 
], 
"parameters": [ 
{ 
    "watermark": "aws [options] <command> <subcommand> [parameters]", 
    "description": "AWS CLI command", 
    "id": "myAWSCLICmd", 
    "type": "String" 
} 
], 
"values": { 
"myAWSCLICmd": "aws ec2 start-instances --instance-ids i-12345678 --region eu-west-1" 
} 
} 

Ponga la escritura del golpe que se dowloaded y ejecutado como condición previa en su depósito de S3

#!/bin/sh 
if [ "$(date +%u)" -lt 6 ] 
then exit 0 
else exit 1 
fi 

Al activar y ejecutar la tubería en los días de fin de semana, el estado de mantenimiento de la conexión de la consola de AWS indica un "ERROR" engañoso. La secuencia de comandos bash devuelve un error (salida 1) y EC2 no se inicia. En los días 1 a 5, el estado es "SALUDABLE".

Para detener EC2 automáticamente al cerrar el horario de oficina, use el comando AWS CLI diariamente sin precondición.

Cuestiones relacionadas