选择您的 Cookie 首选项

我们使用必要 Cookie 和类似工具提供我们的网站和服务。我们使用性能 Cookie 收集匿名统计数据,以便我们可以了解客户如何使用我们的网站并进行改进。必要 Cookie 无法停用,但您可以单击“自定义”或“拒绝”来拒绝性能 Cookie。

如果您同意,AWS 和经批准的第三方还将使用 Cookie 提供有用的网站功能、记住您的首选项并显示相关内容,包括相关广告。要接受或拒绝所有非必要 Cookie,请单击“接受”或“拒绝”。要做出更详细的选择,请单击“自定义”。

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

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

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

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

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

摘要

注意: AWS CodeCommit 不再向新客户开放。的现有客户 AWS CodeCommit 可以继续照常使用该服务。了解更多

此模式显示了如何在本地测试由 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 中克隆存储库。

工具

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

操作说明

Task描述所需技能

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

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

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

AWS 管理员

使示例代码运行。

打开终端窗口,通过执行以下任一操作 AWS 在您的 AFT 管理账户中进行身份验证:

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

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

注意

您的组织可能还有一个自定义工具,可以为您的 AWS 环境提供身份验证凭证。

AWS 管理员

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

重要

确保使用与 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描述所需技能

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

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

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

AWS 管理员

使示例代码运行。

打开终端窗口,通过执行以下任一操作 AWS 在您的 AFT 管理账户中进行身份验证:

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

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

注意

您的组织可能还有一个自定义工具,可以为您的 AWS 环境提供身份验证凭证。

AWS 管理员

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

重要

确保使用与 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 Management Console确保您与部署 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 管理员

创建 AFT 管道本地运行所需 Terraform 配置文件

Task描述所需技能

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

注意

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

  1. 使用您的 AWS Control Tower 管理账户凭据登录并打开AWS CodePipeline 控制台。 AWS Management Console确保您与部署 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 管理员

使用示例 bash 脚本,在本地运行 AFT 管道

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.tf aft-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 管理员

将您的本地代码更改推送回 AFT 存储库

Task描述所需技能

将对backend.tfaft-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. 要提交您的更改并将其推送到中的远程 AFT 存储库 CodeCommitt,请运行以下命令:

    git commit -a git push
重要

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

AWS 管理员
Task描述所需技能

对所有由 AFT 管理的账户进行更改。

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

AWS 管理员

将更改推广到多个账户

Task描述所需技能

对所有由 AFT 管理的账户进行更改。

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

AWS 管理员

本页内容

隐私网站条款Cookie 首选项
© 2025, Amazon Web Services, Inc. 或其附属公司。保留所有权利。