View a markdown version of this page

在本地验证 Account Factory for Terraform (AFT) 代码 - AWS 规范指引

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

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

Alexandru Pop 和 Michal Gorniak,Amazon Web Services

Summary

此模式显示了如何在本地测试由 Acco AWS Control Tower unt Fact HashiCorp ory for Terraform(AFT)管理的 Terraform 代码。Terraform 是一款基础设施即代码(IaC)工具,可帮助您使用代码来预调配和管理云基础设施和资源。AFT 设置了一个 Terraform 管道,可以帮助你在其中配置和自定义多个 AWS 账户 管道。 AWS Control Tower

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

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

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

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

先决条件和限制

先决条件

限制

  • 此模式不包括 AFT 或任何特定 Terraform 模块所需的 AWS Control Tower部署步骤。

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

架构

目标技术堆栈

  • 部署在部署中部署的 AFT 基础架构 AWS Control Tower

  • Terraform

  • Git

  • AWS CLI 第 2 版

自动化和扩展

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

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

工具

AWS 服务

其他服务

  • 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 "$@"

操作说明

Task说明所需技能

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

  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. 运行以下命令导航到您 AWS 区域 的 AFT 部署:

    export AWS_REGION=<aft_region>
  2. 确保您处于正确的账户中。

    1. 运行如下命令:

      aws code-commit list-repositories
    2. 确认输出中列出的存储库与您的 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 管理员
Task说明所需技能

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

注意

为使 AFT 管道在本地运行,需要使用在此操作说明中创建的 backend.tfaft-providers.tf 配置文件。这些文件是在基于云的 AFT 管道内自动创建的,但必须手动创建这些文件,管道才能在本地运行。要在本地运行 AFT 管道,需要一组文件,这些文件表示在单个 AWS 账户内运行管道。

  1. 使用您的 AWS Control Tower 管理账户凭据登录并打开AWS CodePipeline 控制台。 AWS 管理控制台确保您与部署 AFT AWS 区域 的地方相同。

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

  3. 选择 ###########-customizations-pipeline。(############ 是你用来在本地运行 Terraform 代码的 AWS 账户 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 backend.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 = "########-####-####-####-############" role_arn = "arn:aws:iam::#############:role/AWSAFTExecution" } }
注意

backend.tfaft-providers.tf文件与特定 AWS 账户的 AFT 部署和文件夹相关联。这些文件也有所不同,具体取决于它们是否位于同一 AFT 部署中的aft-global-customizationsaft-account-customizations存储库中。确保从同一个运行时列表中生成两个文件。

AWS 管理员
Task说明所需技能

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

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

    cd aft-global-customizations/terraform
    注意

    文件 backend.tfaft-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 --help
    注意

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

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

重要

 

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

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

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

AWS 管理员
Task说明所需技能

将对 backend.tfaft-providers.tf 文件的引用添加到一个 .gitignore 文件中。

运行以下命令,以便将您创建的 backend.tfaft-providers.tf 文件添加到一个 .gitignore 文件中:

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

通过将这些文件移到 .gitignore 文件中,可确保不会将它们提交并推送回远程 AFT 存储库。

AWS 管理员

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

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

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

    git commit -a git push
重要

在此之前,您通过执行此过程引入的代码更改 AWS 账户 仅适用于一个代码更改。

AWS 管理员
Task说明所需技能

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

要将更改推广到由 AFT 管理 AWS 账户 的多个项目,请按照文档中 “重新调用自定义” 中的 AWS Control Tower 说明进行操作。

AWS 管理员