在本地验证 Account Factory for Terraform (AFT) 代码 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在本地验证 Account Factory for Terraform (AFT) 代码

由 Alexandru Pop (AWS) 和 Michal Gorniak (AWS) 编写

环境:生产

技术:基础设施; DevOps;现代化; DevelopmentAndTesting

工作负载:开源

Amazon Web Services:AWS Control Tower

Summary

此模式显示了如何在本地测试由 AWS Control HashiCorp Tower Account Factory for Terraform (AFT) 管理的 Terraform 代码。Terraform 是一种开源的基础设施即代码(IaC)工具,可帮助您使用代码来预置和管理云基础结构和资源。AFT 构建了 Terraform 管道,帮助您在 AWS Control Tower 中配置和自定义多个 Amazon Web Services account。

在代码开发过程中,它可能有助于在 AFT 管道之外在本地测试 Terraform 基础设施即代码(IaC)。该模式说明了如何执行以下操作:

  • 检索存储在您的 AFT 管理账户的 AWS 存储 CodeCommit 库中的 Terraform 代码的本地副本。

  • 使用检索代码在本地模拟 AFT 管道。

此过程还可以用于运行不属于普通 AFT 管道的 Terraform 命令。例如,您可使用此方法来运行 terraform validateterraform planterraform destroyterraform import 等命令。

先决条件和限制

先决条件

限制

  • 这种模式不包含 AWS Control Tower、AFT 或任何特定 Terraform 模块所需部署步骤。

  • 在此过程中本地生成的输出不保存在 AFT 管道运行时日志中。

架构

目标技术堆栈

  • AFT 基础设施部署至 AWS Control Tower 部署中

  • Terraform

  • Git

  • AWS CLI 版本 2

自动化和扩缩

此模式显示了如何在单个 AFT 托管 Amazon Web Services account 中本地调用 Terraform 代码进行 AFT 全球账户自定义。验证您的 Terraform 代码后,您可将其应用于多账户环境中的其余账户。有关更多信息,请参阅 AWS Control Tower 文档中的重新调用自定义

您还可使用类似的过程在本地终端中运行 AFT 账户自定义。要从 AFT 账户自定义项中本地调用 Terraform 代码,请在 AFT 管理账户中克隆aft-account-customizations 存储库,而不是从 AFT aft-global-account-customizations管理账户 CodeCommit 中克隆存储库。

工具

Amazon Web Services

其他服务

  • HashiCorp Terraform 是一种开源基础设施即代码 (IaC) 工具,可帮助您使用代码来配置和管理云基础架构和资源。

  • Git 是开源分布式版本控制系统。

代码

以下是 bash 脚本示例,可在本地运行由 AFT 管理的 Terraform 代码。若要使用此脚本,请按照此模式操作说明部分中的说明操作。

#! /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 "$@"

操作说明

任务描述所需技能

将示例代码保存为本地文件。

  1. 复制此模式的代码 部分中的示例 bash 脚本并将其粘贴到代码编辑器中。

  2. 将文件命名为 ct_terraform.sh。然后,将文件保存在本地的专用文件夹中,如 ~/scripts~/bin

AWS 管理员

使示例代码运行。

通过执行以下操作之一,打开终端窗口并通过验证您的 AWS AFT 管理账户:

  • 使用现有 AWS CLI 配置文件,其配置了访问 AFT 管理账户所需权限。要使用配置文件,您可以运行以下命令:

export AWS_PROFILE=<aft account profile name>
  • 如果您的组织使用 SSO 访问 AWS,请在组织的 SSO 页面上输入您的 AFT 管理账户的凭证。

注意:您的组织可能还有一个自定义工具,用于向您的 AWS 环境提供身份验证凭证。

AWS 管理员

在正确的 AWS 区域验证对 AFT 管理账户的访问权限。

重要提示:请务必使用与 AFT 管理账户进行身份验证的终端会话相同的终端会话。

  1. 运行以下命令导航到您 AFT 部署的 AWS 区域:

    export AWS_REGION=<aft_region>
  2. 执行以下操作,以确保使用正确的账户:

    • 运行以下命令:

    aws code-commit list-repositories
    • 然后,验证输出中列出的存储库是否与 AFT 管理账户中存储库的名称相匹配。

AWS 管理员

创建新的本地目录来存储 AFT 存储库代码。

从相同的终端会话中,运行以下两个命令:

mkdir my_aft cd my_aft
AWS 管理员

克隆远程 AFT 存储库代码。

  1. 从您的本地终端运行以下命令:

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

    注意:为简化流程,此过程和 AFT 仅使用主代码分支。要使用代码分支,也可在此处输入代码分支命令。 但是,当 AFT 自动化应用来自主分支的代码时,来自非主分支的任何已应用更改都将被回滚。

  2. 然后,运行以下命令导航到克隆的目录:

    cd aft-global-customizations/terraform
AWS 管理员
任务描述所需技能

打开之前运行的 AFT 管道,将 Terraform 配置文件复制中本地文件夹。

注意:要让 AFT 管道在本地运行,需要在此操作说明中创建的 backend.tfaft-providers.tf 配置文件。这些文件是在基于云 AFT 管道中自动创建,但必须手动创建才能使管道在本地运行。本地运行 AFT 管道需要一组文件,这些文件表示在单个 Amazon Web Services account 中运行管道。

  1. 使用 AWS Control Tower 管理账户凭证登录 AWS 管理控制台。然后打开 AWS CodePipeline 控制台。确保您位于部署 AFT 的相同 AWS 区域 中。

  2. 在左侧导航窗格中,选择管道

  3. 选择 ###########-customizations-pipeline。(############ 是您用来在本地运行 Terraform 代码的 Amazon Web Services account ID)。

  4. 确保最近执行标记为显示成功值。如值不同,则必须在 AFT 管道中重新调用自定义设置。有关更多信息,请参阅 AWS Control Tower 文档中的重新调用自定义

  5. 选择最新的运行时系统,以显示其详细信息。

  6. Apply-AFT-Global-Customizations部分中,找到 Apply-Terraform 阶段。

  7. 选择 Apply-Terraform 阶段的详细信息部分。

  8. 查找 Apply-Terraform 阶段的运行时日志。

  9. 在运行时日志中,查找以下几行开头和结尾的部分:“\n\n aft-providers.tf … “\n \n backend.tf” 

  10. 在这两个标签之间复制输出,并将它们保存为本地 Terraform 文件夹(终端会话的当前工作目录)中命名为 aft-providers.tf 的本地文件。

    自动生成 providers.tf 语句示例

    ## 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. 运行时日志中,查找以以下几行开头和结尾的部分:“\ n\ n tf...”\ n\ n backup.tf” 

  12. 在这两个标签之间复制输出,并将它们保存为本地 Terraform 文件夹(终端会话的当前工作目录)中命名为 tf 的本地文件。

自动生成 backend.tf 语句示例

## 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" } }

注意: backend.tfaft-providers.tf 文件与特定 Amazon Web Services account、AFT 部署和文件夹相关联。这些文件也有所不同,具体取决于它们是否位于同一 AFT 部署中的aft-account-customizations存储aft-global-customizations库和存储库中。确保使用相同的运行时列表生成两项文件。

AWS 管理员
任务描述所需技能

实施要验证的 Terraform 配置更改。

  1. 运行以下命令导航到克隆的aft-global-customizations存储库:

    cd aft-global-customizations/terraform

    注意:文件 backend.tf  aft-providers.tf  在此目录内。该目录还包含存储库中的 Terraform 文件。aft-global-customizations

  2. 将要在本地测试的 Terraform 代码更改合并至配置文件中。

AWS 管理员

运行 ct_terraform.sh 脚本并查看输出。

  1. 导航至包含 sh 脚本的本地文件夹。

  2. 要验证修改后的 Terraform 代码,请通过运行以下命令运行 ct_terraform.sh 脚本:

    ~/scripts/ct_terraform.sh apply

    注意:在此步骤中,您可运行任何 Terraform 命令。若要查看 Terraform 命令的完整列表,请运行以下命令:

    terraform --help
  3. 查看命令输出。在本地调试代码更改,然后提交更改并将其推送回 AFT 存储库。

重要提示

  • 任何在本地进行但未推送回远程存储库的更改都是临时的,可通过运行的 AFT 管道自动化随时撤销。

  • AFT 自动化可以随时运行,因为它可以由其他用户与 AFT 自动化触发器调用。

  • AFT 将始终应用存储库主分支中代码,撤销所有未提交的更改。

AWS 管理员
任务描述所需技能

将对 backend.tf 和 aft-providers.tf 文件的引用添加至 .gitignore 文件中。

通过运行以下命令将您创建的 backend.tf aft-providers.tf 文件添加至 .gitignore 文件中:

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

注意:将文件移动到 .gitignore 文件,可确保它们不会被提交并推送回远程 AFT 存储库。

AWS 管理员

提交您的代码更改并将其推送至远程 AFT 存储库。

  1. 要向存储库中添加任何新 Terraform 配置文件,请运行以下命令:

    git add <filename>
  2. 要提交您的更改并将其推送到 AWS 中的远程 AFT 存储库 CodeCommit,请运行以下命令:

    git commit -a git push

重要提示:在此之前,您通过执行此过程引入的代码更改仅适用于一个 Amazon Web Services account。

AWS 管理员
任务描述所需技能

将更改发布至您由 AFT 管理的所有账户。

要对由 AFT 管理的多个 Amazon Web Services account 执行更改,请按照 AWS Control Tower 文档中重新调用自定义项中的说明进行操作。

AWS 管理员