¿Cómo le digo a todas mis instancias de AWS EC2 que extraigan de git / codecommit?

Estoy usando AWS CodeCommit, que parece ser una versión simplificada de git.

Si todas estas instancias de EC2 tienen la misma label de function, ¿cómo logro esto?

No quiero hacer nada elegante, todo lo que quiero es especificar una label, hacer clic en un button y todas esas instancias de EC2 con esa label para CodeCommit. Quiero hacer esto desde mi máquina local.

Sé que necesito poner las keys SSH para acceder a CodeCommit en cada uno de mis serveres EC2 e instalar git en cada una de ellas (voy a hornear esto en una AMI). Simplemente no estoy seguro de cómo "disparar" cada una de las máquinas EC2 para hacer un git pull? ¿Hay un command de AWS?

No soy un chico de operaciones y solo conozco los linux básicos y php.

Para las instancias de EC2 que se inician con un rol de IAM, ni siquiera tiene que hornear las keys SSH. Git puede get cnetworkingenciales de CodeCommit a partir de los metadatos de instancia EC2. Hornea un AMI basado en Linux con el último package AWS CLI y las siguientes líneas en ~ / .gitconfig:

[cnetworkingential] helper = !aws --profile default codecommit cnetworkingential-helper [email protected] UseHttpPath = true 

Inicie la instancia con un rol IAM adjunto, y luego puede clonar el repository CodeCommit sin ninguna configuration adicional.

Es posible que desee examinar Capistrano y Capify-EC2 si desea ejecutar commands git en una flota de instancias EC2 basadas en tags.

Actualizado: si está abierto a usar AWS OpsWorks para implementar desde CodeCommit, hay un artículo reciente sobre cómo hacerlo. También puede usar OpsWorks para ejecutar commands arbitrarios entre instancias con Capistrano.

Lo más cerca que podrá llegar con los services administrados de AWS es CodeDeploy . Con él, puede organizar la implementación en instancias de EC2 a través de la command-line o la console web. Pero CodeDeploy simplemente extrae artefactos de S3 o GitHub , hasta ahora. Por ahora, CodeCommit parece estar completamente aislado de otros services relacionados con Amazon, como CodePipeline y CodeDeploy , por lo que no parece ser una buena opción. Pero, por supuesto, la hoja de ruta de Amazon es integrarlos a todos (no hacerlo sería inútil). Entonces, ahora, sería mejor usar GitHub que CodeCommit .

Pero, considerando que no está usando GitHub , entonces necesita una solución de CI (continuous integration) entre su repository y CodeDeploy , extrayendo el código de la fuente, posiblemente construyendo o ejecutando testings, empujándolo a S3 y contándole a CodeDeploy al respecto. CodeShip , por ejemplo, puede hacerlo y se integra con muchos services externos. O incluso podría tener su propio server de CI , como Jenkins , haciendo ese rol de "pegamento" para usted. (Jenkins probablemente será el más flexible porque es de código abierto y puede tener complementos para todo).

Entonces, rompiendo un poco, tu flujo de trabajo sería algo así:

  • empujar el código a su repository;
  • cada vez que hay un evento (una confirmación en alguna twig, o una nueva label, debe ser configurable), su CI lo extrae, ejecuta lo que desee o necesite (comstack, testing, empaqueta) y lo envía a S3 (como file tarball, por lo general);
  • dependiendo de cómo haya configurado las cosas, su CI le dice a Code Deploy que lo deployment en sus instancias EC2 de inmediato, o simplemente le dice que hay una nueva versión disponible, y le permite activar la implementación, manualmente, a través de CLI en la console web, cuando quieras.

(En realidad, CodeDeploy no envía código a las instancias de EC2 . En su lugar, cada instancia de EC2 debe ejecutar un agente que agrupa regularmente el server de CodeDeploy para saber si hay algo nuevo que aplicar localmente. De todos modos, CodeDeploy coordina y obtiene retroalimentación de los agentes. , por lo que funciona como si fuera 100% activo en CodeDeploy y 100% pasivo en el lado de las instancias.)

La solución AWS más "limpia" sería CodeCommit -> CodePipeline -> CodeDeploy , o simplemente CodeCommit -> CodeDeploy , pero esos services no están completamente integrados por ahora.

En su caso, la solución más simple y viable en este momento sería Github -> CodeDeploy . Cualquier cosa diferente de eso exigirá algunos pasos intermedios en el path, como los ejemplos que proporcioné ( CodeShip , Jenkins , etc.).