

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

# 部署 AWS Control Tower Account Factory for Terraform（AFT）
<a name="aft-getting-started"></a>

 本部分适用于希望在现有环境中设置 Account Factory for Terraform（AFT）的 AWS Control Tower 环境管理员，介绍了如何使用新的专用 AFT 管理账户设置 Account Factory for Terraform（AFT）环境。

**注意**  
 Terraform 模块用于部署 AFT。此模块在 [AFT 存储库中](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main)可用 GitHub，整个 AFT 存储库被视为该模块。  
 我们建议您参考上的 AFT 模块， GitHub 而不是克隆 AFT 存储库。这样，您就可以在模块更新可用时控制和使用这些更新。

 有关最新版本的 AWS Control Tower Account Factory for Terraform (AFT) 功能[的详细信息，请参阅此 GitHub 存储库的版本文件](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/releases)。

 **部署先决条件** 

在配置并启动 AFT 环境之前，必须具备以下资源：
+  一个 AWS Control Tower 登录区的主区域。有关更多信息，请参阅 [AWS 区域 如何与 AWS Control Tower 配合使用](https://docs.aws.amazon.com/controltower/latest/userguide/region-how.html)。
+  一个 AWS Control Tower 登录区。有关更多信息，请参阅[规划您的 AWS Control Tower 登录区](https://docs.aws.amazon.com/controltower/latest/userguide/planning-your-deployment.html)。
+  AFT 管理账户，您可以在 AWS Control Tower 中预置该账户，也可以通过其他方式进行预置并注册 AWS Control Tower。
+  一个 Terraform 版本和发行版。有关更多信息，请参阅 [Terraform 和 AFT 版本](https://docs.aws.amazon.com/controltower/latest/userguide/version-supported.html)。
+  一个 VCS 提供程序，用于跟踪和管理代码和其他文件的更改。默认情况下，AFT 使用 AWS CodeCommit。有关更多信息，请参阅[什么是 AWS CodeCommit？](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 在《*AWS CodeCommit 用户指南》*中。

  如果您是首次部署 AFT，并且没有现有的 CodeCommit存储库，则必须选择外部 VCS 提供商，例如 GitHub 或 BitBucket。有关更多信息，请参阅 [Alternatives for version control of source code in AFT](https://docs.aws.amazon.com/controltower/latest/userguide/aft-alternative-vcs.html)。
+  一个运行时环境，您可以在其中运行安装 AFT 的 Terraform 模块。
+  AFT 功能选项。有关更多信息，请参阅[启用功能选项](https://docs.aws.amazon.com/controltower/latest/userguide/aft-feature-options.html)。

## 配置并启动 AWS Control Tower Account Factory for Terraform
<a name="aft-configure-and-launch"></a>

 以下步骤假定您熟悉 Terraform 工作流。您还可以通过关注 Worksho AWS p Studio 网站上的 A [FT 实验室简介来](https://catalog.workshops.aws/control-tower/en-US/customization/aft)了解有关部署 AFT 的更多信息。

 **第 1 步：启动 AWS Control Tower 登录区** 

 完成 [AWS Control Tower 入门](https://catalog.workshops.aws/control-tower/en-US/customization/aft)中的步骤。在这里，您可以创建 AWS Control Tower 管理账户并设置 AWS Control Tower 登录区。

**注意**  
 请务必为 AWS Control Tower 管理账户创建一个具有**AdministratorAccess**证书的角色。有关更多信息，请参阅下列内容：  
 《AWS Identity and Access Management 用户指南》**中的 [IAM 身份（用户、用户组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) 
 [AdministratorAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AdministratorAccess.html)在《*AWS 托管策略参考指南》*中 

 **第 2 步：为 AFT 创建新的组织单元（强烈推荐）** 

 我们建议您在 AWS Control Tower 登录区创建单独的 OU。该 OU 是您预置 AFT 管理账户的位置。通过您的 AWS Control Tower 管理账户创建新 OU 和 AFT 管理账户。有关更多信息，请参阅[创建新的 OU](https://docs.aws.amazon.com/controltower/latest/userguide/create-new-ou.html)。

 **第 3 步：预置 AFT 管理账户** 

 AFT 要求您配置一个专门用于 AFT 管理操作的 AWS 账户。在您登录与您的 AWS Control Tower 登录区关联的 AWS Control Tower 管理账户时，创建 AFT 管理账户。您可以从 AWS Control Tower 控制台预置 AFT 管理账户，方法是在**组织**页面上选择**创建账户**，或者通过其他方式进行预置。有关更多信息，请参阅[使用 Account Factory 配置 AWS Service Catalog 账户](https://docs.aws.amazon.com/controltower/latest/userguide/provision-as-end-user.html)。

**注意**  
如果您为 AFT 创建了单独的 OU，请确保在创建 AFT 管理账户时选择此 OU。

完全预置 AFT 管理账户最多可能需要 30 分钟时间。

 **第 4 步：验证 Terraform 环境是否可进行部署** 

 此步骤假定您有使用 Terraform 的经验，并且已经确定了用于执行 Terraform 的步骤。有关更多信息，请参阅 HashiCorp 开发者网站上[的 Command: in](https://developer.hashicorp.com/terraform/cli/commands/init) it。

**注意**  
 AFT 支持 Terraform `1.6.0` 版或更高版本。

 **第 5 步：可选配置**
+ **（可选）设置虚拟私有云（VPC）配置**

  AFT 模块包含一个 `aft_enable_vpc` 参数，用于指定 AWS Control Tower 是否在 VPC 内通过中央 AFT 管理账户预置账户资源。默认情况下，该参数设置为 `true`。如果您将此参数设置为 `false`，AWS Control Tower 将在*不*使用 VPC 和私有联网资源（例如 NAT 网关或 VPC 端点）的情况下部署 AFT。*对于某些使用模式*，禁用 `aft_enable_vpc` 可能有助于降低 AFT 的运营成本。添加任何 VPC 配置都会覆盖设置为 `false` 的 `aft_enable_vpc` 参数。
**注意**  
重新启用 `aft_enable_vpc` 参数（将值从 `false` 切换为 `true`）可能需要您连续运行两次 `terraform apply` 命令。

  您无需预置新 VPC，而是将 AFT 配置为使用您账户中的现有 VPC。要使用您自己的 VPC，请提供以下 VPC 配置参数：
  + `aft_customer_vpc_id` - 您现有 VPC 的 ID
  + `aft_customer_private_subnets`-您的 VPC IDs 中的私有子网列表

  示例配置：

  ```
  module "aft" {
    source = "github.com/aws-ia/terraform-aws-control_tower_account_factory"
    
    # VPC configuration
    aft_customer_vpc_id = "vpc-0123456789abcdef0"
    aft_customer_private_subnets = ["subnet-0123456789abcdef0", "subnet-0123456789abcdef1"]
    
    # Other AFT parameters...
  }
  ```
**重要**  
如果您已部署 AFT，我们不建议您使用自定义 VPC 选项。您可能依赖于 Lambda 函数 CodePipeline ，或者依赖底层现有 VPC 中的资源。
+ **（可选）配置 Terraform 项目名称**

  您可以通过设置 `terraform_project_name` 参数，自定义 AFT 使用的 Terraform 项目名称。默认情况下，AFT 将部署放在 Terraform Cloud 或 Terraform Enterprise 的“默认”项目中。

  示例配置：

  ```
  module "aft" {
    source = "github.com/aws-ia/terraform-aws-control_tower_account_factory"
    
    # Project name configuration
    terraform_project_name = "my-organization-aft"
    
    # Other AFT parameters...
  }
  ```
**注意**  
此参数仅适用于 Terraform Enterprise 或 Terraform Cloud 部署。
+ **（可选）将自定义标签应用于 AFT 资源**

  您可以使用 `tags` 参数，将自定义标签应用于所有 AFT 资源。这些标签有助于资源组织、成本分配和访问控制。

  示例配置：

  ```
  module "aft" {
    source = "github.com/aws-ia/terraform-aws-control_tower_account_factory"
    
    # Custom tags configuration
    tags = {
      Environment = "Production"
      CostCenter = "IT-12345"
      Project = "AFT-Deployment"
      Owner = "platform-team@example.com"
    }
    
    # Other AFT parameters...
  }
  ```

  将这些标签应用于 AFT 模块创建的所有资源。AFT 会自动为所有资源添加 `managed_by = "AFT"` 标签，自定义标签无法覆盖该标签。
**注意**  
可随时添加自定义标签，而不仅仅是在初始部署期间。
+ **（可选）将 AWS KMS 客户管理的加密密钥 (CMK) 应用于 CloudWatch 日志群组和 SNS 主题**

  要为日志组和 SNS 主题启用 KMS CMK 加密，请设置 `cloudwatch_log_group_enable_cmk_encryption` 和 `sns_topic_enable_cmk_encryption` 变量。

  如果您选择使用这些设置，AFT 将使用现有的 CMK *别名/aft* 来加密 CloudWatch 日志和 SNS 主题。此 CMK 是在通过 AFT 管理账户部署 AFT 时创建的，它可以应用于日志组和 SNS 主题。
  + 如果该变量设置`cloudwatch_log_group_enable_cmk_encryption`为 **true**，则使用 CMK 对 AFT 的 CloudWatch 日志组进行加密。如果将该变量设置为 **false**（默认值），则使用[服务器端加密对日志进行加密，默认使用 CloudWatch 日志](https://docs.aws.amazon.com//AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)。
  +  如果该变量设置`sns_topic_enable_cmk_encryption`为 **true**，则发送到 AFT SNS 主题（*aft-notifications 和 *aft-failure-notifications*）的通知*将使用 CMK 进行加密。如果将该变量设置为 **false**（默认值），则使用 AWS 管理的密钥对 SNS 消息进行加密：。*alias/aws/sns*有关更多信息，请参阅 [SSE 关键术语](https://docs.aws.amazon.com//sns/latest/dg/sns-server-side-encryption.html#sse-key-terms)。
+ **（可选）更改您的 CodeBuild 计算类型**

  在部署期间，要更改 AFT 使用的计算类型 CodeBuild，请设置变量`aft_codebuild_compute_type`。

  有关可接受的计算类型的信息，请参阅[关于按需环境类型](https://docs.aws.amazon.com//codebuild/latest/userguide/build-env-ref-compute-types.html#environment.types)。默认计算类型为 `BUILD_GENERAL1_MEDIUM`。
+ **（可选）为 Terraform 配置 OpenID Connect (OIDC)**

  使用Terraform Enterprise或HCP Terraform（前身为Terraform Cloud）的客户可以使用基于OIDC协议构建的Terraform的工作负载身份令牌（或动态提供商凭证）与AFT安全地连接和验证工作空间。

  您可以通过将参数设置为，为 AFT 工作空间启用 OIDC 集成。`terraform_oidc_integration` `true`默认情况下，此参数设置为 `false`。启用此参数时，如果默认值（`terraform_oidc_aws_audience`和，分别为）与您的环境不匹配`app.terraform.io`，则应检查`aws.workload.identity`和配置和`terraform_oidc_hostname`参数。

  示例配置：

  ```
  module "aft" {
    source = "github.com/aws-ia/terraform-aws-control_tower_account_factory"
    
    # Terraform distribution must be "tfc" or "tfe" for OIDC
    terraform_distribution = "tfc"
  
    # Terraform OIDC Configuration
    terraform_oidc_integration  = true
    terraform_oidc_aws_audience = "aws.workload.identity"  # default
    terraform_oidc_hostname     = "app.terraform.io"       # default; set to your TFE hostname if applicable
    
    # Other AFT parameters...
  }
  ```
**注意**  
此参数仅适用于 Terraform Enterprise 或 HCP Terraform 部署。
**注意**  
如果您目前正在AFT管理账户中使用Terraform的OIDC提供商，则在选择加入此集成之前，必须先删除该提供商。AFT 将在部署后为您重新创建该提供商。

**第 6 步：调用 Account Factory for Terraform 模块部署 AFT** 

 使用您为拥有**AdministratorAccess**证书的 AWS Control Tower 管理账户创建的角色调用 AFT 模块。AWS Control Tower 通过 AWS Control Tower 管理账户预置 Terraform 模块，该模块用于构建编排 AWS Control Tower Account Factory 请求所需的所有基础设施。

 您可以在上查看 AFT [存储库中的 AFT](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main) 模块 GitHub。整个 GitHub 存储库被视为 AFT 模块。请参考 [README 文件](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/blob/main/README.md)，了解运行 AFT 模块和部署 AFT 所需的输入的相关信息。您也可以在 [Terraform Registry](https://registry.terraform.io/modules/aws-ia/control_tower_account_factory/aws/latest) 中查看 AFT 模块。

 如果您的环境中已经构建了用于管理 Terraform 的管道，则可以将 AFT 模块集成到现有的工作流中。否则，请从任何使用所需凭证进行身份验证的环境中运行 AFT 模块。

 超时会导致部署失败。我们建议使用 AWS Security Token Service (STS) 凭证来确保您的超时时间足以进行完整部署。 AWS STS 证书的最小超时时间为 60 分钟。有关更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的 [IAM 临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。

**注意**  
 可能需要等待最多 30 分钟，AFT 才能通过 Terraform 模块完成部署。

 **第 7 步：管理 Terraform 状态文件** 

 部署 AFT 时，会生成一个 Terraform 状态文件。该构件描述了 Terraform 所创建的资源的状态。如果您计划更新 AFT 版本，请确保保留 Terraform 状态文件，或者使用 Amazon S3 和 DynamoDB 设置 Terraform 后端。AFT 模块不会管理后端 Terraform 状态。

**注意**  
 您负责保护 Terraform 状态文件。某些输入变量可能包含敏感值，例如私有 `ssh` 密钥或 Terraform 令牌。这些值可能可以在 Terraform 状态文件中以纯文本形式查看，具体取决于您的部署方法。有关更多信息，请参阅 HashiCorp 网站上的[状态敏感数据](https://www.terraform.io/docs/language/state/sensitive-data.html)。