Crear automáticamente canalizaciones de CI/CD y clústeres de Amazon ECS para microservicios mediante AWS CDK - Recomendaciones de AWS

Crear automáticamente canalizaciones de CI/CD y clústeres de Amazon ECS para microservicios mediante AWS CDK

Varsha Raju, Amazon Web Services

Resumen

Este patrón describe cómo crear automáticamente las canalizaciones de integración y entrega continuas (CI/CD) y la infraestructura subyacente para crear e implementar microservicios en Amazon Elastic Container Service (Amazon ECS). Puede utilizar este enfoque si desea configurar canalizaciones de CI/CD de prueba de concepto para mostrar a su organización los beneficios de las CI/CD, los microservicios y DevOps. También puede utilizar este enfoque para crear canalizaciones iniciales de CI/CD que, a continuación, podrá personalizar o cambiar según los requisitos de su organización. 

El enfoque del patrón crea un entorno de producción y un entorno de no producción, cada uno con una nube privada virtual (VPC) y un clúster de Amazon ECS configurado para ejecutarse en dos zonas de disponibilidad. Todos sus microservicios comparten estos entornos y, a continuación, usted crea una canalización de CI/CD para cada microservicio. Estas canalizaciones de CI/CD extraen los cambios de un repositorio de origen en AWS CodeCommit, compilan automáticamente los cambios y, a continuación, los implementan en sus entornos de producción y no producción. Cuando una canalización completa correctamente todas sus etapas, puede usar las URL para acceder al microservicio en los entornos de producción y no producción.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de Amazon Web Services (AWS) activa.

  • Un bucket de Amazon Simple Storage Service (Amazon S3) existente que contiene el archivo starter-code.zip (adjunto).

  • AWS Cloud Development Kit (AWS CDK), instalado y configurado en su cuenta. Para obtener más información al respecto, consulte Introducción a AWS CDK en la documentación de AWS CDK.

  • Python 3 y pip, instalado y configurado. Para obtener más información, consulte la documentación de Python.

  • Conocimientos de AWS CDK, AWS CodePipeline, AWS CodeBuild, CodeCommit, Amazon Elastic Container Registry (Amazon ECR), Amazon ECS y AWS Fargate.

  • Conocimientos de Docker.

  • Comprensión de CI/CD y DevOps.

Limitaciones

  • Se aplican límites generales a las cuentas de AWS. Para obtener más información al respecto, consulte AWS Service Quotas en la documentación de referencia general de AWS.

Versiones de producto

  • El código se probó usando Node.js versión 16.13.0 y AWS CDK versión 1.132.0.

Arquitectura

Nube de AWS architecture diagram showing CI/CD pipeline and deployment to production and non-production VPCs.

En el diagrama, se muestra el siguiente flujo de trabajo:

  1. Un desarrollador de aplicaciones envía el código a un repositorio de CodeCommit.

  2. Se inicia una canalización.

  3. CodeBuild crea y pasa la imagen de Docker a un repositorio de Amazon ECR

  4. CodePipeline implementa una nueva imagen en un servicio Fargate existente en un clúster de Amazon ECS de no producción.

  5. Amazon ECS extrae la imagen del repositorio de Amazon ECR y la coloca en un servicio Fargate de no producción.

  6. Las pruebas se realizan mediante una URL de no producción.

  7. El administrador de versiones aprueba la implementación de producción.

  8. CodePipeline implementa la nueva imagen en un servicio Fargate existente en un clúster Amazon ECS de producción

  9. Amazon ECS extrae la imagen del repositorio de Amazon ECR y la coloca en el servicio Fargate de producción.

  10. Los usuarios de producción acceden a su característica mediante una URL de producción.

Pila de tecnología  

  • AWS CDK

  • CodeBuild

  • CodeCommit 

  • CodePipeline

  • Amazon ECR 

  • Amazon ECS 

  • Amazon VPC

Automatizar y escalar

Puede utilizar el enfoque de este patrón para crear canalizaciones para microservicios implementados en una pila compartida de AWS CloudFormation. La automatización puede crear más de un clúster de Amazon ECS en cada VPC y también crear canalizaciones para los microservicios implementados en un clúster de Amazon ECS compartido. Sin embargo, esto requiere que proporcione nueva información sobre los recursos como entradas a la pila de canalizaciones.

Herramientas

  • AWS CDK: AWS Cloud Development Kit (AWS CDK) es un marco de desarrollo de software para definir la infraestructura de nube en el código y aprovisionarla mediante AWS CloudFormation.

  • AWS CodeBuild: AWS CodeBuild es un servicio de compilación completamente administrado en la nube. CodeBuild compila su código fuente, ejecuta pruebas unitarias y produce artefactos listos para la implementación.

  • AWS CodeCommit – AWS CodeCommit es un servicio de control de versión que permite almacenar de forma privada y administrar repositorios de Git en la nube de AWS. CodeCommit elimina la necesidad de gestionar un sistema propio de control de código fuente o de preocuparse acerca de la adaptación de su infraestructura.

  • AWS CodePipeline: AWS CodePipeline es un servicio de entrega continua que puede utilizar para modelar, visualizar y automatizar los pasos necesarios para lanzar su software. Puede diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software. Codepipeline automatiza los pasos necesarios para liberar sus cambios de software continuamente.

  • Amazon ECS: Amazon Elastic Container Service (Amazon ECS) es un servicio de administración de contenedores altamente escalable y rápido que se utiliza para ejecutar, detener y administrar contenedores en un clúster. Las tareas y los servicios se pueden ejecutar en una infraestructura sin servidor administrada por AWS Fargate. Alternativamente, para obtener más control sobre su infraestructura, puede ejecutar sus tareas y servicios en un clúster de instancias de Amazon Elastic Compute Cloud (Amazon EC2) que administre.

  • Docker: Docker ayuda a los desarrolladores a empaquetar, enviar y ejecutar cualquier aplicación como un contenedor ligero, portátil y autosuficiente.

Código

El código de este patrón está disponible en los archivos cicdstarter.zip y starter-code.zip (adjuntos).

Epics

TareaDescripciónHabilidades requeridas
Configure el directorio de trabajo de AWS CDK.
  1. Cree un directorio denominado cicdproject en su máquina local.

  2. Descargue el archivo cicdstarter.zip (adjunto) al directorio cicdproject y descomprímalo. Esto crea una carpeta denominada cicdstarter.

  3. Ejecute el comando cd <user-home>/cicdproject/cicdstarter

  4. Configure el entorno virtual de Python ejecutando el comando python3 -m venv .venv.

  5. Ejecute el comando source ./.venv/bin/activate.

  6. Configure su entorno de AWS ejecutando el comando aws configure o utilizando las siguientes variables de entorno: 

    • AWS_ACCESS_KEY_ID

    • AWS_SECRET_ACCESS_KEY 

    • AWS_DEFAULT_REGION

DevOps de AWS, infraestructura de nube
TareaDescripciónHabilidades requeridas
Cree la infraestructura compartida.
  1. En su directorio de trabajo, ejecute el comando cd cicdvpcecs

  2. Ejecute el comando pip3 install -r requirements.txt para instalar todas las dependencias de Python necesarias.

  3. Ejecute el cdk bootstrap command para configurar el entorno de AWS para AWS CDK. 

  4. Ejecute el comando cdk synth --context aws_account=<aws_account_ID> --context aws_region=<aws-region>

  5. Ejecute el comando cdk deploy --context aws_account=<aws_account_ID> --context aws_region=<aws-region>.

  6. La pila de AWS CloudFormation crea la siguiente infraestructura:

    • Una VPC de no producción denominada cicd-vpc-ecs/cicd-vpc-nonprod

    • Una VPC de producción denominada cicd-vpc-ecs/cicd-vpc-prod

    • Un clúster de Amazon ECS de no producción denominado cicd-ecs-nonprod

    • Un clúster de Amazon ECS de producción denominado cicd-ecs-prod

DevOps de AWS, infraestructura de nube
Supervise la pila de AWS CloudFormation.
  1. Inicie sesión en la consola de administración de AWS, abra la consola de AWS CloudFormation y, a continuación, seleccione la pila cicd-vpc-ecs de la lista. 

  2. En el panel de detalles de la pila, seleccione la pestaña Eventos y supervise el progreso de la creación de la pila.

DevOps de AWS, infraestructura de nube
Prueba de la pila de AWS CloudFormation.
  1. Una vez creada la pila cicd-vpc-ecs de AWS CloudFormation, asegúrese de que se creen las VPC cicd-vpc-ecs/cicd-vpc-nonprod y cicd-vpc-ecs/cicd-vpc-prod

  2. Asegúrese de que se creen los clústeres de Amazon ECS cicd-ecs-nonprod y cicd-ecs-prod.

importante

Asegúrese de registrar los ID de las dos VPC y los ID de los grupos de seguridad correspondientes a los grupos de seguridad predeterminados en ambas VPC.

DevOps de AWS, infraestructura de nube
TareaDescripciónHabilidades requeridas
Cree la infraestructura para el microservicio.
  1. Asigne un nombre a su microservicio. Por ejemplo, este patrón utiliza myservice1 como nombre del microservicio.

  2. En su directorio de trabajo, ejecute el comando cd <working-directory>/cdkpipeline.

  3. Ejecute el comando pip3 install -r requirements.txt.

  4. Ejecute el comando cdk synth completo que está disponible en la sección de Información adicional de este patrón.

  5. Ejecute el comando cdk deploy completo que está disponible en la sección de Información adicional de este patrón.

nota

También puede proporcionar los valores de ambos comandos mediante el archivo cdk.json del directorio.

DevOps de AWS, infraestructura de nube
Supervise la pila de AWS CloudFormation.

Abra la consola de AWS CloudFormation y supervise el progreso de la pila myservice1-cicd-stack. Finalmente, el estado cambia a CREATE_COMPLETE.

DevOps de AWS, infraestructura de nube
Prueba de la pila de AWS CloudFormation.
  1. En la consola AWS CodeCommit, verifique que existe un repositorio denominado myservice1 y que contiene el código de inicio.

  2. En la consola AWS CodeBuild, verifique que existe un proyecto de compilación denominado myservice1.

  3. En la consola de Amazon ECR, verifique que existe un repositorio de Amazon ECR denominado myservice1.

  4. En la consola de Amazon ECS, verifique que exista un servicio de Fargate denominado myservice1 en un clúster de Amazon ECS tanto de no producción como de producción.

  5. En la consola de Amazon Elastic Compute Cloud (Amazon EC2), verifique que se hayan creado los equilibradores de carga de aplicaciones de no producción y de producción. Registre los nombres DNS de los ALB.

  6. En la consola de AWS CodePipeline, verifique que existe una canalización denominada myservice1. Debe tener las etapas Source, Build, Deploy-NonProd y Deploy-Prod. La canalización también debe tener un estado in progress.

  7. Supervise la canalización hasta que se completen todas las etapas. 

  8. Apruébela manualmente para la producción.

  9. En una ventana del navegador, introduzca los nombres DNS de los ALB.

  10. La aplicación debería mostrar Hello World en las URL de no producción y de producción.

Use la canalización.
  1. Abra el repositorio de CodeCommit que creó anteriormente y abra el archivo index.js

  2. Sustituya Hello World por Hello CI/CD.

  3. Guarde y confirme los cambios en la rama principal.

  4. Verifique que la canalización se inicie y que el cambio pase por las etapas Build, Deploy-NonProd y Deploy-Prod 

  5. Apruebe la producción manualmente.

  6. Ahora las URL tanto de producción como de no producción deberían mostrar Hello CICD.

DevOps de AWS, infraestructura de nube
Repita esta épica para cada microservicio.

Repita las tareas de esta épica para crear una canalización de CI/CD para cada uno de sus microservicios.

DevOps de AWS, infraestructura de nube

Recursos relacionados

Información adicional

cdk synth comando

cdk synth --context aws_account=<aws_account_number> --context aws_region=<aws_region> --context vpc_nonprod_id=<id_of_non_production VPC> --context vpc_prod_id=<id_of_production_VPC> --context ecssg_nonprod_id=< default_security_group_id_of_non-production_VPC> --context ecssg_prod_id=<default_security_group_id_of_production_VPC> --context code_commit_s3_bucket_for_code=<S3 bucket name> --context code_commit_s3_object_key_for_code=<Object_key_of_starter_code> --context microservice_name=<name_of_microservice>

cdk deploy comando

cdk deploy --context aws_account=<aws_account_number> --context aws_region=<aws_region> --context vpc_nonprod_id=<id_of_non_production_VPC> --context vpc_prod_id=<id_of_production_VPC> --context ecssg_nonprod_id=< default_security_group_id_of_non-production_VPC> --context ecssg_prod_id=<default_security_group_id_of_production_VPC> --context code_commit_s3_bucket_for_code=<S3 bucket name> --context code_commit_s3_object_key_for_code=<Object_key_of_starter_code> --context microservice_name=<name_of_microservice>

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip