Implementación del Generador de cuentas para Terraform (AFT) mediante una canalización de arranque - Recomendaciones de AWS

Implementación del Generador de cuentas para Terraform (AFT) mediante una canalización de arranque

Vinicius Elias y Edgar Costa Filho, Amazon Web Services

Resumen

Aviso: AWS CodeCommit ya no está disponible para los nuevos clientes. Los clientes existentes de AWS CodeCommit pueden seguir utilizando el servicio con normalidad. Más información

Este patrón proporciona un método sencillo y seguro para implementar el Generador de cuentas de AWS Control Tower para Terraform (AFT) desde la cuenta de administración de AWS Organizations. El núcleo de la solución es una plantilla de CloudFormation que automatiza la configuración de AFT mediante la creación de una canalización de Terraform, que está estructurada para adaptarse fácilmente a la implementación inicial o a las actualizaciones posteriores.

La seguridad y la integridad de los datos son las principales prioridades de AWS, por lo que el archivo de estado de Terraform, que es un componente fundamental que hace un seguimiento del estado de la infraestructura y las configuraciones administradas, se almacena de forma segura en un bucket de Amazon Simple Storage Service (Amazon S3). Este bucket está configurado con varias medidas de seguridad, como el cifrado del servidor y políticas para bloquear el acceso público, a fin de garantizar que el estado de Terraform esté protegido contra el acceso no autorizado y las filtraciones de datos.

La cuenta de administración orquesta y supervisa todo el entorno, por lo que es un recurso fundamental en AWS Control Tower. Este patrón sigue las prácticas recomendadas de AWS y garantiza que el proceso de implementación no solo sea eficiente, sino que también se ajuste a los estándares de seguridad y gobernanza, a fin de ofrecer una forma integral, segura y eficiente de implementar AFT en su entorno de AWS.

Para obtener más información sobre AFT, consulte la documentación de AWS Control Tower.

Requisitos previos y limitaciones

Requisitos previos

  • Un entorno básico de AWS de múltiples cuentas con las siguientes cuentas como mínimo: cuenta de administración, cuenta de archivo de registros, cuenta de auditoría y una cuenta adicional para la administración de AFT.

  • Un entorno de AWS Control Tower establecido. La cuenta de administración debe estar configurada correctamente, ya que la plantilla de CloudFormation se implementará en ella.

  • Los permisos necesarios en la cuenta de administración de AWS. Necesitará permisos suficientes para crear y administrar recursos, como buckets de S3, funciones de AWS Lambda, roles de AWS Identity and Access Management (IAM) y proyectos de AWS CodePipeline.

  • Familiaridad con Terraform. Es importante comprender los conceptos básicos y el flujo de trabajo de Terraform porque la implementación implica generar y administrar las configuraciones de Terraform.

Limitaciones

  • Tenga en cuenta las cuotas de los recursos de AWS de su cuenta. La implementación puede crear varios recursos y encontrar cuotas de servicio podría impedir el proceso de implementación.

  • La plantilla está diseñada para versiones específicas de Terraform y Servicios de AWS. La actualización o el cambio de versiones pueden requerir modificaciones en la plantilla.

  • La plantilla no admite los servicios del sistema de control de versiones (VCS) autoadministrados, como GitHub Enterprise.

Versiones de producto

  • Versión de Terraform 1.6.6 o posterior

  • Versión 1.11 o posteriores de AFT

Arquitectura

Pila de tecnología de destino

  • CloudFormation

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon EventBridge

  • IAM

  • AWS Lambda

  • Amazon S3

Arquitectura de destino

En el siguiente diagrama se ilustra la implementación descrita en este patrón.

Flujo de trabajo para implementar AFT mediante una canalización de arranque.

El flujo de trabajo consta de tres tareas principales: creación de los recursos, generación del contenido y ejecución de la canalización.

Creación de los recursos

La plantilla de CloudFormation que se proporciona con este patrón crea y configura todos los recursos necesarios, en función de los parámetros que seleccione al implementar la plantilla. Como mínimo, la plantilla crea los siguientes recursos:

  • Una canalización de CodePipeline para implementar AFT

  • Un bucket de S3 para almacenar el archivo de estado de Terraform asociado a la implementación de AFT

  • Dos proyectos de CodeBuild para implementar el plan de Terraform y aplicar comandos en diferentes etapas de la canalización

  • Roles de IAM para los servicios CodeBuild y CodePipeline

  • Un segundo bucket de S3 para almacenar artefactos de tiempo de ejecución de la canalización

Según el proveedor de VCS que seleccione (CodeCommit o VCS externo), la plantilla crea los siguientes recursos.

  • Para CodeCommit:

    • Un repositorio de CodeCommit para almacenar el código de arranque de AFT para Terraform

    • Una regla de EventBridge para capturar los cambios en el repositorio de CodeCommit en la ramificación main

    • Otro rol de IAM para la regla de EventBridge

  • Para cualquier otro proveedor de VCS externo, como GitHub:

    • Una conexión de AWS CodeConnections.

Además, cuando selecciona CodeCommit como proveedor de VCS, si establece el parámetro Generate AFT Files en true, la plantilla crea estos recursos adicionales para generar el contenido:

  • Un bucket de S3 para almacenar el contenido generado y usarlo como origen del repositorio de CodeCommit

  • Una función de Lambda para procesar los parámetros dados y generar el contenido apropiado

  • Una función de IAM para ejecutar la función de Lambda

  • Un recurso personalizado de CloudFormation que ejecute la función de Lambda cuando se implemente la plantilla

Generación del contenido

Para generar los archivos de arranque de AFT y su contenido, la solución utiliza una función de Lambda y un bucket de S3. La función crea una carpeta en el bucket y, a continuación, crea dos archivos dentro de la carpeta: main.tf y backend.tf. La función también procesa los parámetros de CloudFormation proporcionados y rellena estos archivos con código predefinido, sustituyendo los valores de los parámetros correspondientes.

Para ver el código que se usa como plantilla para generar los archivos, consulte el repositorio de GitHub de la solución. Básicamente, los archivos se generan de la siguiente manera.

main.tf

module "aft" { source = "github.com/aws-ia/terraform-aws-control_tower_account_factory?ref=<aft_version>" # Required variables ct_management_account_id = "<ct_management_account_id>" log_archive_account_id = "<log_archive_account_id>" audit_account_id = "<audit_account_id>" aft_management_account_id = "<aft_management_account_id>" ct_home_region = "<ct_home_region>" # Optional variables tf_backend_secondary_region = "<tf_backend_secondary_region>" aft_metrics_reporting = "<false|true>" # AFT Feature flags aft_feature_cloudtrail_data_events = "<false|true>" aft_feature_enterprise_support = "<false|true>" aft_feature_delete_default_vpcs_enabled = "<false|true>" # Terraform variables terraform_version = "<terraform_version>" terraform_distribution = "<terraform_distribution>" # VCS variables (if you have chosen an external VCS) vcs_provider = "<github|githubenterprise|gitlab|gitlabselfmanaged|bitbucket>" account_request_repo_name = "<org-name>/aft-account-request" account_customizations_repo_name = "<org-name>/aft-account-customizations" account_provisioning_customizations_repo_name = "<org-name>/aft-account-provisioning-customizations" global_customizations_repo_name = "<org-name>/aft-global-customizations" }

backend.tf

terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup.tfstate" } }

Durante la creación del repositorio de CodeCommit, si establece el parámetro Generate AFT Files en true, la plantilla utilizará el bucket de S3 con el contenido generado como origen de la ramificación main para rellenar automáticamente el repositorio.

Ejecutando la canalización

Una vez creados los recursos y configurados los archivos de arranque, se ejecuta la canalización. La primera etapa (Origen) busca el código fuente de la ramificación principal del repositorio, y la segunda etapa (Compilación) ejecuta el comando de planificación de Terraform y genera los resultados para su revisión. En la tercera etapa (Aprobación), la canalización espera a que se lleve a cabo una acción manual para aprobar o rechazar la última etapa (Implementación). En la última etapa, la canalización ejecuta el comando apply de Terraform utilizando como entrada el resultado del comando plan de Terraform anterior. Por último, un rol entre cuentas y los permisos de la cuenta de administración se utilizan para crear los recursos de AFT en la cuenta de administración de AFT.

nota

Si selecciona un proveedor de VCS externo, deberá autorizar la conexión con las credenciales de su proveedor de VCS. Para completar la configuración, siga los pasos que se indican en Update a pending connection en la documentación de la consola de herramientas para desarrolladores de AWS.

Herramientas

Servicios de AWS

  • CloudFormation ayuda a configurar los recursos de AWS, aprovisionarlos de manera rápida y coherente y administrarlos durante todo su ciclo de vida en las regiones y Cuentas de AWS.

  • AWS CodeBuild es un servicio de compilación completamente administrado que le permite compilar código fuente, poner en marcha pruebas unitarias y producir artefactos listos para implementar. 

  • AWS CodeCommit es un servicio de control de versiones que permite almacenar y administrar repositorios de Git de forma privada sin necesidad de administrar su propio sistema de control de origen.

  • AWS CodePipeline permite diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software y automatizar los pasos necesarios para lanzar los cambios en el software de manera continua.

  • AWS CodeConnections permite que recursos y servicios de AWS, como CodePipeline, se conecten a repositorios de código externos, como GitHub.

  • AWS Lambda es un servicio de computación que ejecuta código como respuesta a eventos y administra automáticamente los recursos de computación, lo que proporciona una forma rápida de crear una aplicación moderna y sin servidor para producción.

  • AWS SDK para Python (Boto3) es un kit de desarrollo de software que permite integrar su aplicación, biblioteca o script de Python con los Servicios de AWS.

Otras herramientas

  • Terraform es una herramienta de infraestructura como código (IaC) que le permite crear, cambiar y versionar la infraestructura de manera segura y eficiente. Esto incluye componentes de bajo nivel, como instancias de computación, almacenamiento y redes, y componentes de alto nivel, como entradas de DNS y característica de SaaS.

  • Python es un lenguaje de programación potente y fácil de aprender. Cuenta con estructuras de datos eficientes y de alto nivel y proporciona un enfoque simple pero efectivo de la programación orientada a objetos.

Repositorio de código

El código que automatiza este patrón está disponible en el repositorio AFT bootstrap pipeline de GitHub.

Para ver el repositorio de AFT oficial, consulte AWS Control Tower Account Factory for Terraform en GitHub.

Prácticas recomendadas

Al implementar AFT mediante la plantilla de CloudFormation proporcionada, le recomendamos que siga las prácticas recomendadas para garantizar una implementación segura, eficiente y correcta. Las pautas y recomendaciones clave para implementar y operar AFT incluyen lo siguiente:

  • Revisión exhaustiva de los parámetros: revise detenidamente y comprenda cada parámetro de la plantilla de CloudFormation. La configuración correcta de los parámetros es crucial para la configuración y el funcionamiento correctos de AFT.

  • Actualizaciones periódicas de las plantillas: mantenga las plantillas actualizadas con las últimas características de AWS y versiones de Terraform. Las actualizaciones periódicas lo ayudarán a aprovechar las nuevas funciones y a mantener la seguridad.

  • Control de versiones: fije la versión de su módulo de AFT y, si es posible, utilice una implementación de AFT independiente para realizar las pruebas.

  • Alcance: utilice AFT únicamente para implementar barreras de protección y personalizaciones de infraestructura. No use AFT para implementar la aplicación.

  • Lint y validación: la canalización de AFT requiere una configuración de Terraform de tipo Lint y que esté validada. Ejecute Lint, valide y pruebe todo antes de enviar la configuración a los repositorios de AFT.

  • Módulos de Terraform: cree código de Terraform reutilizable como módulos y especifique siempre las versiones de Terraform y del proveedor de AWS para que se adapten a los requisitos de su organización.

Epics

TareaDescripciónHabilidades requeridas

Preparar el entorno de AWS Control Tower.

Instale y configure AWS Control Tower en su entorno de AWS para garantizar la administración y gobernanza centralizadas de sus Cuentas de AWS. Para más información, consulte Getting started with AWS Control Tower en la documentación de AWS Control Tower.

Administrador de la nube

Iniciar la cuenta de administración de AFT.

Utilice el Generador de cuentas de AWS Control Tower para lanzar una nueva Cuenta de AWS que sirva de cuenta de administración de AFT. Para obtener más información, consulte Provision accounts with AWS Service Catalog Account Factory en la documentación de AWS Control Tower.

Administrador de la nube
TareaDescripciónHabilidades requeridas

Inicie la plantilla de CloudFormation.

En esta épica, implementa la plantilla de CloudFormation que se proporciona con esta solución para configurar la canalización de arranque de AFT en su cuenta de administración de AWS. La canalización implementa la solución AFT en la cuenta de administración de AFT que configuró en la épica anterior.

Paso 1: abrir la consola de CloudFormation

  • Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation. Asegúrese de que está trabajando en la región principal de AWS Control Tower correcta.

Paso 2: crear una nueva pila

  1. Elija crear una nueva pila.

  2. Seleccione la opción para cargar un archivo de plantilla y cargue la plantilla de CloudFormation que se proporciona con este patrón.

Paso 3: configurar los parámetros de la pila

  • VCS Provider: seleccione el proveedor del sistema de control de versiones (VCS) que desee utilizar. Puede seleccionar un VCS externo, como GitHub, o usar CodeCommit si su cuenta tiene permiso para usar el servicio.

  • Repository Name: especifique el nombre del repositorio para almacenar el módulo de arranque de AFT. Para los proveedores de VCS externos, utilice la ruta completa, incluido el nombre de la organización (por ejemplo, my-github-org/my-repo).

  • Branch Name: especifique la ramificación del repositorio de origen.

  • CodeBuild Docker Image: elija el archivo que se usará como imagen base de Docker de CodeBuild.

  • Si configura el proveedor de VCS en una opción distinta de CodeCommit, vaya al paso 8.

Paso 4: decidir la generación de archivos

  • Si seleccionó CodeCommit como proveedor de VCS, puede usar el parámetro Generate AFT Files para controlar la generación de los archivos de implementación de AFT predeterminados. Establezca este parámetro en:

    • true para crear y almacenar automáticamente los archivos de implementación de AFT en el repositorio especificado.

    • false si desea gestionar manualmente la creación del archivo o si ya tiene los archivos en su lugar.

  • Si ha seleccionado false, vaya al paso 8; de lo contrario, siga primero los pasos 5-7.

Paso 5: rellenar los detalles de la cuenta de AFT y AWS Control Tower

  • Si establece el parámetro Generate AFT Files en true, proporcione la siguiente información específica de la cuenta de AFT y AWS Control Tower.

    • Log Archive Account ID: ID de la cuenta de archivo de registros en AWS Control Tower.

    • Audit Account ID: ID de la cuenta de auditoría en AWS Control Tower.

    • AFT Management Account ID: ID de la cuenta de administración de AFT que creó en la primera épica.

    • AFT Main Region y AFT Secondary Region: Regiones de AWS principal y secundaria para la implementación de AFT.

Paso 6: configurar las opciones de AFT

  • Configure los informes de métricas:

    • AFT Enable Metrics Reporting: habilite o deshabilite los informes de métricas de AFT. Para obtener más información, consulte Operational metrics en la documentación de AWS Control Tower.

  • Defina las opciones de características de AFT:

    • Enable AFT CloudTrail Data Events: habilite los eventos de datos de CloudTrail en todas las cuenta administradas de AFT. Para obtener más información, consulte AWS CloudTrail data events en la documentación de AWS Control Tower.

    • Enable AFT Enterprise Support: habilite Enterprise Support en todas las cuentas administradas de AFT. Para obtener más información, consulte AWS Enterprise Support plan en la documentación de AWS Control Tower.

    • Enable AFT Delete Default VPC: elimine todas las VPC solo de la cuenta de administración de AFT. Para obtener más información, consulte Delete the AWS default VPC en la documentación de AWS Control Tower.

Paso 7: especificar las versiones

  • AFT Terraform Version: elija la versión de Terraform que usar en las canalizaciones de AFT.

  • AFT Version: defina la versión de AFT para la implementación. Mantenga la configuración predeterminada (latest) para usar la versión de AFT más reciente.

Paso 8: revisar y crear la pila

  • Revise todos los parámetros y configuraciones. Si todo está en orden, proceda a crear la pila.

Paso 9: supervisar la creación de la pila

  • CloudFormation aprovisiona y configura los recursos que definió. Supervise el proceso de creación de la pila en la consola de CloudFormation. Este proceso podría tardar varios minutos.

Paso 10: comprobar la implementación

  • Cuando el estado de la pila muestre CREATE_COMPLETE, compruebe que todos los recursos se hayan creado correctamente.

  • En la sección Salidas, anote el valor de TerraformBackendBucketName.

Administrador de la nube
TareaDescripciónHabilidades requeridas

Opción 1: Rellenar el repositorio de arranque de AFT para un VCS externo.

Si configura el proveedor de VCS en un VCS externo (no en CodeCommit), siga estos pasos.

(Opcional) Tras implementar la plantilla de CloudFormation, puede rellenar o validar el contenido del repositorio de arranque de AFT recién creado y probar si la canalización se ha ejecutado correctamente.

Paso 1: actualizar la conexión

  1. En la consola de CodePipeline, en el panel de navegación, elija Configuración, Conexiones.

  2. Seleccione la conexión aft-vcs-connection. El estado debería ser Pending.

  3. Elija Actualizar conexión pendiente y siga las instrucciones de Update a pending connection en la documentación de la consola de las herramientas para desarrolladores.

  4. Cuando el estado de la conexión sea Available, vaya al siguiente paso.

Paso 2: rellenar el repositorio

  1. Utilice sus credenciales de VCS externas para clonar el repositorio que especificó en la plantilla en su máquina local. Si ha mantenido el nombre predeterminado, el repositorio se llamará aft-setup.

  2. En el repositorio, cree una carpeta llamada terraform con dos archivos vacíos dentro: backend.tf y main.tf.

  3. Abra el archivo backend.tf y agregue este fragmento de código:

    terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup" } }

    En el archivo:

    • Sustituya <aft-main-region> por la región de AFT principal. Debe coincidir con la región principal de AWS Control Tower.

    • Sustituya <s3-bucket-name> por el nombre del bucket de backend de Terraform. Puede encontrar esto en la salida de TerraformBackendBucketName generada por la plantilla de CloudFormation que implementó anteriormente.

  4. Abra el archivo main.tf y utilice uno de los ejemplos disponibles en el repositorio de AFT para implementar AFT. Por ejemplo, puede trabajar con su proveedor de VCS preferido (CodeCommit, GitHub o Bitbucket) o personalizar la VPC de AFT. Para ver más opciones de entrada de AFT, consulte el archivo README en el repositorio de AFT.

Paso 2: confirmar y enviar los cambios

  • Una vez que haya creado y rellenado la carpeta y los archivos, confirme los cambios y cargue el código en el repositorio. La canalización se inicia automáticamente, se ejecuta en las etapas Origen y Compilación y, a continuación, espera a que se lleve a cabo una acción de aprobación antes de la etapa Implementación.

Administrador de la nube

Opción 2: Rellenar el repositorio de arranque de AFT para CodeCommit.

Si configura el proveedor de VCS en CodeCommit, siga estos pasos.

(Opcional) Tras implementar la plantilla de CloudFormation, puede rellenar o validar el contenido del repositorio de arranque de AFT recién creado y probar si la canalización se ha ejecutado correctamente.

Si establece el parámetro Generate AFT Files en true, pase a la siguiente historia (validación de la canalización).

Paso 1: rellenar el repositorio

  1. Abra la consola de AWS CodeCommit y seleccione el repositorio recién creado. Si ha mantenido el nombre predeterminado, el nombre del repositorio debería ser aft-setup.

  2. Clone el repositorio en su máquina local mediante SSH, HTTPS o HTTPS (GRC) y ábralo en un editor.

  3. Cree una carpeta llamada terraform y dos archivos vacíos dentro: backend.tf y main.tf.

  4. Abra el archivo backend.tf y agregue este fragmento de código:

    terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup" } }

    En el archivo:

    • Sustituya <aft-main-region> por la región de AFT principal. Debe coincidir con la región principal de AWS Control Tower.

    • Sustituya <s3-bucket-name> por el nombre del bucket de backend de Terraform. Puede encontrar esto en la salida de TerraformBackendBucketName generada por la plantilla de CloudFormation que implementó anteriormente.

  5. Abra el archivo main.tf y utilice uno de los ejemplos disponibles en el repositorio de AFT para implementar AFT. Por ejemplo, puede trabajar con su proveedor de sistemas de control de versiones (VCS) preferido (CodeCommit, GitHub o Bitbucket) o personalizar la VPC de AFT. Para ver más opciones de entrada de AFT, consulte el archivo README en el repositorio de AFT.

Paso 2: confirmar y enviar los cambios

  • Una vez que haya creado y rellenado la carpeta y los archivos, confirme los cambios y cargue el código en el repositorio. La canalización se inicia automáticamente, se ejecuta en las etapas Origen y Compilación y, a continuación, espera a que se lleve a cabo una acción de aprobación antes de la etapa Implementación.

Administrador de la nube

Validar la canalización de arranque de AFT.

Paso 1: visualización de la canalización

  • Abra la consola de CodePipeline y compruebe si la canalización aft-bootstrap-pipeline se ha iniciado correctamente. Debería estar ejecutando un plan de Terraform o esperando una acción de aprobación manual.

Paso 2: aprobar los resultados del plan de Terraform

  • Para revisar los resultados del plan de Terraform, puede consultar los registros de ejecución de la etapa Compilación y, a continuación, aprobar o rechazar la ejecución en la etapa Aprobación. Si la aprueba, la canalización empezará a implementar los recursos de AFT en la cuenta de administración de AFT proporcionada.

Paso 3: esperar a la implementación

  • Espere a que la canalización se ejecute correctamente. Este proceso tarda unos 30 minutos. Los errores que pueda encontrar suelen deberse a las cuotas de la API. En estos casos, puede volver a ejecutar la canalización para continuar con la implementación.

Paso 4: comprobar los recursos creados

  • Acceda a la cuenta de administración de AFT y confirme que se hayan creado los recursos.

Administrador de la nube

Solución de problemas

ProblemaSolución

La función de Lambda personalizada incluida en la plantilla de CloudFormation falla durante la implementación.

Compruebe la función de Lambda en los registros de Amazon CloudWatch para identificar el error. Los registros proporcionan información detallada y pueden ayudar a identificar el problema específico. Confirme que la función de Lambda tiene los permisos necesarios y que las variables del entorno se han configurado correctamente.

Se producen errores en la creación o administración de los recursos a causa de permisos inadecuados.

Revise los roles de IAM y las políticas asociadas a la función de Lambda, CodeBuild y otros servicios involucrados en la implementación. Confirme que tengan los permisos necesarios. Si tiene problemas con los permisos, ajuste las políticas de IAM para conceder el acceso necesario.

Está utilizando una versión obsoleta de la plantilla de CloudFormation con versiones más recientes de los Servicios de AWS o de Terraform.

Actualice periódicamente la plantilla de CloudFormation para que sea compatible con las versiones más recientes de AWS y de Terraform. Consulte las notas de la versión o la documentación para ver si hay cambios o requisitos específicos de la versión.

Alcanza las cuotas del Servicio de AWS durante la implementación.

Antes de implementar la canalización, compruebe las cuotas de Servicio de AWS de recursos como buckets de S3, roles de IAM y funciones de Lambda. Solicite aumentos si fuera necesario. Para obtener más información, consulte Servicio de AWS quotas en el sitio web de AWS.

Se producen errores debido a parámetros de entrada incorrectos en la plantilla de CloudFormation.

Compruebe todos los parámetros de entrada para ver si hay errores tipográficos o valores incorrectos. Confirme que los identificadores de recursos, como los ID de cuentas y los nombres de las regiones, sean correctos.

Recursos relacionados

Para implementar este patrón correctamente, revise los siguientes recursos. En estos recursos se proporciona información y orientación adicionales que pueden tener un valor incalculable para configurar y administrar AFT mediante CloudFormation.

AWS Documentación de:

Políticas de IAM y prácticas recomendadas:

Terraform en AWS:

Servicio de AWS Cuotas de:

  • En Servicio de AWS quotas se proporciona información sobre cómo ver las cuotas de Servicio de AWS y cómo solicitar aumentos.