Nombre:

Tutorial #4 - AWS CodePipeline sobre AWS Elastic Beanstalk con contenedores

Duración:

90 minutos

Profesor responsable

Mario Villamizar

Pre-Requisitos:

Python + Flask + Git + Docker + Elastic Container Register + CodeCommit + AWS Codebuild + Elastic Beanstalk

Objetivos

Al finalizar el tutorial el estudiante estará en capacidad de:

Requisitos para desarrollar el tutorial

En particular se utilizarán los siguientes recursos:

  1. Cuenta de AWS Academy
  2. Conocimientos en Python, Flask, Git, Docker, Elastic Container Register, AWS CodeCommit, AWS CodeBuild, Elastic Beanstalk y la consola de administración web de AWS

AWS CodePipeline es un servicio de Amazon que permite implementar integración continua (Continous Integration) y entrega continua (Continous Delivery) sobre aplicaciones desplegadas en AWS.

El servicio de AWS CodePipeline permite integraciones con otros servicios de AWS como CodeBuild, CodeCommit, CodeDeploy, aws Elastic beanstalk, entre otros, lo cual permite tener centralizado todos los procesos de desarrollo e implementación de una aplicación.

Con AWS CodePipeline se preparan automáticamente los cambios realizados en el código y se automatizan procesos de compilación, prueba y lanzamiento en producción, esta automatización permite realizar pruebas de forma más rápida y cómoda y así identificar errores para una solución oportuna.

AWS CodePipeline, permite crear flujos de trabajo o canalizaciones para transmitir las modificaciones del código a través de un proceso de lanzamiento. Esta canalización se define con varias secciones y fases.

Amazon ECR es un servicio de registro de imágenes de contenedores administrado por AWS. Amazon ECR permite repositorios de imágenes de contenedores públicos y privadas y el acceso a estos repositorios se pueden segmentar y administrar mediante AWS IAM para permitir que solo usuarios específicos tengan acceso a los recursos.

Amazon ECR está compuesto por diferentes componentes, Registro, Token de autorización, Repositorio, Política sobre repositorios e imágenes.

Dentro de Amazon se ofrecen características que ayudan a la seguridad y disponibilidad de las imágenes de contenedores, dentro de las características de seguridad se encuentran las políticas de ciclo de vida, el escaneo de imágenes y la replicación entre regiones y entre cuentas de AWS.

El código de la aplicación lo encuentra en el siguiente repositorio de GitHub:

https://github.com/WeimarG/taller_pipeline_containers.git

La aplicación es una pequeña API en Python y Flask con dos endpoints.

Endpoint

/

Descripción

Lista la información de todos los héroes registrados en plataforma.

Método

GET

Retorno

application/json, con todos los héroes registrados en plataforma. 

Parámetros del Endpoint

Ninguno

Endpoint

/<int:id_heroe>

Descripción

Permite recuperar la información de un héroe registrado en plataforma.

Método

GET

Retorno

application/json. Con un diccionario que representa la información de un héroe.

Parámetros del Endpoint

Ninguno.

Ingrese a la consola de administración de AWS y en el menú servicios selecciones Elastik Beanstalk.

Cree una nueva aplicación seleccionando el entorno del servidor web y Asígnele un nombre.

Interfaz de usuario gráfica, Texto, Aplicación\n\nDescripción generada automáticamente

En la sección Plataforma seleccione Plataforma Administrada y seleccione la plataforma "Docker" ya que el despliegue se realizará sobre contenedores. Deje los valores de ramificación y versión por defecto.

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico\n\nDescripción generada automáticamente

Por último, en la sección Código de la aplicación, seleccione la opción Aplicación de muestra y finalice dando clic al botón "Crear un entorno".

Pruebe que la aplicación esté corriendo correctamente ingresando con la url generada en el entorno.

Interfaz de usuario gráfica, Texto\n\nDescripción generada automáticamente

Ingrese a la consola de administración de AWS y en el menú servicios selecciones CodeCommit.

En la ventana principal de AWS CodeCommit selección el botón "Crear el repositorio"

Agregue un nombre y descripción para el repositorio y de clic en el botón crear.

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico\n\nDescripción generada automáticamente

Cree un repositorio local con el código de su aplicación y genere el enlace remoto con el repositorio de AWS CodeCommit que acaba de crear.

Nota: Para profundizar más sobre este paso, revise los manuales anteriores de AWS CodeCommit y AWS CodeBuild.

Prepare todos los archivos de la aplicación y realice un push de estos al repositorio de CodeCommit.

Interfaz de usuario gráfica, Aplicación\n\nDescripción generada automáticamente

Ingrese a la consola de administración de AWS y en el menú servicios selecciones CodeBuild. A continuación, seleccione el botón "Crear Proyecto"

Al seleccionar la opción "crear proyecto" se abrirá una ventana emergente para realizar la configuración en CodeBuild. Se debe agregar el nombre del proyecto, el entorno, que para este caso será una imagen administrada con sistema operativo Ubuntu, adicional, se debe seleccionar o crear un nuevo rol de servicio el cual tendrá los permisos de acceso a los recursos necesarios.

Para este caso, adicional, debe seleccionar la opción "Privilegiado" ya que se creará una imagen de Docker.

Por último, se debe especificar si se utilizará un archivo de compilación o si se insertarán los comandos, en este caso se seleccionará la opción del archivo ya que este está incluido dentro del repositorio de la aplicación con el nombre buildspec.yml.

Las siguientes opciones de la configuración son opcionales, como la configuración del lote y el almacenamiento de los logs (registros).

Finalice dando clic en el botón "Crear Proyecto de Compilación"

NOTA: De forma predeterminada el rol que acaba de crear no tiene los permisos necesarios para acceder a ECR (Envío de imagen al repositorio), por lo cual, se debe crear una política con los permisos necesarios de acceso a ECR y asignarla al rol.

Diríjase al servicio AIM de AWS y de clic en la opción "Roles".

Busque el rol que acaba de crear, para este caso, "codebuild-CodeBuild-container-service-role" y selecciónelo.

A continuación, diríjase a la sección "Permisos" y seleccione la opción "Adjuntar Políticas"

En la nueva ventana, seleccione la opción "Crear política".

Se abrirá una ventana para la configuración de la nueva política.

Diríjase a la sección de "Servicio" y busque el servicio de "Elastic Container Registry".

En la sección de "acciones" seleccione las siguientes opciones:

BatchCheckLayerAvailability (Read): otorga permiso para verificar la disponibilidad de múltiples capas de imágenes en un registro y repositorio específicos

GetAuthoizationToken (Read): otorga permiso para recuperar un token que es válido para un registro específico durante 12 horas

InitiateLayerUpload (Write): otorga permiso para notificar a Amazon ECR que tiene la intención de cargar una capa de imagen.

PutImage (Write): otorga permiso para crear o actualizar el manifiesto de imagen asociado con una imagen

CompleteLayerUpload (Write): otorga permiso para informar a Amazon ECR que se ha completado la carga de la capa de imagen para un registro, un nombre de repositorio y un ID de carga especificados.

UploadLayerPart (Write): otorga permiso para cargar una parte de la capa de imagen en Amazon ECR

Por último, en la sección de recursos, seleccione la opción "Todos los recursos"

De clic en el botón "siguiente tag" y posteriormente en el botón "Siguiente Review".

Se mostrará una ventana con el review de la configuración de la política. Agregue un Nombre a la política y Finalice dando clic en el botón "Crear Política"

Diríjase nuevamente al rol que ha creado en CodeBuild y asígnele la política que acaba de crear.

En el resumen del Rol podrá observar las políticas que tiene asignadas.

Ingrese a la consola de administración de AWS y en el menú servicios seleccione Registro de contenedores elásticos.

En la ventana principal de Amazon ECR seleccione el botón "Empezar"

En la nueva ventana, debe configurar la visibilidad (Público o Privado) y el nombre del repositorio, adicional, puede habilitar el escaneo de imágenes y el cifrado KMS.

Para este caso se creará un repositorio Privado.

De clic en el botón "Crear Repositorio" para continuar con el proceso.

A continuación, observará el listado de repositorios creados y el Identificador URI (Uniform Resource Identifier) de cada uno de los repositorios.

Almacene el URI de su repositorio ya que este debe ser declarado en al archivo buildspec.yml.

Dockerfile

Es un archivo de texto el cual contiene todas las instrucciones y comandos para crear una imagen de contenedor.

A continuación, se describe cómo está construido el Dockerfile en la aplicación de prueba.

Imagen que contiene Texto\n\nDescripción generada automáticamente

Buildspec.yml

Este archivo especifica los comandos de CodeBuild que ejecutará durante cada fase de la compilación.

En esta sección se define el inicio de sesión a Amazon ECR. (utilice el URI de su repositorio)

Se definen los comandos para la creación de la imagen del contenedor

Se define el comando para realizar el push de la imagen al repositorio de ECR.

Los valores que debe modificar en el archivo buildspec.yml se encuentran especificados en su repositorio ECR en la opción Comandos Push

Ingrese a la consola de administración de AWS y en el menú servicios selecciones CodePipeline.

En la ventana principal de AWS CodePipeline selección el botón "Crear la canalización"

En la siguiente ventana debe asignar un nombre a su nuevo flujo de trabajo (canalización) y seleccionar la opción Nuevo rol de servicio, este rol permitirá que CodePipeline tenga acceso a los recursos necesarios para la integración continua y la entrega continua con los servicios de CodeCommit, CodeBuild, ECR y Elastic Beanstalk. Pipeline asignará automáticamente el nombre del rol, si usted lo desea puede cambiar este nombre y personalizarlo.

Nota: Si ya cuenta con un rol creado que tenga los permisos necesarios puede seleccionar la opción Rol de servicio existente.

CodePipeline crea por defecto un nuevo Bucket de S3 para almacenar los artefactos. Los artefactos son la descripción de un conjunto de acciones con la finalidad de permitir que los procesos finalicen correctamente.

El nombre del bucket se crea automáticamente con la siguiente estructura, codepipeline-región-12345EXAMPLE, donde región es la región de AWS en la que se creó el pipeline y 12345EXAMPLE es un número aleatorio de 12 dígitos que garantiza que el nombre del bucket sea único.

En la sección "Configuración avanzada" podrá modificar algunas características del almacenamiento de los artefactos. Si ya cuenta con un bucket de S3 puede elegirlo para almacenar los artefactos allí, por otro lado, puede seleccionar si la clave de cifrado es administrada por usted o por AWS. En este caso los valores se dejarán por defecto. Por último, de clic en el botón siguiente.

En la nueva ventana debe seleccionar el origen del código de la aplicación, para este caso será AWS CodeCommit.

Nota: Dentro de las opciones se encuentra GitHub, el cual es uno de los repositorios más usado por desarrolladores a nivel mundial.

A continuación, debe seleccionar el nombre del repositorio, para este caso será "Repo-Pipeline-Container" el cual fue creado en pasos anteriores de este manual, por último, seleccione la rama donde se encuentra la aplicación, para este caso será master.

Dentro de la etapa de origen encontrará una sección para cambiar las opciones de detección de cambios en el código de la aplicación y en el repositorio. Las opciones disponibles para la detección de los cambios son Amazon CloudWatch y AWS CodePipeline, para este caso se dejarán los valores por defecto.

La detección de los cambios realizados disparará de forma automática el proceso de canalización (Continous Delivery).

Por último, de clic en el botón siguiente.

En la siguiente ventana se encontrará la sección de compilación donde se podrá seleccionar dos opciones de proveedor (AWS CodeBuild y Jenkins), para este caso se utilizará AWS CodeBuild.

Después de seleccionado el proveedor se habilitarán nuevas opciones como la región y la selección del proyecto de compilación. Si ya cuenta con un proyecto creado en CodeBuild puede buscarlo, en caso contrario deberá crear un nuevo proyecto dando clic en el botón "Crear el proyecto"

De clic en el botón "siguiente".

En la siguiente ventana se procederá con la configuración de la etapa de implementación, en esta sección se deberá seleccionar el proveedor de implementación, para este caso se seleccionará AWS Elastic Beanstalk ya que sobre este servicio fue donde se desplego por primera vez la aplicación (Actividad 1).

Después de seleccionar el proveedor se debe configurar la región, el nombre de la aplicación, el cual es el nombre de la aplicación creada en la Actividad 1 y el nombre del entorno, que igualmente es el entorno creado en la Actividad 1.

Por último, dar clic en el botón siguiente.

En la última página se mostrará el resumen de la configuración del Pipeline, si está conforme con ella, de clic en el botón "Crear la canalización".

Después de finalizada la configuración del Pipeline observara una ventana como la siguiente en la cual se observa el proceso que lleva flujo de trabajo iniciando por la identificación de los cambios en el repositorio de CodeCommit, a continuación, se realiza la compilación del proyecto en CodeBuild y por último se procede con el despliegue de la aplicación a través del servicio Elastic Beanstalk.

Si el proceso termina correctamente observará una imagen como la siguiente.

A continuación, diríjase a Elastic Beanstalk para ver el estado de la aplicación y abra nuevamente la URL en el navegador para ver los cambios efectuados en la aplicación.

Como se observa en la imagen, la aplicación se ha actualizado correctamente.

Puede observar el historial de versiones en la sección Versiones de la aplicación de Elastic Beanstalk.

En la imagen se puede evidenciar que la versión actualmente implementada es la que se desplegó a través de CodePipeline.

[1] https://docs.aws.amazon.com/es_es/codepipeline/latest/userguide/welcome-introducing-artifacts.html

[2] https://aws.amazon.com/es/codepipeline/faqs/?nc=sn&loc=5

[3] https://aws.amazon.com/es/elasticbeanstalk/

[4] https://docs.aws.amazon.com/es_es/codecommit/latest/userguide/getting-started.html#getting-started-create-repo

[5] https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-container.html

[6] https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html

[7] https://docs.aws.amazon.com/codebuild/latest/userguide/sample-elastic-beanstalk.html

[8] https://docs.aws.amazon.com/es_es/codepipeline/latest/userguide/welcome-introducing-artifacts.html

[9] https://aws.amazon.com/es/codebuild/

[10] https://docs.docker.com/docker-hub/

[11] https://docs.aws.amazon.com/es_es/elasticbeanstalk/latest/dg/docker.html

[12] https://docs.aws.amazon.com/es_es/codebuild/latest/userguide/sample-docker.html