0

Cómo optimizar la entrega de tus proyectos con AWS CodeDeploy

803Puntos

hace 5 años

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. AWS Code Deploy Workflow

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:Screen Shot 2016-07-02 at 3.11.07 PM Después creamos una para las instancias de EC2 con este contenido: Screen Shot 2016-07-02 at 3.15.05 PM 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: Screen Shot 2016-07-02 at 3.19.01 PM Seleccionamos Amazon EC2 en el siguiente paso.Screen Shot 2016-07-02 at 3.21.00 PM Es hora de usar la política de CodeDeploy que hemos creado antes:Screen Shot 2016-07-02 at 3.23.46 PM 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: Screen Shot 2016-07-02 at 3.25.27 PMScreen Shot 2016-07-02 at 3.29.50 PM Creamos el segundo rol en IAM>Roles>Create New Role: Nombramos el rol: Screen Shot 2016-07-02 at 3.37.09 PM Seleccionamos Amazon EC2:Screen Shot 2016-07-02 at 3.21.00 PM Usamos la política de EC2CodeDeploy que creamos anteriormente: Screen Shot 2016-07-02 at 3.38.34 PM

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. Screen Shot 2016-07-02 at 3.51.49 PM Dentro de los detalles de la instancia debemos usar el rol de EC2 que creamos: Screen Shot 2016-07-02 at 3.54.46 PM 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. Screen Shot 2016-07-02 at 3.56.33 PM 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
Screen Shot 2016-07-02 at 4.31.04 PM

CodeDeploy

Dentro de CodeDeploy seleccionamos "crear nueva aplicación": Screen Shot 2016-07-02 at 4.34.16 PM Seleccionamos el rol que creamos para CodeDeploy:Screen Shot 2016-07-02 at 4.35.39 PM Ya creada nuestra app de CodeDeploy podemos lanzar una versión a nuestro servidor. Screen Shot 2016-07-02 at 4.46.04 PM Seleccionamos My application is stored on GitHub y pedirá permisos para acceder a los repos: Screen Shot 2016-07-02 at 4.49.18 PM El deployment entrará proceso y una vez completado se verá así: Screen Shot 2016-07-02 at 4.50.34 PMScreen Shot 2016-07-02 at 4.50.56 PM 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. 
Pablo
Pablo
Escribe tu comentario
+ 2
1
1370Puntos

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