Configure una canalización de CI/CD para cargas de trabajo híbridas en Amazon ECS Anywhere mediante AWS CDK y GitLab - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configure una canalización de CI/CD para cargas de trabajo híbridas en Amazon ECS Anywhere mediante AWS CDK y GitLab

Creado por el Dr. Rahul Sharad Gaikwad (AWS)

Repositorio de código: - amazon-ecs-anywhere-cicd pipeline-cdk-sample

Entorno: PoC o piloto

Tecnologías: nube híbrida; contenedores y microservicios; infraestructura; DevOps

Carga de trabajo: código abierto

Servicios de AWS: AWS CDK; AWS CodePipeline; Amazon ECS; AWS Systems Manager; AWS CodeCommit

Resumen

Amazon ECS Anywhere es una extensión de Amazon Elastic Container Service (Amazon ECS). Permite registrar una instancia externa, como un servidor en las instalaciones o una máquina virtual (VM), en su clúster de Amazon ECS. Esta característica ayuda a reducir los costos y mitigar la compleja operativa y orquestación de los contenedores locales. Puede usar ECS Anywhere para implementar y ejecutar aplicaciones de contenedor tanto en entornos en las instalaciones como en la nube. Evita que su equipo tenga que aprender varios dominios y conjuntos de habilidades, o administrar software complejo por su cuenta.

Este patrón describe un step-by-step enfoque para aprovisionar un clúster de Amazon ECS con instancias de Amazon ECS Anywhere mediante pilas del Cloud Development Kit (AWS CDK) de Amazon Web Services (AWS). A continuación, utiliza AWS CodePipeline para configurar una canalización de integración e implementación continuas (CI/CD). A continuación, replica el repositorio de GitLab código en AWS CodeCommit e implementa la aplicación en contenedores en el clúster de Amazon ECS.

Este patrón está diseñado para ayudar a quienes utilizan la infraestructura local a ejecutar aplicaciones de contenedores y GitLab a administrar la base de código de la aplicación. Puede administrar esas cargas de trabajo con los servicios en la nube de AWS sin interrumpir su infraestructura existente en las instalaciones.

Requisitos previos y limitaciones

Requisitos previos

  • Una cuenta de AWS activa.

  • Una aplicación en contenedor ejecutada en una infraestructura en las instalaciones.

  • Un GitLab repositorio en el que puede administrar la base de código de su aplicación. Para obtener más información, consulte Repository (GitLab).

  • Interfaz de la línea de comandos de AWS (AWS CLI) instalada y configurada. Para obtener más información, consulte Instalar o actualizar la última versión de la CLI de AWS (documentación de la CLI de AWS).

  • Kit de herramientas de AWS CDK, instalado y configurado globalmente. Para más información, consulte Instalar el CDK de AWS (documentación sobre el CDK de AWS).

  • npm, instalado y configurado para la AWS CDK en. TypeScript Para obtener más información, consulte Descargar e instalar Node.js y npm (documentación de npm).

Limitaciones

Versiones de producto

  • Kit de herramientas de AWS CDK, versión 2.27.0 o posterior

  • npm versión 7.20.3 o posterior

  • Node.js versión 16.6.1 o posterior

Arquitectura

Pila de tecnología de destino

  • AWS CDK

  • AWS CloudFormation

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon ECS Anywhere

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS Identity y Access Management (IAM)

  • AWS Systems Manager

  • GitLab repositorio

Arquitectura de destino

Diagrama de arquitectura para configurar el clúster de Amazon ECS y el proceso de CI/CD.

Este diagrama presenta los dos flujos de trabajo principales descritos en este patrón: el aprovisionamiento del clúster de Amazon ECS y la configuración del proceso de CI/CD, que se configura e implementa de la siguiente manera:

  1. Aprovisionamiento del clúster de Amazon ECS

    1. Al implementar la primera pila de CDK de AWS, se crea una CloudFormation pila en AWS.

    2. Esta CloudFormation pila aprovisiona un clúster de Amazon ECS y los recursos de AWS relacionados.

    3. Para registrar una instancia externa en un clúster de Amazon ECS, debe instalar AWS Systems Manager Agent (SSM Agent) en su máquina virtual y registrar la máquina virtual como instancia gestionada por AWS Systems Manager. 

    4. También debe instalar el agente de contenedores de Amazon ECS y Docker en su máquina virtual para registrarla como instancia externa en el clúster de Amazon ECS.

    5. Cuando la instancia externa está ya registrada y configurada con el clúster de Amazon ECS, puede ejecutar varios contenedores en su máquina virtual, registrada como instancia externa.

    6. El clúster de Amazon ECS está activo y puede ejecutar las cargas de trabajo de la aplicación a través de contenedores. La instancia de contenedor de Amazon ECS Anywhere se ejecuta en un entorno en las instalaciones, pero está asociada al clúster de Amazon ECS en la nube.

  2. Configuración e implementación del proceso de CI/CD

    1. Al implementar la segunda pila de CDK de AWS, se crea otra CloudFormation pila en AWS.

    2. Esta CloudFormation pila proporciona una canalización CodePipeline y los recursos de AWS relacionados.

    3. Los cambios en el código de la aplicación se insertan y se combinan en un GitLab repositorio local. 

    4. El GitLab repositorio se replica automáticamente en el CodeCommit repositorio.

    5. Las actualizaciones del CodeCommit repositorio se inician automáticamente. CodePipeline 

    6. CodePipeline copia el código de la aplicación desplegable integrada CodeCommit y la crea. CodeBuild

    7. CodePipeline crea una imagen de Docker del entorno de CodeBuild compilación y la envía al repositorio de Amazon ECR.

    8. CodePipeline inicia CodeDeploy acciones que extraen la imagen del contenedor del repositorio de Amazon ECR.

    9. CodePipeline implementa la imagen del contenedor en el clúster de Amazon ECS.

Automatizar y escalar

Este patrón emplea AWS CDK como herramienta de infraestructura como código (IaC) para configurar e implementar esta arquitectura. AWS CDK le permite orquestar los recursos de AWS y configurar Amazon ECS Anywhere y el proceso de CI/CD.

Herramientas

Servicios de AWS

  • AWS Cloud Development Kit (AWS CDK) es un marco de desarrollo de software que le ayuda a definir y aprovisionar la infraestructura de la nube de AWS en código.

  • AWS CodeCommit es un servicio de control de versiones que le ayuda a almacenar y gestionar repositorios de Git de forma privada, sin necesidad de gestionar su propio sistema de control de código fuente.

  • AWS le CodePipeline ayuda a modelar y configurar rápidamente las diferentes etapas de una versión de software y a automatizar los pasos necesarios para publicar cambios de software de forma continua.

  • La interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en su intérprete de comandos de línea de comandos.

  • Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.

  • Amazon Elastic Container Service (Amazon ECS) es un servicio de administración de contenedores escalable y rápido que ayuda a ejecutar, detener y administrar contenedores en un clúster. Este patrón también emplea Amazon ECS Anywhere, que permite registrar un servidor en las instalaciones o una máquina virtual en el clúster de Amazon ECS.

Otras herramientas

  • Node.js es un entorno de JavaScript ejecución basado en eventos diseñado para crear aplicaciones de red escalables.

  • npm es un registro de software que se ejecuta en un entorno Node.js y se utiliza para compartir o tomar prestados paquetes y administrar la implementación de paquetes privados.

  • Vagrant es una utilidad de código abierto para compilar y mantener entornos de desarrollo de software virtual portátiles. Este patrón usa Vagrant con fines de demostración para crear una máquina virtual en las instalaciones.

Repositorio de código

El código de este patrón está disponible en la canalización de GitHub CI/CD de Amazon ECS Anywhere mediante el repositorio CDK de AWS.

Prácticas recomendadas

Tenga en cuenta las siguientes prácticas recomendadas al implementar este patrón:

Epics

TareaDescripciónHabilidades requeridas

Verifique la versión de AWS CDK.

Compruebe la versión del kit de herramientas de AWS CDK ejecutando el siguiente comando.

cdk --version

Este patrón requiere la versión 2.27.0 o posterior. Si tiene una versión anterior, siga las instrucciones de la documentación de AWS CDK para actualizarla.

DevOps ingeniero

Verifique la versión de npm.

Verifique la versión de npm introduciendo el siguiente comando.

npm --version

Este patrón requiere la versión 7.20.3 o posterior. Si tiene una versión anterior, siga las instrucciones de la documentación de npm para actualizarla.

DevOps ingeniero

Configure las credenciales de AWS.

Para configurar las credenciales de AWS, ejecute el comando aws configure y siga las instrucciones.

$aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
DevOps ingeniero
TareaDescripciónHabilidades requeridas

Clonar el repositorio de código de AWS CDK.

  1. Clone el repositorio Proceso de CI/CD para Amazon ECS Anywhere mediante AWS CDK para usarlo en este patrón ejecutando el siguiente comando.

    git clone https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample.git
  2. Acceda al directorio clonado ejecutando el siguiente comando.

    cd amazon-ecs-anywhere-cicd-pipeline-cdk-sample
DevOps ingeniero

Inicie el entorno.

Implemente la CloudFormation plantilla en la cuenta y la región de AWS que desee utilizar introduciendo el siguiente comando.

cdk bootstrap <account-number>/<Region>

Para obtener más información, consulte Proceso de arranque en la documentación de AWS CDK.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Instale las dependencias del paquete y compile los TypeScript archivos.

Instale las dependencias del paquete y compile los TypeScript archivos introduciendo los siguientes comandos.

$cd EcsAnywhereCdk $npm install $npm fund 

Estos comandos instalan todos los paquetes del repositorio de muestra. Para obtener más información, consulte npm ci y npm install en la documentación de npm. Si recibe algún error relacionado con la falta de paquetes al ejecutar estos comandos, consulte la sección de Solución de problemas de este patrón.

DevOps ingeniero

Compilar el proyecto.

Para construir el código del proyecto, introduzca el siguiente comando.

npm run build

Para obtener más información sobre la compilación e implementación del proyecto, consulte Su primera aplicación de AWS CDK en la documentación de AWS CDK.

DevOps ingeniero

Implemente la pila de infraestructura de Amazon ECS Anywhere.

  1. Haga una lista de las pilas introduciendo el siguiente comando.

    $cdk list
  2. Confirme que el resultado devuelve las pilas EcsAnywhereInfraStack y ECSAnywherePipelineStack.

  3. Implementar la pila de EcsAnywhereInfraStack introduciendo el siguiente comando.

    $cdk  deploy EcsAnywhereInfraStack
DevOps ingeniero

Verifique la creación y el resultado de la pila.

  1. Inicie sesión en la consola de administración de AWS y abra la CloudFormation consola en https://console.aws.amazon.com/cloudformation/.

  2. En la página Pilas, seleccione la pila EcsAnywhereInfraStack.

  3. Confirme que el estado de la pila es CREATE_IN_PROGRESS o CREATE_COMPLETE.

    La configuración del clúster de Amazon ECS puede llevar algún tiempo. No proceda hasta que se haya completado la creación de la pila.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Configurar su VM.

Cree una máquina virtual de Vagrant ejecutando el comando vagrant up desde el directorio raíz donde se encuentra Vagrantfile. Para obtener más información, consulte la documentación de Vagrant.

DevOps ingeniero

Registre su máquina virtual como instancia externa.

  1. Inicie sesión en la máquina virtual de Vagrant ejecutando el comando vagrant ssh. Para obtener más información, consulte la documentación de Vagrant.

  2. Instale la CLI de AWS en la máquina virtual siguiendo las instrucciones de instalación de la CLI de AWS y ejecute los siguientes comandos. 

    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \ > -o "awscliv2.zip" $sudo apt install unzip $unzip awscliv2.zip $sudo ./aws/install $aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
  1. Cree un código de activación y una ID que usará para registrar su máquina virtual en AWS Systems Manager y activar su instancia externa. El resultado de este comando incluye los valores de ID de activación y código de activación.

    aws ssm create-activation \ > --iam-role EcsAnywhereInstanceRole \ > | tee ssm-activation.json

    Si recibe un error al ejecutar este comando, consulte la sección Solución de problemas.

  2. Exporte los valores de ID de activación y código.

    export ACTIVATION_ID=<activation-ID> export ACTIVATION_CODE=<activation-code>
  3. Descargue el script de instalación en su máquina virtual.

    curl --proto "https" -o "ecs-anywhere-install.sh" \ > "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh"
  4. Ejecute el script de instalación en su VM.

    sudo bash ecs-anywhere-install.sh \ --cluster EcsAnywhereCluster \ --activation-id $ACTIVATION_ID \ --activation-code $ACTIVATION_CODE \ --region <region-name>

Este paso configura la máquina virtual como una instancia externa de Amazon ECS Anywhere, y registra la instancia en el clúster de Amazon ECS. Para obtener más información, consulte Registrar una instancia externa en un clúster en la documentación de Amazon ECS. Si tiene algún problema, consulte la sección Solución de problemas.

DevOps ingeniero

Compruebe el estado de Amazon ECS Anywhere y de la máquina virtual externa.

Para comprobar si su máquina virtual está conectada al plano de control de Amazon ECS y en funcionamiento, ejecute los siguientes comandos.

$aws ssm describe-instance-information $aws ecs list-container-instances --cluster $CLUSTER_NAME
DevOps ingeniero
TareaDescripciónHabilidades requeridas

Crea una rama en el CodeCommit repositorio.

Crea una rama con un nombre main en el CodeCommit repositorio creando la primera confirmación para el repositorio. Puede seguir la documentación de AWS para crear una confirmación CodeCommit. El siguiente comando es un ejemplo.

aws codecommit put-file \ --repository-name EcsAnywhereRepo \ --branch-name main \ --file-path README.md \ --file-content "Test" \ --name "Dev Ops" \ --email "devops@example.com" \ --commit-message "Adding README."
DevOps ingeniero

Configure la replicación de repositorios.

Puede duplicar un GitLab repositorio desde y hacia fuentes externas. Puede seleccionar qué repositorio servirá como origen. Las ramificaciones, las etiquetas y las confirmaciones se sincronizan automáticamente. Configura una réplica automática entre el GitLab repositorio que aloja tu aplicación y el CodeCommit repositorio. Para obtener instrucciones, consulte Configurar una réplica push de GitLab a CodeCommit (GitLab documentación).

Nota: De forma predeterminada, la replicación sincroniza automáticamente el repositorio. Si desea actualizar manualmente los repositorios, consulte Actualizar una réplica (GitLab documentación).

DevOps ingeniero

Implemente la pila proceso de CI/CD.

Implementar la pila de EcsAnywherePipelineStack introduciendo el siguiente comando.

$cdk  deploy EcsAnywherePipelineStack
DevOps ingeniero

Pruebe el proceso de CI/CD.

  1. Realice cambios en el código de la aplicación y envíelo al GitLab repositorio local de origen. Para obtener más información, consulte Opciones de inserción (GitLab documentación). Por ejemplo, edite el archivo ../application/index.html para actualizar el valor de versión de la aplicación.

  2. Cuando el código se replica en el CodeCommit repositorio, se inicia la canalización de CI/CD. Realice una de las acciones siguientes:

  3. En su máquina local, abra un navegador web y acceda a http://localhost:80. Se abrirá la página web de NGINX, ya que el puerto 80 se reenvía a localhost en Vagrantfile. Confirme que puede ver el valor de la versión actualizada de la aplicación. Este paso valida la implementación del proceso y la imagen.

  4. (Opcional) Si desea verificar la implementación en la consola de administración de AWS, haga lo siguiente:

    1. Abra la consola de Amazon ECS en https://console.aws.amazon.com/ecs/.

    2. En la barra de navegación, seleccione la región a utilizar.

    3. En el panel de navegación, seleccione Clusters (Clústeres).

    4. En la página Clústeres, seleccione el clúster. EcsAnywhereCluster

    5. Elija Definiciones de tareas.

    6. Confirme que el contenedor se está ejecutando.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Limpie y elimine los recursos.

Después de seguir este patrón, debe eliminar los proof-of-concept recursos que ha creado. Para limpiar, introduzca los siguientes comandos.

$cdk destroy EcsAnywherePipelineStack $cdk destroy EcsAnywhereInfraStack
DevOps ingeniero

Solución de problemas

ProblemaSolución

Errores relacionados con la falta de paquetes al instalar dependencias de paquetes.

Ejecute uno de los siguientes comandos para resolver los paquetes que faltan.

$npm ci

o

$npm install -g @aws-cdk/<package_name>

Al ejecutar el comando aws ssm create-activation en la máquina virtual, recibe el siguiente error.

An error occurred (ValidationException) when calling the CreateActivation operation: Nonexistent role or missing ssm service principal in trust policy: arn:aws:iam::000000000000:role/EcsAnywhereInstanceRole

La pila EcsAnywhereInfraStack no se ha implementado por completo, y el rol de IAM necesario para ejecutar este comando no se ha creado todavía. Comprueba el estado de la pila en la CloudFormation consola. Vuelva a intentar el comando después de que el estado cambie a CREATE_COMPLETE.

La comprobación de estado de Amazon ECS devuelve el resultado UNHEALTHY, y aparece el siguiente error en la sección Servicios del clúster en la consola de Amazon ECS.

service EcsAnywhereService was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.

Reinicie el agente de Amazon ECS en su máquina virtual de Vagrant ejecutando los siguientes comandos.

$vagrant ssh $sudo systemctl restart ecs $sudo systemctl status ecs

Recursos relacionados