Cree un marco de orquestación de recursos basado en API con GitHub Actions y Terragrunt - 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.

Cree un marco de orquestación de recursos basado en API con GitHub Actions y Terragrunt

Tamilselvan P, Abhigyan Dandriyal, Sandeep Gawande y Akash Kumar, Amazon Web Services

Resumen

Este patrón aprovecha los flujos de trabajo de GitHub Actions para automatizar el aprovisionamiento de recursos mediante cargas JSON estandarizadas, lo que elimina la necesidad de realizar una configuración manual. Esta canalización automatizada gestiona todo el ciclo de vida de la implementación y puede integrarse sin problemas con varios sistemas frontend, desde componentes de interfaz de usuario personalizados hasta componentes de interfaz de usuario personalizados. ServiceNow La flexibilidad de la solución permite a los usuarios interactuar con el sistema a través de sus interfaces preferidas y, al mismo tiempo, mantener los procesos estandarizados.

La arquitectura de canalización configurable se puede adaptar para cumplir con diferentes requisitos organizativos. La implementación de ejemplo se centra en el aprovisionamiento de Amazon Virtual Private Cloud (Amazon VPC) y de Amazon Simple Storage Service (Amazon S3). El patrón aborda de manera efectiva los desafíos comunes de administración de los recursos de la nube al estandarizar las solicitudes en toda la organización y proporcionar puntos de integración consistentes. Este enfoque facilita a los equipos la solicitud y la administración de los recursos y, al mismo tiempo, garantiza la estandarización.

Requisitos previos y limitaciones

Requisitos previos 

  • Un activo Cuenta de AWS

  • Una GitHub cuenta activa con acceso al repositorio configurado

Limitaciones

  • Los nuevos recursos requieren la adición manual de archivos terragrunt.hcl a la configuración del repositorio.

  • Algunas Servicios de AWS no están disponibles en todos Regiones de AWS. Para obtener información sobre la disponibilidad en regiones, consulte AWS Services by Region. Para ver los puntos de conexión específicos, consulte Service endpoints and quotas y elija el enlace del servicio.

Arquitectura

En el siguiente diagrama se muestran los componentes y el flujo de trabajo de este patrón.

Flujo de trabajo para automatizar el aprovisionamiento de recursos con GitHub Actions y Terraform.

En el siguiente diagrama de arquitectura se muestran las siguientes acciones:

  1. El usuario envía una carga útil de JSON a GitHub Actions, lo que desencadena el proceso de automatización.

  2. La canalización de GitHub Actions recupera el código de recursos necesario de los repositorios de Terragrunt y Terraform, en función de las especificaciones de la carga útil.

  3. La canalización asume la función AWS Identity and Access Management (IAM) adecuada con el ID especificado. Cuenta de AWS A continuación, la canalización despliega los recursos en el destino Cuenta de AWS y administra el estado de Terraform mediante el bucket de Amazon S3 específico de la cuenta y la tabla de Amazon DynamoDB.

Cada uno Cuenta de AWS contiene funciones de IAM para un acceso seguro, un depósito de Amazon S3 para el almacenamiento de estados de Terraform y una tabla de DynamoDB para el bloqueo de estados. Este diseño permite la implementación controlada y automatizada de los recursos en todas las Cuentas de AWS. El proceso de implementación mantiene una administración del estado y un control de acceso adecuados a través de buckets de Amazon S3 dedicados y roles de IAM en cada cuenta.

Tools (Herramientas)

Servicios de AWS

  • Amazon DynamoDB es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.

  • AWS Identity and Access Management (IAM) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.

  • Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que lo ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.

  • Amazon Virtual Private Cloud (Amazon VPC) le ayuda a lanzar AWS recursos en una red virtual que haya definido. Esa red virtual es similar a la red tradicional que utiliza en su propio centro de datos, con los beneficios de usar la infraestructura escalable de AWS.

Otras herramientas

  • GitHub Actions es una plataforma de integración y entrega continuas (CI/CD) que está estrechamente integrada con los repositorios. GitHub Puedes usar GitHub Actions para automatizar tu proceso de creación, prueba e implementación.

  • Terraform es una herramienta de infraestructura como código (IaC) HashiCorp que te ayuda a crear y administrar recursos locales y en la nube.

  • Terragrunt es una herramienta de orquestación que amplía las capacidades de Terraform y las de Terraform. OpenTofu Administra la forma en que se aplican los patrones de infraestructura genéricos, lo que facilita la escalación y el mantenimiento de grandes conjuntos de infraestructuras.

Repositorio de código

El código de este patrón está disponible en el repositorio -terraform. GitHub sample-aws-orchestration-pipeline

Prácticas recomendadas

  • Almacene AWS las credenciales y los datos confidenciales utilizando los secretos GitHub del repositorio para un acceso seguro.

  • Configure el proveedor OpenID Connect (OIDC) para que GitHub Actions asuma la función de IAM y evite las credenciales estáticas.

  • Cumpla con el principio de privilegio mínimo y conceda los permisos mínimos necesarios para llevar a cabo una tarea. Para obtener más información, consulte Otorgar privilegio mínimo y Prácticas recomendadas de seguridad en la documentación de IAM.

Epics

TareaDescripciónHabilidades requeridas

Inicialice el repositorio. GitHub

Para inicializar el GitHub repositorio, siga estos pasos:

  1. Cree un GitHub repositorio nuevo para alojar el código de canalización.

  2. Importe los archivos deployment.yml y workflow-trigger.yml que se encuentran en la carpeta .github/workflows del repositorio de origen.

DevOps ingeniero

Configure los permisos y roles de IAM

Para configurar los permisos y roles de IAM, siga estos pasos:

  1. Cree un rol de IAM con las relaciones de confianza necesarias para que GitHub Actions se conecte a las acciones AWS mediante un proveedor de identidades (IdP) de OpenID Connect (OIDC).

  2. Adjunte los permisos necesarios al rol de IAM para crear el backend y los recursos deseados. Para obtener más información, consulte un ejemplo de política para crear una VPC con Amazon VPC junto con el bucket de Amazon S3 de backend y la tabla de DynamoDB.

DevOps ingeniero

Configura GitHub secretos y variables.

Para obtener instrucciones sobre cómo configurar los secretos y las variables del repositorio en el GitHub repositorio, consulte Crear variables de configuración para un repositorio en la GitHub documentación. Configure las siguientes variables:

  • Secretos del repositorio

    • PAT_TOKEN— Tu token de acceso personal con los permisos para realizar GitHub operaciones

  • Variables de repositorio

DevOps ingeniero

Cree la estructura del repositorio.

Para crear la estructura del repositorio, siga estos pasos:

  1. Cree una nueva carpeta en la ramificación main para almacenar el archivo terragrunt.hcl, así como las salidas y los registros de cambios tras la creación del recurso.

  2. Asigne un nombre en minúsculas a la carpeta según el tipo de recurso que desee aprovisionar a través de ella. La carpeta se usa tal cual más adelante en la carga útil. Para obtener más información, consulte un ejemplo de estructura para Amazon S3 y Amazon VPC en el repositorio.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Ejecute la canalización con curl.

Para ejecutar la canalización mediante curl, siga estos pasos:

  1. Cree un archivo payload.json en su directorio local. Siga la estructura definida para el archivo de carga útil y estratifíquela antes de enviar la solicitud. Para obtener más información, consulte las cargas útiles de ejemplo en el repositorio.

  2. Envía la solicitud en tu terminal mediante la GitHub API, como se muestra en el siguiente ejemplo:

    curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token YOUR_GITHUB_TOKEN" \ -d @payload.json \ https://api.github.com/repos/OWNER/REPO/actions/workflows/workflow-trigger.yml/dispatches

    En el ejemplo, proporcione sus propios valores para lo siguiente:

    • YOUR_GITHUB_TOKENcon tu token de acceso GitHub personal

    • OWNER con el nombre de usuario del propietario del repositorio

    • REPO con el nombre del repositorio

Para obtener más información sobre el proceso de ejecución de la canalización, consulte Información adicional.

DevOps ingeniero

Validación de los resultados de la ejecución de la canalización

Para validar los resultados, siga estos pasos:

  1. Supervisa la ejecución del flujo de trabajo de GitHub acciones en la pestaña Acciones de tu repositorio.

  2. Tras la ejecución correcta de los flujos de trabajo, compruebe la creación de los recursos de la Consola de administración de AWS siguiente manera:

    1. Para Amazon VPC:

      • Navegue hasta el servicio Amazon VPC en el lugar especificado. Región de AWS

      • Compruebe si hay una nueva VPC con etiquetas que coincidan con los parámetros de su solicitud.

      • Verifique el bloque de CIDR y otras configuraciones.

    2. Para Amazon S3:

      • Navegue hasta los buckets de Amazon S3.

      • En los buckets de uso general, compruebe si hay un bucket nuevo que coincida con los parámetros de su solicitud.

      • Verifique el nombre del bucket de S3 y otras configuraciones.

También puede realizar una verificación cruzada de los recursos creados mediante el archivo output.json creado en el repositorio que se encuentra dentro del mismo recurso que el archivo terragrunt.hcl.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Envíe una solicitud de limpieza.

Para eliminar recursos que ya no son necesarios, siga estos pasos:

  1. Envíe la solicitud de eliminación mediante el mismo punto de conexión de la API, pero modifique la carga útil de la siguiente manera:

    • Cambie RequestType a delete en RequestParameters.

    • Mantenga todos los demás parámetros idénticos a los de la solicitud de create.

  2. Supervisa el proceso de eliminación en GitHub Actions.

  3. Una vez finalizado el flujo de trabajo, verifique que el archivo changelog.json dentro de la carpeta de recursos muestre el estado de deleted.

  4. Compruebe la eliminación de recursos mediante la Consola de administración de AWS.

DevOps ingeniero

Recursos relacionados

AWS Blogs

Servicio de AWS documentación

GitHub resources

Información adicional

Proceso de ejecución en canalización

Los siguientes son los pasos de la ejecución de la canalización:

  1. Valida el formato de carga útil JSON: garantiza que la configuración JSON entrante esté estructurada correctamente y contenga todos los parámetros necesarios

  2. Asume la función de IAM especificada: autentica y asume la función de IAM requerida para las operaciones AWS

  3. Descarga el código de Terraform y Terragrunt necesario: recupera la versión especificada del código de recursos y las dependencias

  4. Ejecuta el despliegue de recursos: aplica la configuración para implementar o actualizar los AWS recursos en el entorno de destino

Ejemplo de carga útil utilizada para la creación de VPC

A continuación, se muestra un ejemplo de código para la creación de un bucket de estado del backend de Terraform:

state_bucket_name = "${local.payload.ApplicationName}-${local.payload.EnvironmentId}-tfstate"
lock_table_name = "${local.payload.ApplicationName}-${local.payload.EnvironmentId}-tfstate-lock"

A continuación se muestra un ejemplo de carga útil para crear una VPC con Amazon VPC, donde vpc_cidr define las especificaciones del bloque de CIDR para la VPC. El bucket de estado de Terraform se asigna a una variable definida en los archivos terraform. El parámetro ref contiene el nombre de la ramificación del código que se va a ejecutar.

{ "ref": "main", "inputs": { "RequestParameters": { "RequestId": "1111111", "RequestType": "create", "ResourceType": "vpc", "AccountId": "1234567890", "AccountAlias": "account-alias", "RegionId": "us-west-2", "ApplicationName": "myapp", "DivisionName": "division-name", "EnvironmentId": "dev", "Suffix": "poc" }, "ResourceParameters": [ { "VPC": { "vpc_cidr": "10.0.0.0/16" } } ] } }

Los RequestParameters se utilizan para rastrear el estado de la solicitud en la sección de canalización y tfstate se crea en función de esta información. Los parámetros siguientes contienen información de control y metadatos:

  • RequestId: identificador único para la solicitud

  • RequestType: tipo de operación (crear, actualizar o eliminar)

  • ResourceType: tipo de recurso que se va a aprovisionar

  • AccountId— Objetivo de Cuenta de AWS despliegue

  • AccountAlias— Nombre descriptivo para el Cuenta de AWS

  • RegionId— Región de AWS para el despliegue de recursos

  • ApplicationName: nombre de la aplicación.

  • DivisionName: división de la organización

  • EnvironmentId: entorno (por ejemplo, desarrollo y producción)

  • Suffix: identificador adicional para los recursos

Los ResourceParameters contienen una configuración específica del recurso que se asigna a las variables definidas en los archivos de Terraform. Se debe incluir en ResourceParameters cualquier variable personalizada que deba pasarse a los módulos de Terraform. El parámetro vpc_cidr es obligatorio para Amazon VPC.