He estado buscando varios métodos para ejecutar comandos al crear instancias EC2 usando Elastic Beanstalk en AWS. Me han proporcionado diferentes métodos para hacer esto a través del soporte técnico de AWS, incluidos enlaces de ciclo de vida, AMI personalizadas y extensiones .eb. He tenido problemas para que los 2 primeros métodos (ganchos de ciclo de vida y AMI personalizadas) funcionen con EB.
Actualmente estoy usando .ebextensions para ejecutar comandos al momento de la implementación, pero no estoy seguro de si hay una forma de ejecutar un conjunto de comandos solo al momento de la creación en lugar de cada vez que implemento el código. Por ejemplo, tengo un archivo .ebextensions/03-commands.config que contiene el siguiente código:
container_commands: 01_npm_install: command: "npm install -g -f npm@latest"Sin embargo, solo quiero que este código se ejecute en la creación de instancias, no cada vez que implemente, como lo hace actualmente. ¿Alguien sabe una manera de lograr esto?
¡Gracias por adelantado!
Recomendaría crear un script idempotente en su aplicación que deje un archivo de marcador en la instancia en alguna ubicación, digamos /var/myapp/marker usando algo como mkdir -p /var/myapp-state/; touch /var/myapp-state/marker en ejecución exitosa. De esa manera, en su secuencia de comandos, puede verificar que, si existe el archivo de marcador, puede hacer que su secuencia de comandos no funcione.
Luego, puede llamar a su secuencia de comandos desde los comandos del contenedor, pero siempre será una operación no operativa porque en la primera ejecución exitosa creará el archivo de marcador y las ejecuciones posteriores no serán operativas.
Cree una AMI personalizada. De esta manera, puede configurar sus instancias como quiera y se iniciarán más rápido.
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.customenv.html
Actualizar
No entiendo por qué alguien rechazaría esto. De todos modos, como también se ha dicho en los comentarios, las AMI personalizadas son una excelente manera de crear un comportamiento personalizado en sus instancias.
Como veo en su pregunta, está usando: container_commands, eso significa que está usando Elastic Beanstalk con Docker. ¿Derecha? En este caso, recomendaría leer: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html .
La idea es que puede crear su propio Dockerfile, donde puede especificar todos los comandos que necesita para construir un contenedor docker, por ejemplo, para instalar todas las dependencias.
Recomendaría usar .ebextensions para la personalización y configuración de Elastic Beanstalk, por ejemplo, para especificar la configuración de ELB o RDS. En Dockerfile, tiene sentido especificar todos los comandos que necesita para crear un contenedor para su aplicación, que incluye la configuración del servidor web, las dependencias, etc.
Con este enfoque, Elastic Beanstalk creará un contenedor, que cada vez que implemente, ejecutará una instancia de Docker con el código fuente implementado.