CI / CD con AWS y Bamboo

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.

Source: https://habr.com/ru/post/458648/


All Articles