virginia script run ec2 east aws amazon-web-services amazon-cloudformation ami packer cloud-init

amazon-web-services - east - amazon ec2 run script startup



¿Qué incluir en AWS AMI y qué aprovisionar usando cloud-init? (2)

Me gusta separar el aprovisionamiento de la máquina del aprovisionamiento del entorno.

En general, uso lo siguiente como guía:

Fase de construcción

  • Cree una imagen de máquina base con algo como Packer, incluido todo el software necesario para ejecutar su aplicación. Crea un AMI a partir de esto.
  • Instale la aplicación (es) en la Imagen de la Máquina Base creando una Imagen de Aplicación. Etiqueta y versiona este artefacto. No incruste cosas específicas del entorno aquí, como conexiones de bases de datos, etc., ya que esto no le permite reutilizar fácilmente esta AMI en diferentes entornos de ejecución del entorno.
  • Asegúrese de que todos los servicios estén detenidos

Fase de lanzamiento

  • Haga girar un entorno compuesto por las imágenes e infra requerido, usando algo como CFN.
  • Utilice user-data Cloud-Init para configurar el entorno de la aplicación (conexiones de base de datos, reenviadores de registro, etc.) y luego inicie las aplicaciones / servicios

Este enfoque ofrece la mayor flexibilidad y separa limpiamente las diversas preocupaciones de una cartera de entrega continua.

Estoy usando AWS Cloudformation para configurar numerosos elementos de infraestructura de red (VPC, SecurityGroups, Subredes, grupos de ajuste de escala automático, etc.) para mi aplicación web. Quiero que todo el proceso sea automatizado. Quiero hacer clic en un botón y ser capaz de iniciar todo.

He creado con éxito una plantilla de Cloudformation que configura toda esta infraestructura de red. Sin embargo, las instancias de EC2 se lanzan actualmente sin ningún software necesario en ellas. Ahora estoy tratando de encontrar la mejor manera de obtener ese software en ellos.

Para hacer esto, estoy creando AMI usando Packer.io . Pero algunas personas me han instado a usar Cloud-Init. ¿Qué heurística debería usar para decidir qué incluir en las AMI y / o qué configurar a través de Cloud-Init?

Por ejemplo, quiero preconfigurar una instancia de EC2 para permitirme ( saqib ) iniciar sesión sin una contraseña desde mi computadora portátil. Por lo tanto, el EC2 debe tener un usuario. Ese usuario debe tener un directorio de inicio. Y en ese directorio de inicio debe vivir un archivo .ssh/known_hosts contenga códigos encriptados. ¿Debo hornear estos directorios en el AMI? ¿O debería usar Cloud-init para configurarlos? ¿Y cómo debo decidir en este y otros casos similares?


Uno de los factores importantes que determina cómo debe armar servidores, AMI y planificación de infraestructura es responder a la pregunta: ¿En producción, qué tan rápido necesitaré lanzar una nueva instancia?

La respuesta a esta pregunta determinará cuánto cree en el AMI y cuánto construye después del arranque.

NOTA: Mi experiencia es con Chef Server, así que usaré la terminología de Chef, pero los conceptos son los mismos para cualquier otra pila de administración de configuraciones.

La regla general es tratar su "Infraestructura como código". Esto significa pensar en el proceso de lanzamiento de instancias, la creación de usuarios en esa máquina y el proceso de administración de los archivos known_hosts y las claves SSH de la misma manera que lo haría con el código de la aplicación. Ser capaz de rastrear los cambios a la infraestructura en el código fuente hace que la administración sea más fácil, las redistribuciones e incluso la IC sean mucho más fáciles.

Esta introducción al chef cubre la terminología en Chef de libros de cocina, recetas, recursos y más. Le muestra cómo construir una pila de LAMP simple, y cómo puede relanzarlo con la misma facilidad con un solo comando.

Entonces, dado el ejemplo en su pregunta, en un nivel alto haría lo siguiente:

  • Inicie una base Ubuntu Linux AMI (actualmente 14.04) con un script de Cloudformation.
  • En la sección UserData de la configuración de Instance, inicie el proceso de instalación de Chef Client.
  • Ejecuta una receta para crear un usuario.
  • Ejecute una receta para crear el archivo known_hosts para el usuario

Se utilizan herramientas como Chef porque puede descomponer la infraestructura en pequeños bloques de código que realizan funciones específicas. Existen numerosos Cookbooks ya creados y disponibles que realizan los componentes básicos de la creación de servicios, la instalación de paquetes de software, etc.

Dicho todo esto, hay ocasiones en las que debe desviarse de las mejores prácticas en interés de su dominio y requisitos específicos. Puede haber situaciones en las que, dadas todas las ventajas de una administración de infraestructura, aún necesite hornear artículos en la AMI.

Imaginemos que su aplicación procesa la imagen y tiene un requisito para usar ImageMagick. Supongamos que tendrá que crear ImageMagick desde la fuente. Si hicieras esto a través de Chef Recetas, esto podría agregar otros 7 minutos de compilación de ImageMagick al tiempo de inicio de la instancia normal. Si esperar de 10 a 12 minutos es demasiado largo para que una nueva instancia se conecte, es posible que desee considerar la posibilidad de preparar su propia AMI que ImageMagick ya compiló e instaló.

Esta es una solución aceptable, pero debe tener en cuenta que administrar su propia flota de AMI precocinadas agrega una sobrecarga de infraestructura adicional. Tendrá que mantener sus AMI personalizados actualizados a medida que se lanzan nuevas AMI, se expande a diferentes tipos de instancias y a diferentes regiones de AWS.