Nombre:

Tutorial #5 - AWS Code Deploy con AWS Fargate

Duración:

90 minutos

Profesor responsable

Mario Villamizar

Pre-Requisitos:

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

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, AWS Codepipeline y la consola de administración web de AWS

AWS Fargate es un servicio que permite la implementación de contenedores de una forma sencilla sin la administración de Servidores o Clusters. Con AWS Fargate solo debe concentrarse en el desarrollo de la aplicación ya que Fargate se encargará de la implementación y ejecución de esta.

AWS Fargate es compatible con Amazon ECS donde se podrán ejecutar contenedores sin la necesidad de crear instancias en Amazon EC2.

Amazon ECS es un servicio que permite la administración de contenedores y permite un rápido escalamiento y facilidad en la ejecución y administración de contenedores Docker en un cluster.

Amazon ECS permite el lanzamiento de aplicaciones basadas en contenedores con llamadas a la API.

Amazon ECS es compatible con AWS CodeDeploy y tener despliegues Blue/Green lo cual permite tener en producción 2 versiones de una aplicación y realizar testeo sobre la nueva versión. Si se requiere, puede realizar rollback en caso de fallas o modificaciones necesarias.

Amazon ECS se ejecuta en la región de su preferencia y simplifica la ejecución de contenedores con alta disponibilidad en diversas zonas de disponibilidad dentro de la misma región. Al crear un cluster en ECS podrá crear definiciones de tareas, las cuales especifican las imágenes de contenedor que se ejecutarán dentro de los clusters. Puede almacenar las imágenes de contenedor utilizando el servicio de Amazon ECS.

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

https://github.com/WeimarG/taller_codedeploy_fargate.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.

Para realizar una implementación Blue/Green utilizando los servicios CodeDeploy y Amazon ECS, se requieren un conjunto de permisos para actualizar el servicio creado en Amazon ECS. Para proporcionar estos permisos se debe asignar un rol de IAM en el servicio de Amazon ECS.

Para iniciar con la creación del Rol, ingrese a la consola de administración de AWS y en el menú servicios seleccione IAM.

Se abrirá una nueva ventana, en el panel izquierdo seleccione la opción Roles y a continuación de clic en el botón Create role.

Nuevamente se abrirá una nueva ventana, diríjase a la sección Select type of trusted entity y seleccione la opción AWS service.

Dentro de las opciones de servicios que encontrará, seleccione CodeDeploy.

A continuación, se abrirán las opciones de caso de uso para CodeDeploy, seleccione CodeDeploy – ECS y de clic en el botón Next:Permissions.

En la siguiente fase se deben asignar las políticas que tendrá el Rol para su correcto funcionamiento. Por defecto se asigna la política AWSCodeDeployRoleForECS.

De clic en Next:tags y posteriormente en Next: Review

Asigne un nombre para su Rol y de clic en el botón Create role.

Busque su Rol y selecciónelo, podrá observar el resumen de la configuración que tiene.

Diríjase a la pestaña Permissions y de clic en el botón Attach policies

Busque y asigne las siguientes políticas al Rol.

Después de esto podrá observar en el resumen del Rol las políticas que tiene asignadas.

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.

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 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.

De clic en su repositorio, se abrirá el listado de imágenes. En la parte superior derecha de clic en el botón Ver Comandos push.

Observará todos los comandos que debe ejecutar en su máquina local para la creación de la imagen y posterior cargue al repositorio ECR.

Abra una consola en su máquina y diríjase a la ruta donde se encuentra su código.

A continuación, inicie sesión en AWS ecr utilizando el primer comando.

Nota: Si presenta algún error al iniciar sesión o al hacer el push, debe asignar los permisos necesarios al usuario que usa para AWS CLI. Diríjase al servicio de IAM en la consola de AWS, seleccione su usuario y asigne la política AmazonElasticContainerRegistryPublicFullAccess

Cree la imagen docker con el segundo comando.

Recuerde que para ejecutar el comando docker build, debe tener creado en su repositorio el archivo Dockerfile.

Al finalizar la compilación, ejecute el tercer comando para crear una etiqueta a la imagen que acaba de crear.

Por último, realice el push de la imagen con el cuarto comando.

Después de finalizado el push, diríjase a su repositorio de ECR y refresque la página. Podrá observar la imagen que acaba de cargar.

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

En el menú desplegable de la izquierda, seleccione la opción Target Groups y a continuación, seleccione el botón Create target group.

En la nueva ventana seleccione IP addresses para el target type, adicional, asigne un nombre para el target group, y defina el protocolo y puerto que usa su aplicación (para este caso, HTTP y el puerto 5000), por último, de clic en next

En la siguiente ventana deje los valores por defecto y de clic en el botón Create target group.

Cree un segundo target group con las mismas características del anterior, solo modifique el nombre.

A continuación, cree el balanceador de carga de aplicación.

En el menú desplegable de la izquierda, seleccione la opción Load Balancers y a continuación, seleccione el botón Create Load Balancer.

Se abrirá una nueva ventana, seleccione el tipo de balanceador Application Load Balancer y de clic en el botón crear.

En la sección Basic configuration, asigne un nombre al balanceador y deje las demás opciones por defecto.

En la sección Network mapping seleccione su VPC y las subredes que desea utilizar en el balanceador.

En la sección Security groups, seleccione el grupo de seguridad que desee o cree uno nuevo con las reglas necesarias para la conexión a su aplicación. En este caso se usará un grupo de seguridad que permita todo el tráfico in/out.

En la sección Listeners and routing, agregue dos listener, el primero con el puerto 80 y asigne el target-group-1 (creado anteriormente), y el segundo listener con el puerto 8080 y asigne el target-group-2 (creado anteriormente)

Por último, de clic en el botón Create load balancer.

Ingrese a la consola de administración de AWS y en el menú servicios seleccione Elastic Container Service.

En la esquina superior izquierda encontrará un menú de opciones, seleccione la opción Clusters.

A continuación, seleccione la opción Create Cluster y seleccione el cluster template, para este caso, seleccione Networking only y de clic en el botón Next step.

En la nueva ventana, agregue un nombre para el Cluster y deje los siguientes campos por defecto.

Finalice dando clic en el botón Create.

Después de creado el Cluster, se debe proceder con la creación de la definición de la tarea la cuál especifica la información del contenedor para la aplicación, recursos y puertos del host.

En la ventana principal de ECS seleccione la opción Task Definition.

De clic en el botón Create new Task Definition.

En la nueva ventana debe seleccionar el tipo de compatibilidad de la definición de la tarea, para este caso, seleccione la opción FARGATE. A continuación, de clic en el botón Next step.

En la nueva ventana deberá configurar la tarea y la definición de la tarea.

En la primera sección de configuración, agregue un nombre para la tarea y la familia del sistema operativo.

A continuación, debe asignar un rol para la ejecución de la tarea, con este rol se extraerán las imágenes del contenedor y publicar los registros en CloudWatch.

Si aún no cuenta con un rol para la ejecución de tareas en ECS debe proceder con la creación de este, para esto seleccione la opción Create new role.

En la siguiente sección, seleccione la cantidad de memoria y cpu que usará la tarea.

A continuación, debe definir el contenedor para la aplicación, de clic en el botón Add container.

Se abrirá una ventana emergente donde debe agregar un nombre para el contenedor y la URI (ruta) de la imagen que subió con anterioridad al repositorio de ECR.

Para identificar la URI de su imagen, diríjase a ECR, seleccione su repositorio y en las propiedades de la imagen seleccione la opción Copy URI.

Regrese nuevamente a la definición del contenedor y pegue la URI de su imagen.

Posterior a esto, asigne el límite de memoria (cantidad en MB) que consumirá el contenedor y el puerto que usará el contenedor para exponer la aplicación.

Para nuestra aplicación de prueba el puerto definido es el 5000.

Deje los siguientes campos por defecto y de clic en el botón Add.

Regresará a la configuración de la tarea, deje los siguientes campos por defecto y de clic en el botón Create.

Al finalizar la configuración observará una ventana con el Launch Status, en este podrá observar el rol que se creó, guarde este nombre ya que posteriormente se le deben asignar diferentes permisos para el correcto funcionamiento.

Por último, de clic en el botón view task definition.

Después de creado el cluster y la task definition se debe proceder con la creación del Servicio en el cual se especifica cuántas copias del task definition se ejecutarán, el tipo de despliegue (para este caso blue/green) y el balanceador de carga que se utilizará en el despliegue para la distribución de tráfico.

Diríjase nuevamente a la sección de clusters y seleccione el que creó anteriormente.

Al abrir las propiedades del cluster encontrará diferentes pestañas con los detalles de configuración.

Seleccione la pestaña Services y de clic en el botón Create.

Aparecerá la configuración del servicio, seleccione el tipo de lanzamiento (para este caso Fargate), la familia del sistema operativo, el task definition (creado anteriormente), el cluster (creado anteriormente), el nombre del servicio y la cantidad de task que correrán en su cluster.

A continuación, debe configurar el tipo de despliegue, para este ejemplo el despliegue será Blue/Green y se desvía el 10 por ciento del tráfico cada minuto al contenedor ECS actualizado hasta que se desvía todo el tráfico, adicional, seleccione el Rol que creo en la actividad 1 el cual tendrá los permisos necesarios para realizar la implementación sobre CodeDeploy.

Deje los siguientes campos por defecto y de clic en el botón Next step.

En el siguiente paso asigne la VPC, Subredes y el grupo de seguridad.

Por defecto, el servicio creará un nuevo Grupo de Seguridad, sobre este deberá modificar las reglas de entrada para que esté permitido el tráfico por el puerto que usa su contenedor (en este caso, puerto 5000).

Por otro lado, si no desea crear un nuevo grupo de seguridad y utilizar uno ya creado, seleccione el botón Edit en la opción Security groups* y en la nueva ventana seleccione el grupo de seguridad que desea y guarde los cambios.

En la sección Load balancing seleccione la opción Application Load Balancer y seleccione el Balanceador de carga que creó en la actividad 3.

En la sección Container to load balance seleccione el nombre del contenedor creado en el task definition y el puerto y de clic en el botón Add to load balancer. A continuación, se desplegará la configuración del balanceo de carga para el balanceador.

Seleccione el puerto 80 como Production listener port y el 8080 para el test listener port.

En la sección Additional configuration, seleccione los targets groups creados en la actividad 3 los cuales permitirán hacer el despliegue Blue/Green de la aplicación.

De clic en el botón Next step, lo llevará a la ventana de configuración de Auto escalamiento, deje los valores y configuración por defecto y nuevamente de clic en Next Step.

Observará la ventana de Riview, verifique que su configuración es correcta y finalice dando clic en el botón Create Service.

Al finalizar la configuración del servicio observará que hay 2 tareas en ejecución que corresponden a 2 contenedores corriendo la aplicación. Puede acceder a la aplicación a través del DNS name de su balanceador de carga.

Diríjase al Target-group-1 y en la pestaña Targets observará dos IP las cuales corresponden a los contenedores a los cuales se redirige el tráfico del balanceador

Por otro lado, puede validar el correcto funcionamiento de los contenedores accediendo a la aplicación a través de la IP pública de estos.

De clic en cualquiera de las tareas que se encuentran en ejecución en su Cluster de ECS y en los detalles observará la IP pública, recuerde que los contenedores fueron configurados para servir la aplicación a través del puerto 5000.

Al seleccionar la opción de despliegue Blue/Green en el servicio de ECS se creará automáticamente una aplicación en CodeDeploy, puede observarla ingresando a la consola de administración de AWS y en el menú servicios seleccione CodeDeploy.

A continuación, seleccione la opción Applications.

Se profundizará más sobre CodeDeploy en los siguientes pasos.

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

Adicional, deberá construir y definir los artefactos imagedefinition.json, imageDetails.json, appspec.json y taskdef.json

appspec.json

Este archivo determina:

Los valores que debe modificar en el archivo appspec.json son:

Texto\n\nDescripción generada automáticamente

taskdef.json

Este archivo contiene toda la definición de tareas que utiliza ECS, en él se especifica:

Texto\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 y 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.

En fuente, seleccione AWS CodeCommit y elija el repositorio que acaba de crear.

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 IAM de AWS y de clic en la opción "Roles".

Busque el rol que acaba de crear, para este caso, "CodeBuild-app-python" 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 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, CodeDeploy, ECR y ECS. 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, dónde 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-app-python" 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á Amazon ECS (Blue/green) ya que sobre este servicio fue donde se desplego por primera vez la aplicación (Actividad 4).

Después de seleccionar el proveedor se debe configurar el nombre de la aplicación de AWS CodeDeploy, y el grupo de implementación de AWS CodeDeploy, los cuales se crearon automáticamente en la actividad 4.

A continuación, deberá asignar los artefactos de entrada para la etapa de implementación, los cuales corresponden a los archivos taskdef.json y appspec.json que se crearon anteriormente y el artefacto con los detalles de la imagen "imageDetail.json" el cual está definido en el archivo buildspec.yml.

Por último, en la casilla "Texto de marcador de posición en la definición de tarea", debe colocar el mismo valor de imagen que definió en el archivo taskdef.json.

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".

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

Después de finalizada la configuración del Pipeline observara una ventana como la siguiente en la cual se observa el proceso que lleva el 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 Amazon ECS (Blue/Green).

Después de completado la etapa de Buil o construcción (etapa 2), diríjase a CodeDeploy para observar la distribución del tráfico entre la versión anterior de la aplicación (Blue) y la nueva versión (Green) que acaba de lanzar.

Al finalizar la transferencia de todo el tráfico a la nueva versión de la aplicación, el pipeline finalizará.

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

Realice una modificación en el código de la aplicación y realice un nuevo push al repositorio de CodeCommit.

El Pipeline iniciará nuevamente y en CodeDeploy podrá observar la distribución de tráfico.

Por último, acceda a la aplicación a través del DNS de su balanceador de carga.

Refresque la página varias veces, hasta que acceda a la nueva versión de su aplicación.

Al finalizar la transferencia del tráfico solo podrá acceder a la nueva versión de la aplicación. Si requiere hacer roll back, de clic en el botón

[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://docs.aws.amazon.com/es_es/cli/latest/userguide/cli-chap-configure.html

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

[5] https://docs.aws.amazon.com/es_es/codecommit/latest/userguide/setting-up-git-remote-codecommit.html#setting-up-git-remote-codecommit-prereq

[6] https://docs.aws.amazon.com/es_es/codecommit/latest/userguide/setting-up-git-remote-codecommit.html#setting-up-git-remote-codecommit-install

[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/codecommit/latest/userguide/troubleshooting-ch.html

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

[13] https://docs.aws.amazon.com/es_es/codecommit/latest/userguide/setting-up-https-windows.html

[14] https://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/create-blue-green.html

[15] https://docs.aws.amazon.com/es_es/codepipeline/latest/userguide/file-reference.html

[16] https://docs.aws.amazon.com/es_es/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html

[17] https://docs.aws.amazon.com/es_es/codepipeline/latest/userguide/file-reference.html#file-reference-ecs-bluegreen

[18] https://docs.aws.amazon.com/es_es/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html