Nuestro equipo consta de un desarrollador y un ingeniero de DevOps. Soy responsable de implementar la aplicación en el clúster de Amazon ECS. Como servidor CI / CD, uso Bamboo. En este artículo, describiré en detalle cómo implemento una aplicación en un entorno de desarrollo.


Construir una imagen de Docker
Aquí sigo estos pasos:
- Paso 1: Instalar y configurar Docker;
- Paso 2: Configurar artefactos en Bamboo;
- Paso 3: configurar el repositorio de Amazon ECR;
- Paso 4: compila la imagen de Docker en Bamboo.
Paso 1: Instalar y configurar Docker
Primero, actualizo el servidor donde está instalado Bamboo, instalo los paquetes necesarios y configuro el repositorio de Docker. Cabe señalar que instalé Bamboo en el sistema operativo CentOS 7. La información sobre la instalación de Docker en otros sistemas operativos se puede encontrar en
www.docker.com .
$ sudo yum update $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Luego instalo la aplicación Docker e inicio el servicio:
$ sudo yum install docker-ce docker-ce-cli containerd.io $ sudo systemctl enable docker $ sudo systemctl start docker
Luego agrego el usuario de bambú al grupo Docker:
$ sudo usermod -aG docker bamboo $ sudo su - bamboo $ docker run hello-world
Si, después de ejecutar estos comandos, Docker responde con el mensaje "¡Hola desde Docker!", Entonces esto significa que mi instalación funciona correctamente.
Paso 2. Configurar artefactos en Bamboo
El desarrollo de aplicaciones está en marcha en
Grails . Al compilar la aplicación, se crea un archivo con la extensión war. Este archivo, en terminología de Bamboo, es un artefacto. Configure Bamboo para usar este archivo en tareas posteriores. Para hacer esto, voy a la pestaña
Tareas :

Y configuré la tarea de Grails, como se muestra a continuación:

Vemos que Grails primero borra la carpeta de compilación, luego ejecuta las pruebas y finalmente crea un archivo war para el entorno de desarrollo.
Después de eso, hago clic en la pestaña
Artefactos y en el botón
Crear artefacto :

Defino un artefacto como se muestra a continuación:

Grails coloca el archivo war en el directorio
build / libs . Comprobaré el parámetro
Shared , ya que necesitaré este artefacto más adelante.
Ahora estoy creando un proyecto de implementación y especificando un artefacto para usar en mi plan de compilación:


También configuré la tarea de
descarga de artefactos en el proyecto de implementación:

Por lo tanto, Bamboo ahora está configurado para usar un archivo war.
Paso 3. Configurar el repositorio de Amazon ECR
Amazon ECR es un servicio de almacenamiento y administración de Docker para imágenes. Para configurar, abra la consola de AWS y seleccione ECR:

Una vez creado el repositorio, obtengo la siguiente dirección:
aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard
Después de completar la configuración, aquí también puede encontrar instrucciones sobre cómo iniciar sesión, cómo descargar una imagen del repositorio y cargar la imagen en el repositorio.
Paso 4: compila la imagen de Docker en Bamboo
Ahora necesito configurar el disparador para comenzar a construir la imagen de Docker. Para hacer esto, voy a la pestaña
Disparadores y hago clic en el botón
Agregar disparador :

Aquí selecciono la opción Construir después de compilar
correctamente el plan para que la imagen de Docker se construya después de compilar el proyecto.
Ahora necesitamos agregar la tarea de creación de imágenes Docker. Para hacer esto, vaya a la pestaña
Tareas , haga clic en
Agregar tarea , seleccione el tipo
Docker . Ingrese una descripción y seleccione
Crear una imagen de Docker en el menú desplegable. En el campo
Repositorio , ingrese
aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard:latest.
En cuanto al Dockerfile, puede ser como se muestra a continuación:
FROM openjdk:8-jre COPY *.war /usr/src/onboard.war WORKDIR /usr/src CMD ["/bin/bash", "-c", "java -DdataSource.url=$DATASOURCE_URL -DdataSource.username=$DATASOURCE_USERNAME -DdataSource.password=$DATASOURCE_PASSWORD -jar onboard.war"]
Cuando inicia la aplicación, debe especificar la base de datos. Las variables de entorno DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD se utilizan para transmitir esta información a la aplicación, pero sus valores se establecen cuando se inicia el contenedor.
Esto completa el proceso de configuración para ensamblar la imagen de Docker con la aplicación. El siguiente paso es configurar la descarga de esta imagen en el repositorio de Amazon ECR.

Subir imagen a Elastic Container Registry
Puede usar el Elastic Container Registry para almacenar imágenes recopiladas con Bamboo. Para lograr esto, sigo estos pasos:
- Paso 1. Instalar Amazon ECR Docker Credential Helper
- Paso 2. Conecte la función IAM al servidor Bamboo
- Paso 3: Configurar el trabajo de arranque de la imagen Docker
Paso 1. Instalar Amazon ECR Docker Credential Helper
Para descargar imágenes de Docker a Amazon ECR, debe tener credenciales. Estas credenciales se pueden obtener ejecutando el comando
aws ecr get-login
Sin embargo, estas credenciales solo son válidas por 12 horas. Por lo tanto, puede ejecutar el comando anterior cada vez antes de cargar la imagen en el ECR, o instalar el Docker Credential Helper de ECR, que mantiene las credenciales temporales actualizadas e inicia sesión en el ECR. Siga estos pasos para instalar ECR Docker Credential Helper.
Primero necesita instalar
git y luego clonar el repositorio de github:
$ sudo yum install git $ sudo su - bamboo $ git clone https://github.com/awslabs/amazon-ecr-credential-helper.git $ make docker
Luego debe colocar las siguientes líneas en el archivo
/home/bamboo/.docker/config.json :
{ "credsStore": "ecr-login" }
Y copie la aplicación compilada en el
directorio / usr / bin :
$ exit $ sudo cp /home/bamboo/docker-credential-ecr-login /usr/bin/
Paso 2. Conecte la función IAM al servidor Bamboo
Para que el servidor Bamboo pueda usar ECR, debe crear un rol, agregar la política
AmazonEC2ContainerRegistryPowerUser a este rol y luego adjuntar este rol a la instancia de EC2 Bamboo. Abra la consola de AWS y seleccione IAM. A continuación, haga clic en el botón
Crear rol , seleccione el
servicio AWS y
EC2 , como se muestra a continuación:

Luego hacemos clic en el botón
Siguiente: Permisos y en la siguiente pantalla encontramos y seleccionamos la política
AmazonEC2ContainerRegistryPowerUser . Después de eso, terminamos de crear el rol y lo adjuntamos a nuestro servidor Bamboo.
Paso 3: Configurar el trabajo de arranque de la imagen Docker
La aplicación que creamos y creamos una imagen de Docker con un archivo de guerra. Ahora necesita subir esta imagen al repositorio. Para hacer esto, agrego otra tarea de Docker, esta vez para cargar la imagen en el repositorio de ECR. Voy a la pestaña
Tareas , hago clic en
Agregar tarea , selecciono el tipo
Docker . Entro en una descripción y selecciono
Insertar una imagen de Docker en un registro de Docker en el menú desplegable. Selecciono
Registro personalizado e ingreso la dirección del repositorio en el campo
Repositorio . Para el
tipo de autenticación, selecciono
Usar las credenciales nativas del agente .
Esto completa el proceso de configuración para cargar la imagen de Docker en el repositorio de Amazon ECR. Los siguientes pasos describen el proceso de configuración de un clúster y un servicio para iniciar una aplicación de contenedor. Pero antes de eso, debe configurar las opciones de inicio para el contenedor. Esto es lo que haremos ahora.

Crear definición de tarea de Amazon ECS
Definición de tarea: aquí se escriben los parámetros de ejecución del contenedor. Nuestra aplicación utiliza una base de datos cuyos parámetros se especifican cuando se inicia el contenedor, por lo que en esta sección también crearemos una base de datos. Utilizo
Amazon RDS como la base de datos y almaceno la contraseña para acceder a la base de datos en forma cifrada en
AWS Systems Manager Parameter Store . Los siguientes pasos que sigo para crear una Definición de tarea:
- Paso 1. Crear una base de datos en una instancia de Amazon RDS;
- Paso 2. Configuración del almacén de parámetros de AWS Systems Manager;
- Paso 3. Crear definición de tarea.
Paso 1. Crear una base de datos en una instancia de Amazon RDS
Nuestra aplicación utiliza la base de datos PostgreSQL. Para crear una base de datos, abra la consola de AWS, seleccione el servicio Amazon RDS, haga clic en el botón
Crear base de datos , luego seleccione
PostgreSQL como motor de base de datos. En la página siguiente, selecciono
Dev / Test como el entorno de trabajo y hago clic en
Siguiente . Luego designo el
identificador de instancia de DB como onboard-dev-db , y el
nombre de usuario maestro como
devdbadmin . Luego voy a la página siguiente para configurar la VPC, el grupo de subred y el grupo de seguridad. Esta base de datos se usará en una red privada, por lo que selecciono
No para el parámetro
Accesibilidad pública .
Entro en
devdb en el
campo Nombre de la
base de datos y
hago clic en el botón
Crear base de datos .
Paso 2. Configuración del almacén de parámetros de AWS Systems Manager
Guardo la contraseña de la base de datos en forma cifrada. Para hacer esto, abra la consola de AWS y vaya a AWS Systems Manager → Recursos compartidos → Almacén de parámetros → Crear parámetro.
Ingreso devdbpassword como
nombre del parámetro y selecciono
SecureString para el tipo de parámetro, luego ingreso la contraseña de la base de datos en el campo
Valor .
Paso 3. Crear definición de tarea
Amazon ECS es el clúster donde se ejecutan las aplicaciones de contenedor. Utiliza la Definición de tarea para especificar parámetros de ejecución para una aplicación contenedor. Para establecer dichos parámetros, haga clic en el botón
Crear nueva definición de tarea . Luego selecciono
Fargate como el
tipo de inicio y paso al siguiente paso. Aquí configuro el nombre como
onboard-dev-taskdef . Para el parámetro del
campo de rol IAM de ejecución de tarea , seleccione
Crear nuevo rol . En cuanto a los recursos asignados para esta aplicación, designo 2 GB de memoria y 1 vCPU. Ahora necesita agregar opciones de inicio de contenedor. Voy a nombrar el contenedor
onboard-dev-container . Voy a nombrar el nombre de la imagen así:
aws_account_id.dkr.ecr.us-east-2.amazonaws.com/onboard:latest . Amazon ECR Docker Credential Helper se encargará de la autenticación ECR, por lo que dejo la opción de
autenticación de repositorio privado sin marcar. En el entorno de desarrollo, la aplicación está disponible en el puerto 8080, por lo que para el parámetro de mapeo de puertos escribo
8080 y selecciono el protocolo
tcp . Los parámetros de URL de la base de datos, el nombre de usuario y la contraseña se pasan al contenedor utilizando variables de entorno. Establecí estos parámetros en la sección Variables de entorno. Para obtener el valor del parámetro
devdbpassword del
Almacén de parámetros, especifico el tipo
ValueFrom . Lo último que configuro es la configuración del
registro , aquí selecciono
Configurar automáticamente los registros de CloudWatch . Ahora la creación de la definición de tarea está completa.
Sin embargo, el rol ecsTaskExecutionRole necesita una política para obtener devdbpassword del Almacén de parámetros. Para hacer esto, vaya a Roles de IAM y seleccione ecsTaskExecutionRole, haga clic en
Agregar política en línea . En este caso, estoy agregando usando un editor visual. Por lo tanto, en el campo Servicio, entro en
Systems Manager , en el campo Acciones -
GetParameters . Luego hago clic en
Agregar ARN para el campo Recursos y complete mis valores:

Al final, miro los valores de los parámetros que se establecen haciendo clic en Revisar política, le doy un nombre y termino de trabajar con la configuración ecsTaskExecutionRole.
Esto completa la configuración de la configuración de la aplicación del contenedor de inicio. Ahora necesita crear un clúster y servicio ECS.

Crear servicio de Amazon ECS
Nuestra aplicación contenedor se ejecuta como un servicio en un clúster ECS. Para configurar, debe realizar los siguientes pasos:
- Paso 1. Crear un clúster de Amazon ECS;
- Paso 2: crear un servicio
Paso 1. Crear un clúster de Amazon ECS
Para crear un clúster ECS, vaya a la consola de AWS y seleccione el servicio ECS. Luego, haga clic en
Crear clúster y seleccione la plantilla de clúster de
solo redes . En la página siguiente, denomino el clúster como
onboard-dev-cluster y completo el clúster. Ahora tengo un clúster ECS basado en
Fargate .
Paso 2: crear un servicio
Para crear un servicio, hago clic en el enlace
onboard-dev-cluster , luego voy a la pestaña
Servicios y hago clic en el botón
Crear . Para el
tipo de inicio, selecciono Fargate, para
Definición de tarea, selecciono onboard-dev-taskdef. Además, selecciono onboard-dev-cluster en el campo Cluster. En el campo
Nombre del
servicio , escribo onboard-dev. Establecí el parámetro
Número de tareas en cero, ya que no quiero iniciar la aplicación en este momento. Dejo los valores
mínimos del parámetro de
porcentaje saludable a 100 y el parámetro de
porcentaje máximo a 200. Para el parámetro
Tipo de implementación , seleccione
Actualización continua y vaya al siguiente paso.
En la página
Configurar red , para el parámetro
Cluster VPC , selecciono una VPC creada anteriormente llamada
Development VPC . La aplicación en desarrollo solo está disponible en la red privada, por lo que elijo dos subredes privadas. Para configurar grupos de seguridad, hago clic en el botón
Editar , luego selecciono
Seleccionar grupo de seguridad existente , luego el grupo de seguridad
predeterminado y hago clic en el botón
Guardar . Para el parámetro
IP público de asignación automática , selecciono
Disabled . A continuación, para el parámetro
Tipo de equilibrador de carga , selecciono
Ninguno y dejo la opción
Habilitar integración de descubrimiento de servicios sin marcar . Luego hago clic en
Siguiente, Siguiente y
Crear servicio .
Ahora tengo un servicio en el que el número de trabajos en ejecución es cero. Configuraremos el inicio de la aplicación en el siguiente paso.

Actualización de servicio
Tan pronto como el desarrollador actualiza el código de la aplicación, nuestra implementación pasa por crear una imagen Docker, cargarla en el Elastic Container Registry y finalmente lanzar la aplicación contenedor como un servicio en el clúster ECS Fargate. En este momento, el número de trabajos que se ejecutan en el clúster es cero. Para que la aplicación se inicie, debe actualizar el servicio, indicando la cantidad igual a uno. Sigo estos pasos para lograr esto:
- Paso 1. Instalar las tareas para el complemento AWS Bamboo;
- Paso 2. Actualización del servicio ECS
Paso 1. Instalar las tareas para el plugin AWS Bamboo
Tareas para AWS Bamboo es un complemento que simplifica la preparación y el funcionamiento de los recursos de AWS de los proyectos de construcción e implementación de Bamboo. Para instalar este complemento, voy al proyecto de implementación, hago clic en
Agregar tarea , voy al Mercado Atlassian e instalo
Tareas para AWS (Bamboo) .
Paso 2. Actualización del servicio ECS
Ahora en el proyecto de implementación, estoy agregando el trabajo de
Amazon ECS Service . Luego escribo en el campo de descripción del trabajo
Servicio de actualización para onBoard-dev . En el campo Acción, seleccione
Actualizar servicio y
Forzar nueva implementación . Luego selecciono US East (Ohio) como la región de lanzamiento. Luego escribo en los campos apropiados ARN (nombre de recurso de Amazon) para la definición de tareas, el clúster y el servicio. En esta tarea, actualizo el número deseado de tareas en ejecución a una. A continuación, relleno el cuadro de texto de configuración de implementación con los siguientes valores:
{ "maximumPercent": 200, "minimumHealthyPercent": 100 }
Estoy configurando una red sin una IP pública de la siguiente manera:
{ "awsvpcConfiguration": { "assignPublicIp": "DISABLED", "subnets": ["subnet-ID1", "subnet-ID2"], "securityGroups": ["sg-ID"] } }
En la sección
Fuente de las
credenciales de seguridad de AWS, selecciono el
rol de IAM para EC2 .
Necesito poder actualizar ECS, por lo que
adjunto la política
AmazonECS_FullAccess a mi instancia Bamboo EC2. Para hacer esto, abra la consola de AWS, seleccione IAM. Luego selecciono la función que uso para mi servidor Bamboo. Hago clic en el botón
Adjuntar políticas , encuentro la política AmazonECS_FullAccess, marco la casilla a la izquierda y termino de adjuntar la política.
Esto concluye la configuración de CI / CD usando AWS y Bamboo. Por lo tanto, cuando el desarrollador actualiza el código de la aplicación, carga este código en el repositorio, se inician las pruebas y el ensamblaje de la aplicación. Luego, la imagen de Docker se crea con el archivo war de la aplicación, y esta imagen se copia en el repositorio de Amazon ECR. A continuación, en el clúster de Amazon ECS, se inicia una aplicación contenedor como un servicio, que actualiza la aplicación actual si no se ha detenido. Si la aplicación se detuvo para ahorrar recursos, la aplicación simplemente se inicia. Después de verificar la aplicación en el entorno de desarrollo, puede detener la aplicación especificando el número de trabajos que se ejecutan en el clúster a cero.
Si le gustó el artículo y tiene ideas para mejorar, escriba en los comentarios.