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, de 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. El ejemplo de implementación se centra en el aprovisionamiento de Amazon Virtual Private Cloud (Amazon VPC) y 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 terragrunt.hcl archivos a la configuración del repositorio.

  • Algunos Servicios de AWS no están disponibles en todos Regiones de AWS. Para ver la disponibilidad regional, consulta AWS Servicios por región. Para conocer puntos de enlace específicos, consulte Puntos de enlace y cuotas del servicio y elija el enlace para el servicio.

Arquitectura

El siguiente diagrama muestra 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.

El diagrama de arquitectura muestra las siguientes acciones:

  1. El usuario envía una carga útil JSON a GitHub Actions, lo que activa 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 el despliegue controlado y automatizado de los recursos en todas partes. 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 funciones de IAM en cada cuenta.

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 le 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 ampliació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 GitHub sample-aws-orchestration-pipeline-terraform.

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.

  • Siga el principio de privilegios mínimos y conceda los permisos mínimos necesarios para realizar 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 GitHub repositorio.

Para inicializar el GitHub repositorio, siga estos pasos:

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

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

DevOps ingeniero

Configure las funciones y los permisos de IAM.

Para configurar las funciones y los permisos 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. Adjunta los permisos necesarios a la función 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— Su 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 de repositorios, siga estos pasos:

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

  2. Asigne un nombre a la carpeta en minúsculas 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, sigue estos pasos:

  1. Crea un archivo payload.json en tu directorio local. Sigue la estructura definida para el archivo de carga útil y estratifícala antes de enviar la solicitud. Para obtener más información, consulta los ejemplos de cargas útiles en el repositorio.

  2. Envía la solicitud en tu terminal mediante la GitHub API, tal y 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, proporciona tus propios valores para lo siguiente:

    • YOUR_GITHUB_TOKENcon tu token de acceso GitHub personal

    • OWNERcon el nombre del propietario del repositorio

    • REPOcon 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

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

Para validar los resultados, siga los siguientes 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 AWS Management Console 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 CIDR y otras configuraciones.

    2. Para Amazon S3:

      • Navegue hasta los buckets de Amazon S3.

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

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

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

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Presente una solicitud de limpieza.

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

  1. Envíe la solicitud de eliminación mediante el mismo punto final 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 create solicitud.

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

  3. Una vez finalizado el flujo de trabajo, compruebe que el changelog.json archivo contenido en la carpeta de recursos muestre el estado dedeleted.

  4. Compruebe la eliminación de recursos mediante AWS Management Console.

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 recursos en el entorno de destino AWS

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, vpc_cidr donde se definen las especificaciones del bloque CIDR para la VPC. El depósito de estado de Terraform se asigna a una variable definida en los archivos. terraform El ref parámetro contiene el nombre de la rama 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" } } ] } }

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

  • RequestId— Identificador único de 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 organización

  • EnvironmentId— Medio ambiente (por ejemplo, dev y prod)

  • Suffix— Identificador adicional para los recursos

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