Validar Account Factory para el código Terraform (AFT) localmente - 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.

Validar Account Factory para el código Terraform (AFT) localmente

Creado por Alexandru Pop (AWS) y Michal Gorniak (AWS)

Entorno: producción

Tecnologías: infraestructura; modernización; DevOps DevelopmentAndTesting

Carga de trabajo: código abierto

Servicios de AWS: AWS Control Tower

Resumen

Este patrón muestra cómo probar localmente el código de HashiCorp Terraform administrado por AWS Control Tower Account Factory for Terraform (AFT). HashiCorp Terraform es una herramienta de infraestructura como código (IaC) y de código abierto que facilita usar el código para aprovisionar y administrar la infraestructura y los recursos de la nube. AFT configura una canalización de Terraform que le ayuda a aprovisionar y personalizar varias cuentas de AWS Control Tower.

Durante el desarrollo del código, puede resultar útil probar su infraestructura de Terraform como código (IaC) a nivel local, fuera de la canalización de AFT. Este ejemplo muestra cómo hacer lo siguiente:

  • Obtenga una copia local del código de Terraform que está almacenado en los CodeCommit repositorios de AWS de su cuenta de administración de AFT.

  • Simule la canalización de AFT de forma local con el código recuperado.

Este procedimiento también se puede utilizar para ejecutar comandos de Terraform que no forman parte de la canalización AFT normal. Por ejemplo, puede usar este método para ejecutar comandos como terraform validate, terraform plan, terraform destroy, yterraform import.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

  • Este patrón no cubre los pasos de implementación necesarios para AWS Control Tower, AFT ni ningún módulo específico de Terraform.

  • El resultado que se genera localmente durante este procedimiento no se guarda en los registros de tiempo de ejecución de AFT Pipeline.

Arquitectura

Pila de tecnología de destino

  • Infraestructura AFT implementada dentro de una implementación de AWS Control Tower

  • Terraform

  • Git

  • CLI de AWS versión 2

Automatizar y escalar

Este patrón muestra cómo invocar localmente el código de Terraform para las personalizaciones de cuentas globales de AFT en una única cuenta de AWS administrada por AFT. Una vez validado el código de Terraform, puede aplicarlo al resto de las cuentas de su entorno de múltiples cuentas. Para obtener más información, consulte Volver a invocar las personalizaciones en la documentación de AWS Control Tower.

También puede usar un proceso similar para ejecutar las personalizaciones de la cuenta AFT en una terminal local. Para invocar localmente el código de Terraform desde las personalizaciones de la cuenta AFT, clone el aft-account-customizations repositorio en lugar del aft-global-account-customizationsrepositorio desde CodeCommit su cuenta de administración de AFT.

Herramientas

Servicios de AWS

  • AWS Control Tower le ayuda a configurar y regular un entorno de cuentas múltiples de AWS siguiendo las prácticas recomendadas prescriptivas.

  • La interfaz de la línea de comandos de AWS (AWS CLI) 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.

Otros servicios

  • HashiCorp Terraform es una herramienta de código abierto de infraestructura como código (IaC) que le ayuda a usar el código para aprovisionar y administrar la infraestructura y los recursos de la nube.

  • Git es un sistema de control de versiones distribuido y de código abierto.

Código

El siguiente es un ejemplo de un script bash que se puede usar para ejecutar localmente el código de Terraform administrado por AFT. Para usar el script, siga las instrucciones de la sección Epics de este patrón.

#! /bin/bash # Version: 1.1 2022-06-24 Unsetting AWS_PROFILE since, when set, it interferes with script operation #          1.0 2022-02-02 Initial Version # # Purpose: For use with AFT: This script runs the local copy of TF code as if it were running within AFT pipeline. #        * Facilitates testing of what the AFT pipline will do #           * Provides the ability to run terraform with custom arguments (like 'plan' or 'move') which are currently not supported within the pipeline. # # © 2021 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This AWS Content is provided subject to the terms of the AWS Customer Agreement # available at http://aws.amazon.com/agreement or other written agreement between # Customer and either Amazon Web Services, Inc. or Amazon Web Services EMEA SARL or both. # # Note: Arguments to this script are passed directly to 'terraform' without parsing nor validation by this script. # # Prerequisites: #    1. local copy of ct GIT repositories #    2. local backend.tf and aft-providers.tf filled with data for the target account on which terraform is to be run #       Hint: The contents of above files can be obtain from the logs of a previous execution of the AFT pipeline for the target account. #    3. 'terraform' binary is available in local PATH #    4. Recommended: .gitignore file containing 'backend.tf', 'aft_providers.tf' so the local copy of these files are not pushed back to git readonly credentials=$(aws sts assume-role \     --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text ):role/AWSAFTAdmin \     --role-session-name AWSAFT-Session \     --query Credentials ) unset AWS_PROFILE export AWS_ACCESS_KEY_ID=$(echo $credentials | jq -r '.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $credentials | jq -r '.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $credentials | jq -r '.SessionToken') terraform "$@"

Epics

TareaDescripciónHabilidades requeridas

Guardar el código de ejemplo como un archivo local.

  1. Copie el script bash de ejemplo que se encuentra en la sección Código de este patrón y péguelo en un editor de código.

  2. Nombre el archivo ct_terraform.sh. Luego, guarde el archivo localmente dentro de una carpeta dedicada, como ~/scripts ov~/bin.

Administrador de AWS

Haga que el código de ejemplo sea ejecutable.

Abra una ventana de terminal y autentíquese en su cuenta de administración de AWS AFT al realizar una de las siguientes acciones:

  • Utilice un perfil de AWS CLI existente que esté configurado con los permisos necesarios para acceder a la cuenta de administración de AFT. Para utilizar el perfil, puede ejecutar el siguiente comando:

export AWS_PROFILE=<aft account profile name>
  • Si su organización usa el SSO para acceder a AWS, introduzca las credenciales de su cuenta de administración de AFT en la página de SSO de su organización.

Nota: Es posible que su organización también tenga una herramienta personalizada para proporcionar credenciales de autenticación a su entorno de AWS.

Administrador de AWS

Verifique el acceso a la cuenta de administración de AFT en la región de AWS correcta.

Importante: asegúrese de utilizar la misma sesión de terminal con la que se autenticó en su cuenta de administración de AFT.

  1. Navegue hasta la región de AWS de su implementación de AFT ejecutando el siguiente comando:

    export AWS_REGION=<aft_region>
  2. Asegúrese de estar en la cuenta correcta al realizar lo siguiente:

    • Ejecute el siguiente comando:

    aws code-commit list-repositories
    • A continuación, compruebe que los repositorios que aparecen en el resultado coincidan con los nombres de los repositorios que se encuentran en su cuenta de administración de AFT.

Administrador de AWS

Crear un nuevo directorio local para almacenar el código del repositorio de AFT.

En la misma sesión de terminal, ejecute los siguientes comandos:

mkdir my_aft cd my_aft
Administrador de AWS

Clone el código del repositorio AFT remoto.

  1. Ejecute el siguiente comando desde el terminal:

    git clone codecommit::$AWS_REGION://aft-global-customizations

    Nota: Para simplificar, este procedimiento y AFT utilizan únicamente una rama de código principal. Para utilizar la ramificación de código, también puede introducir comandos de ramificación de código aquí. Sin embargo, cualquier cambio aplicado desde la rama no principal se revertirá cuando la automatización de AFT aplique el código desde la rama principal.

  2. A continuación, navegue hasta el directorio clonado ejecutando el siguiente comando:

    cd aft-global-customizations/terraform
Administrador de AWS
TareaDescripciónHabilidades requeridas

Abra una canalización AFT previamente ejecutada y copie los archivos de configuración de Terraform en una carpeta local.

Nota: Los archivos de configuración backend.tf y aft-providers.tf que se crean en esta epic son necesarios para que la canalización de AFT se ejecute localmente. Estos archivos se crean automáticamente dentro de la canalización de AFT basada en la nube, pero deben crearse manualmente para que la canalización se ejecute localmente. La ejecución local de la canalización de AFT requiere un conjunto de archivos que represente la ejecución de la canalización en una sola cuenta de AWS.

  1. Con las credenciales de su cuenta de administración de AWS Control Tower, inicie sesión en la Consola de administración de AWS. A continuación, abra la CodePipeline consola de AWS. Asegúrese de que está en la misma Región de AWS donde ha implementado AFT.

  2. En el panel de navegación izquierdo, seleccione Canalizaciones.

  3. Seleccione ##########-customizations-pipeline. (El ########## es la ID de cuenta de AWS que utiliza para ejecutar el código de Terraform de forma local).

  4. Asegúrese de que la ejecución más reciente marcada muestre un valor correcto. Si el valor es diferente, debe volver a invocar las personalizaciones en el proceso de AFT. Para obtener más información, consulte Volver a invocar las personalizaciones en la documentación de AWS Control Tower.

  5. Seleccione el tiempo de ejecución más reciente para ver sus detalles.

  6. En la sección Apply-AFT-Global-Customizations, busque la etapa Apply-Terraform.

  7. Seleccione la sección Detalles de la etapa Apply-Terraform.

  8. Busque el registro de tiempo de ejecución de la etapa Apply-Terraform.

  9. En el registro de tiempo de ejecución, busca la sección que comienza y termina con las siguientes líneas:   “\n\n aft-providers.tf … “\n \n backend.tf”  

  10. Copie el resultado entre estas dos etiquetas y guárdelo como un archivo local con un nombre aft-providers.tfdentro de la carpeta Terraform local (el directorio de trabajo actual de su sesión de terminal).

    Ejemplo de sentencia providers.tf generada automáticamente

    ## Autogenerated providers.tf ## ## Updated on: 2022-05-31 16:27:45 ## provider "aws" { region = "us-east-2" assume_role { role_arn = "arn:aws:iam::############:role/AWSAFTExecution" } default_tags { tags = { managed_by = "AFT" } } }
  11. En el registro de tiempo de ejecución, busque la sección que comienza y termina con las siguientes líneas: “\n\n tf … “\n \n backup.tf 

  12. Copie el resultado entre estas dos etiquetas y guárdelo como un archivo local con un nombre tf dentro de la carpeta Terraform local (el directorio de trabajo actual de su sesión de terminal).

Ejemplo de sentencia backend.tf generada automáticamente

## Autogenerated backend.tf ## ## Updated on: 2022-05-31 16:27:45 ## terraform { required_version = ">= 0.15.0" backend "s3" { region = "us-east-2" bucket = "aft-backend-############-primary-region" key = "############-aft-global-customizations/terraform.tfstate" dynamodb_table = "aft-backend-############" encrypt = "true" kms_key_id = "cbdc21d6-e04d-4c37-854f-51e199cfcb7c" kms_key_id = "########-####-####-####-############" role_arn = "arn:aws:iam::#############:role/AWSAFTExecution" } }

Nota: Los archivos backend.tf y aft-providers.tf están vinculados a una cuenta de AWS, una implementación de AFT y una carpeta específicas. Estos archivos también son diferentes, dependiendo de si están en el aft-global-customizationsrepositorio y en el aft-account-customizationsrepositorio dentro de la misma implementación de AFT. Asegúrese de generar ambos archivos a partir de la misma lista de tiempo de ejecución.

Administrador de AWS
TareaDescripciónHabilidades requeridas

Implemente los cambios de configuración de Terraform que desee validar.

  1. Navegue hasta el aft-global-customizationsrepositorio clonado ejecutando el siguiente comando:

    cd aft-global-customizations/terraform

    Nota: Los archivos backend.tf y aft-providers.tf  están en este directorio. El directorio también contiene los archivos de Terraform del aft-global-customizations repositorio.

  2. Incorpore los cambios de código de Terraform que desee probar localmente en los archivos de configuración.

Administrador de AWS

Ejecute el script ct_terraform.sh y revise el resultado.

  1. Navegue hasta la carpeta local que contiene el script sh.

  2. Para validar el código de Terraform modificado, ejecute el script ct_terraform.sh ejecutando el siguiente comando:

    ~/scripts/ct_terraform.sh apply

    Nota: Puede ejecutar cualquier comando de Terraform durante este paso. Para ver una lista completa de comandos de Terraform, ejecute el siguiente comando:

    terraform --help
  3. Revise el resultado de este comando. A continuación, depure los cambios de código localmente antes de confirmarlos y devolverlos al repositorio AFT.

Importante:

  • Cualquier cambio realizado localmente y que no se devuelva al repositorio remoto es temporal y se puede deshacer en cualquier momento mediante una automatización de canalización de AFT en ejecución.

  • La automatización de AFT se puede ejecutar en cualquier momento, ya que otros usuarios pueden invocarla y activar la automatización de AFT.

  • AFT siempre aplicará el código de la rama principal del repositorio, deshaciendo cualquier cambio no confirmado.

Administrador de AWS
TareaDescripciónHabilidades requeridas

Añada referencias a los archivos.tf de backend.tf y aft-providers.tf a un archivo.gitignore.

Añada los archivos backend.tf y aft-providers.tf que creó a un archivo .gitignore ejecutando los siguientes comandos:

echo backend.tf >> .gitignore echo aft-providers.tf >>.gitignore

Nota: Al mover los archivos al archivo .gitignore, se garantiza que no se confirmen ni se devuelvan al repositorio AFT remoto.

Administrador de AWS

Confirme y envíe los cambios de código al repositorio AFT remoto.

  1. Para añadir nuevos archivos de configuración de Terraform al repositorio, ejecute el siguiente comando:

    git add <filename>
  2. Para confirmar los cambios y enviarlos al repositorio AFT remoto de AWS CodeCommit, ejecute los siguientes comandos:

    git commit -a git push

Importante: los cambios de código que introduzca siguiendo este procedimiento hasta este momento se aplican únicamente a una cuenta de AWS.

Administrador de AWS
TareaDescripciónHabilidades requeridas

Implementar los cambios en todas sus cuentas administradas por AFT.

Para implementar los cambios en varias cuentas de AWS administradas por AFT, siga las instrucciones en Volver a invocar personalizaciones en la documentación de AWS Control Tower.

Administrador de AWS