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

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

在本地验证 Account Factory 以获取 Terraform (AFT) 代码

由 Alexandru Pop (AWS) 和 Michal Gorniak () 创作 AWS

环境:生产

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

工作负载:开源

AWS服务:Cont AWS rol Tower

Summary

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

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

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

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

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

先决条件和限制

先决条件

限制

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

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

架构

目标技术堆栈

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

  • Terraform

  • Git

  • AWSCLI第 2 版

自动化和扩缩

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

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

工具

AWS服务

  • AWSCont@@ rol Tower 可帮助您按照规范性最佳做法设置和管理AWS多账户环境。

  • AWSCommand Line Interface (AWSCLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与AWS服务进行交互。

其他服务

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

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

代码

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

#! /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管理员

使示例代码运行。

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

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

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 配置文件复制到本地文件夹。

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

  1. 使用您的 Cont AWS rol Tower 管理账户凭据登录AWS管理控制台。然后打开AWS CodePipeline 控制台。请确保您所在的地区与您部署的AWS区域相同AFT。

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

  3. 选择 ###########-customizations-pipeline。(############ 是你用来在本地运行 Terrafor m 代码的AWS账户 ID)。

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

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

  6. 在 “应用 AFT-全局-自定义” 部分中,找到 “A pply-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文件绑定到特定的AWS帐户、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. 要提交您的更改并将其推送到中的远程AFT存储库 AWS CodeCommit,请运行以下命令:

    git commit -a git push

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

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

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

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

AWS管理员