

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 CI/CD canalización para cargas de trabajo híbridas en Amazon ECS Anywhere mediante AWS CDK y GitLab
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab"></a>

*Rafael Ortiz, Amazon Web Services*

## Resumen
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-summary"></a>

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
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-prereqs"></a>

**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](https://docs.gitlab.com/ee/user/project/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](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (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](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) (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](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) (documentación de npm).

**Limitaciones**
+ Para ver las limitaciones y consideraciones, consulte [Instancias externas (Amazon ECS Anywhere)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations) en la documentación de Amazon ECS.

**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
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-architecture"></a>

**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 de la configuración del clúster y la CI/CD canalización de Amazon ECS.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/b0f35986-a839-4b01-8eb0-4748182ddafc/images/85b8d4d9-3591-4d69-a54b-64aa543498f1.png)


Este diagrama representa dos flujos de trabajo principales descritos en este patrón: el aprovisionamiento del clúster de Amazon ECS y la configuración de la CI/CD canalización que configura e implementa la CI/CD canalización, 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.

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

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

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

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

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

1. **Configuración e implementación de la CI/CD canalización**

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

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

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

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

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

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

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

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

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

**Automatización y escala**

Este patrón emplea AWS CDK como herramienta de infraestructura como código (IaC) para configurar e implementar esta arquitectura. AWS CDK le ayuda a organizar los recursos de AWS y a configurar Amazon ECS Anywhere y la CI/CD canalización.

## Tools (Herramientas)
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-tools"></a>

**Servicios de AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) es un marco de desarrollo de software que le ayuda a definir y aprovisionar la infraestructura en la nube de AWS en código.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 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](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 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)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 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)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 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](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html), que permite registrar un servidor en las instalaciones o una máquina virtual en el clúster de Amazon ECS.

**Otras herramientas**
+ [Node.js](https://nodejs.org/en/docs/) es un entorno de JavaScript ejecución basado en eventos diseñado para crear aplicaciones de red escalables.
+ [npm](https://docs.npmjs.com/about-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](https://developer.hashicorp.com/vagrant/docs) 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](https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample).

## Prácticas recomendadas
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-best-practices"></a>

Tenga en cuenta las siguientes prácticas recomendadas al implementar este patrón:
+ [Prácticas recomendadas para desarrollar e implementar una infraestructura de nube con AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)
+ [Prácticas recomendadas para desarrollar aplicaciones en la nube con AWS CDK](https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/) (publicación del blog de AWS)

## Epics
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-epics"></a>

### Verificar la configuración de AWS CDK
<a name="verify-the-aws-cdk-configuration"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Verifique la versión de AWS CDK. | Compruebe la versión del kit de herramientas de AWS CDK ejecutando el siguiente comando.<pre>cdk --version</pre>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](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) para actualizarla. | DevOps ingeniero | 
| Verifique la versión de npm. | Verifique la versión de npm introduciendo el siguiente comando.<pre>npm --version</pre>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](https://docs.npmjs.com/try-the-latest-stable-version-of-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.<pre>$aws configure<br />AWS Access Key ID [None]: <your-access-key-ID><br />AWS Secret Access Key [None]: <your-secret-access-key><br />Default region name [None]: <your-Region-name><br />Default output format [None]:</pre> | DevOps ingeniero | 

### Inicie el entorno de AWS CDK
<a name="bootstrap-the-aws-cdk-environment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Clonar el repositorio de código de AWS CDK. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingeniero | 
| Arranque el entorno de . | Implemente la CloudFormation plantilla en la cuenta y la región de AWS que desee utilizar introduciendo el siguiente comando.<pre>cdk bootstrap <account-number>/<Region></pre>Para obtener más información, consulte [Proceso de arranque](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html) en la documentación de AWS CDK. | DevOps ingeniero | 

### Creación e implementación de la infraestructura para Amazon ECS Anywhere
<a name="build-and-deploy-the-infrastructure-for-amazon-ecs-anywhere"></a>


| Tarea | Descripción | Habilidades 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.<pre>$cd EcsAnywhereCdk<br />$npm install<br />$npm fund </pre>Estos comandos instalan todos los paquetes del repositorio de muestra. Para obtener más información, consulte [npm ci](https://docs.npmjs.com/cli/v7/commands/npm-ci) y [npm install](https://docs.npmjs.com/cli/v7/commands/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](#set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting) de este patrón. | DevOps ingeniero | 
| Compilar el proyecto. | Para construir el código del proyecto, introduzca el siguiente comando.<pre>npm run build</pre>Para obtener más información sobre la compilación e implementación del proyecto, consulte [Su primera aplicación de AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html#:~:text=the%20third%20parameter.-,Synthesize%20an%20AWS%20CloudFormation%20template,-Synthesize%20an%20AWS) en la documentación de AWS CDK. | DevOps ingeniero | 
| Implemente la pila de infraestructura de Amazon ECS Anywhere. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingeniero | 
| Verifique la creación y el resultado de la pila. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingeniero | 

### Configure una máquina virtual en las instalaciones
<a name="set-up-an-on-premises-vm"></a>


| Tarea | Descripción | Habilidades 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](https://developer.hashicorp.com/vagrant/docs/cli/up). | DevOps ingeniero | 
| Registre su máquina virtual como instancia externa. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html)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](https://docs.amazonaws.cn/en_us/AmazonECS/latest/developerguide/ecs-anywhere-registration.html) en la documentación de Amazon ECS. Si tiene algún problema, consulte la sección [Solución de problemas](#set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting). | 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.<pre>$aws ssm describe-instance-information<br />$aws ecs list-container-instances --cluster $CLUSTER_NAME</pre> | DevOps ingeniero | 

### Despliegue la CI/CD canalización
<a name="deploy-the-ci-cd-pipeline"></a>


| Tarea | Descripción | Habilidades 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](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-commit.html#create-first-commit). El siguiente comando es un ejemplo.<pre>aws codecommit put-file \<br />  --repository-name EcsAnywhereRepo \<br />  --branch-name main \<br />  --file-path README.md \<br />  --file-content "Test" \<br />  --name "Dev Ops" \<br />  --email "devops@example.com" \<br />  --commit-message "Adding README."</pre> | 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](https://docs.gitlab.com/ee/user/project/repository/mirror/push.html#set-up-a-push-mirror-from-gitlab-to-aws-codecommit) (GitLab documentación).De manera predeterminada, la replicación sincroniza automáticamente el repositorio. Si desea actualizar manualmente los repositorios, consulte [Actualizar una réplica](https://docs.gitlab.com/ee/user/project/repository/mirror/#update-a-mirror) (GitLab documentación). | DevOps ingeniero | 
| Despliegue la pila de CI/CD canalizaciones. | Implementar la pila de `EcsAnywherePipelineStack` introduciendo el siguiente comando.<pre>$cdk  deploy EcsAnywherePipelineStack</pre> | DevOps ingeniero | 
| Pruebe la CI/CD tubería. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingeniero | 

### Limpieza
<a name="clean-up"></a>


| Tarea | Descripción | Habilidades 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.<pre>$cdk destroy EcsAnywherePipelineStack<br />$cdk destroy EcsAnywhereInfraStack</pre> | DevOps ingeniero | 

## Resolución de problemas
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting"></a>


| Problema | Solució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.<pre>$npm ci</pre>o<pre>$npm install -g @aws-cdk/<package_name></pre> | 
| 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.<pre>$vagrant ssh<br />$sudo systemctl restart ecs<br />$sudo systemctl status ecs</pre> | 

## Recursos relacionados
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-resources"></a>
+ [Página de marketing de Amazon ECS Anywhere](https://aws.amazon.com/ecs/anywhere/)
+ [Documentación de Amazon ECS Anywhere](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations)
+ [Demostración de Amazon ECS Anywhere](https://www.youtube.com/watch?v=-eud6yUXsJM) (video)
+ [Muestras de talleres de Amazon ECS Anywhere](https://github.com/aws-samples/aws-ecs-anywhere-workshop-samples) (GitHub)
+ [Duplicación de repositorios (documentación](https://docs.gitlab.com/ee/user/project/repository/mirror/)) GitLab 