¿Puedo iniciar y finalizar automáticamente mi instancia de Amazon con la API de Amazon? ¿Puede describir cómo se puede hacer esto? Idealmente, necesito iniciar la instancia y detenerla en intervalos de tiempo específicos todos los días.
90
Respuestas:
En caso de que alguien se tropiece con esta vieja pregunta, hoy en día puede lograr lo mismo agregando un cronograma a un grupo de autoescalado: aumente la cantidad de instancias en un grupo de autoescalado a 1 en ciertos momentos y luego vuelva a disminuirlo a 0 .
Y dado que esta respuesta está obteniendo muchas vistas, pensé en vincularme a una guía muy útil sobre esto: Ejecución de instancias EC2 en un programa recurrente con Auto Scaling
fuente
Puede intentar utilizar las herramientas API de Amazon EC2 directamente. En realidad, solo necesita dos comandos: ec2-start-instances y ec2-stop-instances. Asegúrese de que las variables de entorno como EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY, etc.estén configuradas correctamente y que todas las credenciales, certificados y archivos de claves privadas de AWS estén en la ubicación adecuada; puede encontrar más información en la documentación de las herramientas API de AWS EC2.
Puede probar el comando a mano primero y luego, cuando todo funcione bien, configurar crontab de Unix o Tareas programadas en Windows. Puede encontrar el ejemplo a continuación para el archivo Linux / etc / crontab (no olvide que todas las variables de entorno mencionadas anteriormente deben estar presentes para el usuario 'su-cuenta'.
Soy un desarrollador del proyecto BitNami Cloud, donde empaquetamos las herramientas de AWS (incluidas las que mencioné) en un instalador gratuito y fácil de usar que quizás desee probar: BitNami CloudTools pack stack
fuente
Le recomiendo que consulte la Guía de inicio de EC2 , que le muestra cómo hacer lo que necesita utilizando las herramientas de línea de comandos de EC2. Puede escribir esto fácilmente en un trabajo cron (en Linux / UNIX) o en un 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; consulte la Guía para desarrolladores para obtener más detalles.
fuente
Escribí código en Python, usando la biblioteca 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 los trabajos cron.
fuente
Si no es una misión crítica: una cosa simplista es programar el archivo por lotes para que se ejecute 'APAGADO' (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!
fuente
La empresa para la que trabajo tenía clientes que preguntaban regularmente sobre esto, por lo que hemos escrito una aplicación de programación EC2 gratuita disponible aquí:
http://blog.simple-help.com/2012/03/free-ec2-scheduler/
Funciona en Windows y Mac, le permite crear múltiples programas diarios / semanales / mensuales y le permite usar filtros coincidentes para incluir fácilmente una gran cantidad de instancias o incluye las que agregue en el futuro.
fuente
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 fácil editar / importar una definición (JSON)
Coloque el script de Bash para descargarlo y ejecutarlo como condición previa en su bucket de S3
Al activar y ejecutar la canalización los días de fin de semana, el estado de salud de la canalización de la consola de AWS muestra un "ERROR" engañoso. El script 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 a la hora de cierre de la oficina, utilice el comando de la AWS CLI diariamente sin condiciones previas.
fuente
Podrías mirar a Ylastic para hacer esto. La alternativa parece ser tener una máquina en ejecución que apague / inicie otras instancias usando un trabajo cron o una tarea programada.
Obviamente, si solo desea una instancia, esta es una solución costosa, ya que una máquina siempre debe estar en funcionamiento, y pagar ~ $ 80 al mes por una máquina para ejecutar trabajos cron no es rentable.
fuente
AutoScaling se limita a terminar instancias. Si desea detener una instancia y conservar el estado del servidor, el mejor enfoque es un script externo.
Puede hacer esto ejecutando un trabajo en otra instancia que se ejecute las 24 horas del día, los 7 días de la semana, o puede usar 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:
fuente
En mi humilde opinión, agregar un horario a un grupo de escalado automático es el mejor enfoque "similar a una nube" como se mencionó anteriormente.
Pero en caso de que no pueda terminar sus instancias y usar otras nuevas, por ejemplo, si tiene IP elásticas asociadas, etc.
Puede crear un script Ruby para iniciar y detener sus instancias en función de un rango de fecha y hora.
Eche un vistazo a amazon_start_stop para crear un programador de forma gratuita con Heroku Scheduler .
fuente
Aunque hay formas de lograr esto mediante el escalado automático, es posible que no sea adecuado para todas las ocasiones, ya que finaliza las instancias. Los trabajos cron nunca funcionarán para una sola instancia (aunque se puede usar perfectamente para situaciones como detener una sola instancia y programar otras instancias cuando se ejecutan muchas instancias). Puede usar llamadas a la 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
fuente
Sí, puede hacerlo con AWS Lambda. Puede seleccionar el disparador en Cloudwatch que se ejecuta en expresiones Cron en UTC.
Aquí hay un enlace relacionado https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/
Otra alternativa es el uso
awscli
que está disponible enpip
,apt-get
,yum
obrew
, y luego correraws configure
con sus credenciales exportados de IAM y ejecutar el siguiente script bash, para detener una EC2 que ha sido etiquetado conName: Appname
yValue: Appname Prod
. Puede usarawscli
para etiquetar sus instancias o etiquetarlas manualmente desde la consola de AWS.aws ec2 stop-instances
detendrá la instancia yjq
se usa para filtrar la consulta json y obtener el ID de instancia correcto usando las etiquetas deaws ec2 describe-instances
.Para verificar que
aws configure
fue exitoso y devuelve la salida json, ejecuteaws ec2 describe-instances
y su ID de instancia en ejecución debe estar allí en la salida. Aquí hay una salida de muestraLa siguiente secuencia de comandos bash se
stop-ec2.sh
en/home/centos/cron-scripts/
la que se inspira de este post SOEjecute el archivo utilizando
sh /home/centos/cron-scripts/stop-ec2.sh
y verifique que la instancia EC2 se detenga. Para depurar, ejecuteaws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Appname Prod") ) | select(.[].Tags[].Key == "Appname") | {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags} | [.]' | jq -r .[].InstanceId
y vea que devuelve el ID de instancia correcto que se ha etiquetado.Luego en
crontab -e
la siguiente línea se puede agregar30 14 * * * sh /home/centos/cron-scripts/stop-ec2.sh >> /tmp/stop
que registrará la salida
/tmp/stop
. La30 14 * * *
es la expresión cron UTC que puede registrarhttps://crontab.guru/
. De manera similar, reemplazar conaws ec2 start-instances
puede iniciar una instancia.fuente
Creo que la pregunta inicial fue un poco confusa. Depende de lo que Pasta necesite: 1.lanzar / terminar (almacenamiento de instancias) - Auto Scaling es la solución correcta (la respuesta de Nakedible) 2.Iniciar / detener la instancia de arranque de EBS - Auto Scaling no ayudará, utilizo scripts programados remotos (es decir , ec2 CLI).
fuente
No puede hacer esto automáticamente, o al menos no sin algo de programación y manipulación de API en 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), es posible que desee mirar LabSlice . Descargo de responsabilidad: trabajo para esta empresa.
fuente