CodeDeploy es un servicio de
Amazon Web Services que controla y administra los múltiples deployments de proyectos a instancias de
Amazon EC2. Permite a los desarrolladores y DevOps centralizar y administrar la actualización y deployment de sus servicios de manera automatizada y controlada evitando puntos de error o downtimes. CodeDeploy también tiene la flexibilidad de hacer deployment a través de grupos por lo que, por ejemplo, puedes administrar tus actualizaciones en grupos de desarrollo, testing y producción.
Otra de las ventajas con las que se cuenta es que existen muchas integraciones en diversos servicios. Por ejemplo, es posible crear un workflow de manera que los cambios sean empujados a
GitHub, después se le pueden aplicar pruebas en servicios como
Jenkins o
Travis CI y, sólo si las pruebas concluyen con éxito, reflejar cambios en tiempo real en todos los servidores de producción de tu proyecto.

En este post, aprenderás a configurar un proyecto, habilitando el deploy en múltiples instancias con un solo commit de un repositorio en GitHub. Si quieres checar el código fuente del proyecto puedes verlo en GitHub.
IAM Roles
La primer cosa que haremos será crear dos roles de IAM: uno para que nuestra aplicación de CodeDeploy pueda comunicarse con las instancias y otro para nuestras instancias de EC2. Antes de crear los roles, será necesario crear nuevas políticas de usuarios. Dentro de
IAM>Policies encontrarás un botón para crear políticas.
Primero creamos una para CodeDeploy con
este contenido:
Después creamos una para las instancias de EC2 con
este contenido:

Ahora es momento de crear el primer rol (el que usará CodeDeploy), dentro de
IAM>Roles seleccionando "
Create New Role".
Para nombrar el rol tenemos que seguir las instrucciones abajo:

Seleccionamos
Amazon EC2 en el siguiente paso.

Es hora de usar la política de
CodeDeploy que hemos creado antes:

Una vez creado el rol tenemos que editar las políticas de confianza. Para eso debemos ir al detalle de nuestro rol
IAM>Roles>Platzi_CodeDeploy y dentro de la pestaña de
Trust Relationships seleccionar
"Edit trust relationship" y cambiar el contenido
por este:


Creamos el segundo rol en
IAM>Roles>Create New Role:
Nombramos el rol:

Seleccionamos
Amazon EC2:
Usamos la política de
EC2CodeDeploy que creamos anteriormente:

EC2 Instance
Ahora que tenemos listos los roles de
IAM, necesitaremos crear una(s) instancia(s) donde nuestro proyecto vivirá. Para el proyecto de este posts usaremos la AMI de AWS de Linux porque ya trae instalado el
AWS CLI.

Dentro de los detalles de la instancia debemos usar el rol de EC2 que creamos:

Configuramos el
security group para que permita el tráfico a través del puerto 22 para SHH y el puerto 80 para nuestro proyecto.

Una vez creada la instancia y asignada una IP entramos al servidor por ssh con el comando:
sudo ssh -i Key.pem [email protected]
Dentro usamos los siguientes comandos para actualizar e instalar la línea de comandos de AWS:
sudo su
yum -y update
yum install -y aws-cli
cd /home/ec2-user
Iniciamos sesión y configuramos el AWS CLI, en caso de que no cuentes con un usuario con esas credenciales, puedes crearlo en IAM.
aws configure
Descargamos e instalamos las utilidades de CodeDeploy.
aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1
chmod +x ./install
sed -i "s/sleep(.*)/sleep(10)/" install
./install auto
Verificamos la instalación
service codedeploy-agent status

CodeDeploy
Dentro de
CodeDeploy seleccionamos "crear nueva aplicación":

Seleccionamos el rol que creamos para
CodeDeploy:
Ya creada nuestra app de CodeDeploy podemos lanzar una versión a nuestro servidor.

Seleccionamos
My application is stored on GitHub y pedirá permisos para acceder a los repos:

El deployment entrará proceso y una vez completado se verá así:


El proyecto consta de un archivo llamado
appspec.yml que define los scripts que serán ejecutados durante el deployment y un folder de
scripts que contiene dichos scripts. Estos pueden ser tan complejos como quieras. En este caso sólo instalan httpd y copian el archivo
index.html a un folder pero puedes configurar todo el setup y deployment en estos scripts.
No dudes en dejar comentarios sobre tus propios experimentos y proyectos con Code Deploy.
Hola! Yo estoy hecha un lío. He creado una instancia EC2 con Red Hat Linux 8 y he alojado el código de mi aplicación en un S3. Sin embargo cuando voy a hacer deploy de mi aplicación, haga lo que haga al ejecutar los scripts que instalan las dependencias me arroja:
[stdout]No match for argument: httpd24
[stdout]No match for argument: php70
[stdout]No match for argument: mysql56-server
[stdout]No match for argument: php70-mysqlnd
Ya he probado eliminar cualquier dependencia y proporcionar lo módulos de soporte de apache.
sudo yum remove httpd* php*
yum search all mod_ssl
Tienen un curso de codedeploy y bluegreen?