

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

# 利用 AWS Control Tower Account Factory for Terraform（AFT）预置账户
<a name="taf-account-provisioning"></a>

AWS Control Tower Account Factory for Terraform (AFT) 采用一种 GitOps 模型，可以自动在 AWS Control Tower 中配置和更新账户。

使用 AFT，您可以创建一个账户请求 Terraform 文件，其中包含用于调用 AFT 工作流的输入信息。账户预置和更新完成后，AFT 工作流会继续运行 AFT 账户预置框架和账户自定义步骤。

AFT 不会影响 AWS Control Tower 中的工作流性能。如果您通过 AFT 或 Account Factory 预置账户，将会执行相同的后端工作流。

## 先决条件
<a name="aft-prerequisites"></a>

**注意**  
AFT 账户配置必须针对在 AWS Control Tower 中 AWSControlTowerBaseline 启用的组织单位 (OU)。有关详细信息 AWSControlTowerBaseline，请参阅：[适用于 OU 级别的基准类型](types-of-baselines.md#ou-baseline-types)。

在开始使用 AFT 之前，必须创建以下内容：
+ 在 AWS Control Tower 中，为您的 AFT 环境创建 OU，然后创建 AFT 管理账户。记下账户 ID，以便稍后在使用 Terraform 模块部署 AFT 时将其输入 `main.tf` 文件中。您可以在 AWS Control Tower **控件详细信息**页面上查看此账户 ID。有关更多信息，请参阅[ Terraform 文档](https://developer.hashicorp.com/terraform/tutorials/aws/aws-control-tower-aft)。
+ 完全部署的 AFT 环境中的一个或多个 `git` 存储库。有关更多信息，请参阅 [Post-deployment steps for AFT](https://docs.aws.amazon.com/controltower/latest/userguide/aft-post-deployment.html)。
+ 全面部署的 AFT 环境。有关更多信息，请参阅 [AWS Control Tower Account Factory for Terraform（AFT）概述](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html)以及[部署 AWS Control Tower Account Factory for Terraform（AFT）](https://docs.aws.amazon.com/controltower/latest/userguide/aft-getting-started.html)。另请参阅 [Terraform 文档](https://developer.hashicorp.com/terraform/tutorials/aws/aws-control-tower-aft)。

**提示**  
您可以通过 AWS Control Tower 控制台使用**创建账户**来创建 AFT 管理账户。有关更多信息，请参阅[预置的方法](https://docs.aws.amazon.com//controltower/latest/userguide/methods-of-provisioning.html)。  
此外，您也可以选择在**aft-account-customizations**存储库中创建一个账户模板文件夹，以帮助定义其他账户。

对于通过自动注册注册的账户：
+ 通过 AFT 创建新账户可以继续正常运行。
+ 导入现有账户需要其他步骤：
  + 在导入之前，注册 OU 以创建必要的预配置产品。
  + 注册 OU 将发出`CreateManagedAccount`和`UpdateManagedAccount`事件，启用 AFT 自定义。

有关 AFT AWS 区域 在哪些地方有部署限制的信息，请参见[AWS Control Tower 中的限制和配额](limits.md)和[控件限制](control-limitations.md)。

[Terraform 文档](https://developer.hashicorp.com/terraform/tutorials/aws/aws-control-tower-aft)很好地概述了如何设置 AWS Control Tower Account Factory for Terraform（AFT）。

# AWS Control Tower Account Factory for Terraform（AFT）概述
<a name="aft-overview"></a>

 Account Factory for Terraform（AFT）设置 Terraform 管道来帮助您在 AWS Control Tower 中预置和自定义账户。AFT 为您提供基于 Terraform 的账户预置的优势，同时让您可以使用 AWS Control Tower 管理您的账户。

 借助 AFT，您可以创建一个*账户请求 Terraform 文件*，以获取触发 AFT 账户预置工作流的输入。账户预置阶段完成后，AFT 会在账户自定义阶段开始之前自动运行一系列步骤。有关更多信息，请参阅 [AFT account provisioning pipeline](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provisioning-framework.html)。

 AFT 支持 Terraform 云、Terraform 企业版和 Terraform 社区版。借助 AFT，您可以使用输入文件和一个简单的 `git push` 命令启动账户创建，并自定义新账户或现有账户。账户创建包括 AWS Control Tower 的所有治理优势和账户自定义，可帮助您满足组织的标准安全程序和合规性准则。

 AFT 支持账户自定义请求跟踪。每次您提交账户自定义请求时，AFT 都会生成一个唯一的跟踪令牌，该令牌通过 AFT 自定义 AWS Step Functions 状态机传递，该状态机将令牌记录为其执行的一部分。然后，您可以使用 Amazon CloudWatch Logs 见解查询来搜索时间戳范围并检索请求令牌。因此，您可以看到令牌附带的有效载荷，这使您可以在整个 AFT 工作流中跟踪您账户的自定义请求。有关 CloudWatch 日志和 Step Functions 的信息，请参阅以下内容：
+  [什么是 Amazon CloudWatch 日志？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 在 *Amazon CloudWatch 日志用户指南*中 
+  《AWS Step Functions 开发人员指南》**中的 [What is AWS Step Functions?](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)

AFT 将构建框架的其他 AWS 服务的功能与部署 Terraform 基础设施即代码 (IaC) 的管道相结合。[组件服务](aft-components.md)AFT 让您能够：
+ 在 GitOps 模型中提交账户配置和更新请求
+ 存储账户元数据和审计历史记录
+ 应用账户级标签
+ 为所有账户、一组账户或个别账户添加自定义设置
+ 启用功能选项

AFT 创建了一个名为 *AFT 管理账户*的单独账户来部署 AFT 功能。您必须已有的 AWS Control Tower 登录区，然后才能设置 AFT。AFT 管理账户与 AWS Control Tower 管理账户有所不同。

**AFT 提供了灵活性**
+ **平台的灵活性：**AFT 支持任何 Terraform 发行版的初始部署和持续运行：Terraform 社区版、Terraform 云和 Terraform 企业版。
+ **版本控制系统的灵活性：**AFT 支持 AWS CodeCommit，其他版本控制源可通过 AWS CodeConnections。

**AFT 提供功能选项**

您可以根据最佳实践启用多个功能选项：
+ 创建 CloudTrail 用于记录数据事件的组织级别
+ 删除账户的 AWS 默认 VPC
+ 将已配置的账户注册到 Enterprise Su AWS pport 计划中

**注意**  
AFT 管道不适用于部署您的账户运行应用程序所需的资源，例如 Amazon EC2 实例。它仅用于自动预置和自定义 AWS Control Tower 账户。

## 视频演练
<a name="terraform-provisioning-video"></a>

此视频（7:33）描述了如何使用 AWS Control Tower Account Factory for Terraform 部署账户。为了更好地观看，请选择视频右下角的图标以将其放大为全屏。可以使用字幕。

[![AWS Videos](http://img.youtube.com/vi/eDbNvHz02dk/0.jpg)](http://www.youtube.com/watch?v=eDbNvHz02dk)


# AFT 架构
<a name="aft-architecture"></a>

## 操作顺序
<a name="aft-operation"></a>

 您在 AFT 管理账户中运行 AFT 操作。对于完整的账户预置工作流，图中从左到右的阶段顺序如下：

1.  账户请求已创建并已提交给管道。您可以一次创建和提交多个账户请求。Account Factory 处理 first-in-first-out订单中的请求。有关更多信息，请参阅 [Submit multiple account requests](https://docs.aws.amazon.com/controltower/latest/userguide/aft-multiple-account-requests.html)。

1.  每个账户都已预置。此阶段在 AWS Control Tower 管理账户中运行。

1.  全局自定义项在为每个提供的账户创建的管道中运行。

1.  如果在初始账户预置请求中指定了自定义项，则自定义项仅在目标账户上运行。如果您的账户已预置完毕，那么您必须在该账户的管道中手动启动进一步的自定义设置。

**AWS Control Tower Account Factory for Terraform – 账户预置工作流**

![\[图：AFT 工作流图\]](http://docs.aws.amazon.com/zh_cn/controltower/latest/userguide/images/high-level-aft-diagram.png)


# 成本
<a name="aft-pricing"></a>

使用 AFT 无需额外付费。您只需为 AFT 部署的资源、AFT 启用的 AWS 服务以及在 AFT 环境中部署的资源付费。

默认 AFT 配置包括 AWS PrivateLink 端点分配（用于增强数据保护和安全性）以及需要支持的 NAT 网关 AWS CodeBuild。有关此基础设施定价的详细信息，请参阅 [AWS PrivateLink 定价](https://aws.amazon.com//privatelink/pricing/)和[适用于 NAT 网关的 Amazon VPC 定价](https://aws.amazon.com//vpc/pricing/)。有关管理这些费用的更多具体信息，请联系您的 AWS 客户代表。您可以更改 AFT 的这些默认设置。

# 部署 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)。

# 部署后步骤
<a name="aft-post-deployment"></a>

完成 AFT 基础设施部署后，请继续按照以下步骤操作，以完成设置流程并准备好预置账户。

**第 1 步： CodeConnections 与您想要的 VCS 提供商一起填写**

如果您选择第三方 VCS 提供商，AFT 将建立 CodeConnections，并由您进行确认。请参阅[AFT 中源代码版本控制的替代方案](aft-alternative-vcs.md)，了解如何使用首选 VCS 设置 AFT。

建立 AWS CodeStar 连接的第一步由 AFT 完成。您必须确认连接。

**第 2 步：填充每个存储库**

AFT 要求您管理[四个存储库：](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos)

1. 账户请求 - 此存储库处理账户请求的放置或更新。[可在此处查看示例](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-request)。有关 AFT 账户请求的更多信息，请参阅[使用 AFT 预置新账户](aft-provision-account.md)。

1. AFT 账户预置自定义 - 在开始全局自定义阶段之前，此存储库管理应用于 AFT 创建和管理的所有账户的自定义设置。[可在此处查看示例](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-provisioning-customizations)。要创建 AFT 账户预置自定义，请参阅[创建 AFT 账户预置自定义状态机](aft-provisioning-framework.md#aft-create-customizations)。

1. 全局自定义 - 此存储库管理应用于 AFT 创建和管理的所有账户的自定义设置。[可在此处查看示例](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-global-customizations)。要创建 AFT 全局自定义项，请参阅[应用全局自定义](aft-account-customization-options.md#aft-global-customizations)。

1. 账户自定义 - 此存储库管理仅应用于 AFT 创建和管理的特定账户的自定义设置。[可在此处查看示例](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-customizations)。要创建 AFT 账户自定义，请参阅[应用账户自定义](aft-account-customization-options.md#aft-account-customizations)。

 AFT 希望上述每个存储库都遵循特定的目录结构。您可以查看 [AFT github 存储库](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos)中的 Account Factory for Terraform 模块，找到用于填充存储库的模板和描述如何填充模板的说明。

# 使用 AFT 预置新账户
<a name="aft-provision-account"></a>

*本节假设您已经设置了 AFT 和 AFT 管理账户，并且要预置其他账户。*

要使用 AFT 预置新账户，需要创建一个账户请求 Terraform 文件。此文件包含**aft-account-request**存储库中参数的输入。创建账户请求 Terraform 文件后，通过运行 `git push` 开始处理您的账户请求。此命令调用中的`ct-aft-account-request`操作 AWS CodePipeline，该操作是在账户配置完成后在 AFT 管理账户中创建的。有关更多信息，请参阅 [AFT account provisioning pipeline](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provisioning-framework.html)。

## 账户请求 Terraform 文件参数
<a name="w2aac44c33c15b7"></a>

 您必须在账户请求 Terraform 文件中添加以下参数。你可以在上查看 [Terraform 账户请求文件示例](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-request)。 GitHub
+  `module name` 的值对于每个 AWS 账户 请求必须是唯一的。
+  `module source` 的值是 AFT 提供的账户请求 Terraform 模块的路径。
+  `control_tower_parameters` 的值会捕获创建 AWS Control Tower 账户所需的输入信息。该值包含以下输入字段：
  + `AccountEmail`
  + `AccountName`
  +  `ManagedOrganizationalUnit` 
  + `SSOUserEmail`
  + `SSOUserFirstName`
  + `SSOUserLastName`

**注意**  
 在账户预置期间，为 `control_tower_parameters` 提供的输入内容无法更改。  
 支持在**aft-account-request**存储库`ManagedOrganizationalUnit`中指定的格式包括`OUName`和`OUName (OU-ID)`。
+  `account_tags`捕获用户定义的密钥和值，这些密钥和值可以 AWS 账户 根据业务标准进行标记。有关更多信息，请参阅《AWS Organizations 用户指南》**中的 [Tagging AWS Organizations resources](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_tagging.html)。
+  `change_management_parameters` 的值会捕获其他信息，例如创建账户请求的原因以及账户请求的发起者。该值包含以下输入字段：
  + `change_reason`
  + `change_requested_by`
+  `custom_fields`使用密钥和值捕获其他元数据，这些密钥和值作为 SSM 参数部署在 /-fields**/aft/account-request/custom**下的已售帐户中。在账户自定义过程中，您可以引用此元数据来部署适当的控件。例如，受监管合规约约束的账户可能会额外部署 AWS Config 规则。在账户预置和更新期间，您通过 `custom_fields` 收集的元数据可能会调用其他处理操作。如果从账户请求中删除了一个自定义字段，则该自定义字段也会从所提供账户的 SSM Parameter Store 中删除。
+  （可选）`account_customizations_name`捕获**aft-account-customizations**存储库中的账户模板文件夹。有关更多信息，请参阅 [Account customizations](https://docs.aws.amazon.com/controltower/latest/userguide/aft-account-customization-options.html)。

# 提交多个账户请求
<a name="aft-multiple-account-requests"></a>

 AFT 一次处理一个账户请求，但您可以向 AFT 管道提交多个账户请求。当您向 AFT 管道提交多个账户请求时，AFT 会按先入先出的顺序对账户请求进行排队和处理。

**注意**  
 您可以为希望 AFT 预置的每个账户创建一个账户请求 Terraform 文件，或者在单个账户请求 Terraform 文件中级联多个账户请求。

# 更新现有账户
<a name="aft-update-account"></a>

**自动注册兼容性**  
如果您的组织使用自动注册来自动注册帐户，请注意AFT在导入这些帐户方面存在限制。通过 Auto Enroll 注册的账户缺少 AFT 导入工作流程所需的 Service Catalog 预配置产品。  
**解决办法：**使用注册 OU 功能为自动注册的账户创建预配置产品。这为 AFT 自定义启用了必要的生命周期事件。

 您可以通过编辑先前提交的账户请求并运行 `git push` 来更新 AFT 预置的账户。该命令会调用账户预置工作流，并且可以处理账户更新请求。您可以更新 `ManagedOrganizationalUnit` 的输入内容，这是 `control_tower_parameters` 所需值的一部分。

在所有 `control_tower_parameters` 中，`ManagedOrganizationalUnit` 是唯一可以更新的参数。但是，账户请求 Terraform 文件中所包含的其他参数也可以进行更新，例如 `custom_fields`。有关更多信息，请参阅 [Provision a new account with AFT](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provision-account.html)。

例如，要更新 AFT 账户的名称或电子邮件地址，您可以在“账户请求”文件中将具体细节定义为 `custom_fields`。为此，您需要创建 SSM 参数，您可以在全局自定义期间将这些参数传递到 `aws_account_alternate_contact` 资源中。

```
resource "aws_account_alternate_contact" "operations" {

  alternate_contact_type = "OPERATIONS"

  name          = "Example"
  title         = "Example"
  email_address = "someone@example.com"
  phone_number  = "+1234567890"
}
```

您可以为其他联系人类型添加类似字段，例如操作和安全性。在“全局自定义”中，为每个自定义字段添加数据查询，以确保您查找在“账户请求”中创建的所有字段：

```
data "aws_ssm_parameter" "billing_name" {
            name = "/aft/account-request/custom-fields/billing_name"
            }
            
            data "aws_ssm_parameter" "billing_title" {
            name = "/aft/account-request/custom-fields/billing_title"
            }
            
            data "aws_ssm_parameter" "billing_email_address" {
            name = "/aft/account-request/custom-fields/billing_email_address"
            }
            
            data "aws_ssm_parameter" "billing_phone_number" {
            name = "/aft/account-request/custom-fields/billing_phone_number"
            }
```

最后，还需在“全局自定义”文件中，创建备用联系人资源。您需要为在“账户请求”中创建的每种联系人类型定义以下一个数据块：

```
resource "aws_account_alternate_contact" "billing" {
            
            alternate_contact_type = "BILLING"
            
            name          = data.aws_ssm_parameter.billing_name.value
            title         = data.aws_ssm_parameter.billing_title.value
            email_address = data.aws_ssm_parameter.billing_email_address.value
            phone_number  = data.aws_ssm_parameter.billing_phone_number.value
            }
```

**注意**  
 在账户预置期间，为 `control_tower_parameters` 提供的输入内容无法更改。  
 支持在**aft-account-request**存储库`ManagedOrganizationalUnit`中指定的格式包括`OUName`和`OUName (OU-ID)`。

## 更新 AFT 未预置的账户
<a name="aft-update-account-not-provision"></a>

 您可以通过在**aft-account-request**存储库中指定账户来更新在 AFT 之外创建的 AWS Control Tower 账户。

**注意**  
 确保所有账户详情正确无误，并与 AWS Control Tower 组织和相应的 AWS Service Catalog 预配置产品保持一致。

**使用 AFT 更新现有版本 AWS 账户 的先决条件**
+  AWS 账户 必须在 AWS Control Tower 中注册。
+  AWS 账户 必须是 AWS Control Tower 组织的一部分。

# Terraform 和 AFT 版本
<a name="version-supported"></a>

Account Factory for Terraform（AFT）支持 Terraform 版本 `1.6.0` 或更高版本。您必须提供 Terraform 版本作为 AFT 部署过程的输入参数，如以下示例所示。

```
terraform_version = "1.6.0"
```

## Terraform 发行版
<a name="terraform-distributions"></a>

AFT 支持以下三种 Terraform 发行版：
+ Terraform Community Edition
+ Terraform Cloud
+ Terraform Enterprise

这些发行版将在以下部分详细介绍。在 AFT 引导过程中，提供您选择的 Terraform 发行版作为输入参数。有关 AFT 部署和输入参数的更多信息，请参阅 [部署 AWS Control Tower Account Factory for Terraform（AFT）](aft-getting-started.md)。

如果您选择 Terraform Cloud 或 Terraform Enterprise 发行版，则为 `terraform_token ` 指定的 [API 令牌](https://www.terraform.io/cloud-docs/users-teams-organizations/api-tokens)必须是 User 或 Team API 令牌。并非所有必需的 API 都支持 Organization 令牌。出于安全考虑，您必须避免通过分配 [terraform 变量](https://www.terraform.io/cloud-docs/workspaces/variables/managing-variables)来将此令牌的值签入版本控制系统（VCS），如以下示例所示。

```
 # Sensitive variable managed in Terraform Cloud:
 terraform_token = var.terraform_cloud_token
```

### Terraform Community Edition
<a name="terraform-oss"></a>

如果选择 Terraform Community Edition 作为发行版，AFT 会在 AFT 管理账户中为您管理 Terraform 后端。AFT 会下载您指定的 Terraform 版本的 `terraform-cli`，以便在 AFT 部署和 AFT 管道阶段运行。生成的 Terraform 状态配置存储在 Amazon S3 存储桶中，其命名形式如下：

```
aft-backend-[account_id]-primary-region
```

AFT 还会创建一个 Amazon S3 存储桶，用于将您的 Terraform 状态配置复制到另一个 AWS 区域中，以实现灾难恢复，其命名形式如下：

```
aft-backend-[account_id]-secondary-region
```

我们建议您在这些 Terraform 状态 Amazon S3 存储桶上针对删除功能启用多重身份验证（MFA）。要了解有关 Terraform Community Edition 的更多信息，请参阅 [Terraform 文档](https://www.terraform.io/docs/cli/index.html)。

要选择 Terraform OSS 作为发行版，请提供以下输入参数：

```
terraform_distribution = "oss"
```

### Terraform Cloud
<a name="terraform-cloud"></a>

 如果选择 Terraform Cloud 作为发行版，AFT 会为您的 Terraform Cloud 组织中的以下组件创建工作区，从而启动 API 驱动型工作流。
+  账户申请 
+  AFT 预置的账户的 AFT 自定义 
+  AFT 预置的账户的账户自定义 
+  AFT 预置的账户的全局自定义 

 Terraform Cloud 管理生成的 Terraform 状态配置。

 如果选择 Terraform Cloud 作为发行版，请提供以下输入参数：
+  `terraform_distribution = "tfc"` 
+  `terraform_token` - 此参数包含 Terraform Cloud 令牌的值。AFT 将该值标记为敏感值，并将其作为安全字符串存储在 AFT 管理账户的 SSM Parameter Store 中。我们建议您根据公司的安全策略和合规性准则定期轮换 Terraform 令牌的值。Terraform 令牌应是 User 或 Team 级别的 API 令牌。不支持 Organization 令牌。
+  `terraform_org_name` - 此参数包含您的 Terraform Cloud 组织的名称。

**注意**  
 不支持在单个 Terraform Cloud 组织中部署多个 AFT。

 有关如何设置 Terraform Cloud 的信息，请参阅 [Terraform 文档](https://www.terraform.io/docs/cloud/index.html)。

### Terraform Enterprise
<a name="terraform-enterprise"></a>

如果选择 Terraform Enterprise 作为发行版，AFT 会为您的 Terraform Enterprise 组织中的以下组件创建工作区，并为由此生成的 Terraform 运行触发 API 驱动型工作流。
+ 账户申请
+ AFT 预置的账户的 AFT 账户预置自定义
+ AFT 预置的账户的账户自定义
+ AFT 预置的账户的全局自定义

生成的 Terraform 状态配置由您的 Terraform Enterprise 设置管理。

要选择 Terraform Enterprise 作为发行版，请提供以下输入参数：
+  `terraform_distribution = "tfe"` 
+ `terraform_token` - 此参数包含您的 Terraform Enterprise 令牌的值。AFT 将其值标记为敏感值，并将其作为安全字符串存储在 AFT 管理账户的 SSM Parameter Store 中。我们建议您根据公司的安全策略和合规性准则定期轮换 Terraform 令牌的值。
+ `terraform_org_name` - 此参数包含您的 Terraform Enterprise 组织的名称。
+ `terraform_api_endpoint` - 此参数包含您的 Terraform Enterprise 环境的 URL。此参数的值必须采用以下格式：

  ```
  https://{fqdn}/api/v2/
  ```

有关如何设置 Terraform Enterprise 的更多信息，请参阅 [Terraform 文档](https://www.terraform.io/docs/enterprise/index.html)。

# 检查 AFT 版本
<a name="check-aft-version"></a>

您可以通过查询 AWS SSM Parameter Store 密钥来检查已部署的 AFT 版本：

```
/aft/config/aft/version
```

如果您使用注册表方法，则可以固定相应版本。

```
module "control_tower_account_factory" {
  source  = "aws-ia/control_tower_account_factory/aws"
  version = "1.3.2"
  # insert the 6 required variables here
}
```

您可以在 [AFT 存储库](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main)中查看有关 AFT 版本的更多信息。

# 更新 AFT 版本
<a name="update-aft-version"></a>

登录 AWS Control Tower 管理账户以启动此 AFT 更新。

您可以通过从 `main` 存储库分支中提取已部署的 AFT 版本来更新该版本：

```
terraform get -update
```

提取完成后，您可以重新运行 Terraform 计划或运行应用以使用最新更改更新 AFT 基础设施。

# 启用功能选项
<a name="aft-feature-options"></a>

AFT 根据最佳实践提供功能选项。在 AFT 部署期间，您可以通过功能标志来选择使用这些功能。有关 AFT 输入配置参数的更多信息，请参阅 [使用 AFT 预置新账户](aft-provision-account.md)。

默认情况下，这些功能未启用。您必须在您的环境中明确启用每项功能。

**Topics**
+ [AWS CloudTrail 数据事件](#cloudtrail-data-event-option)
+ [AWS 企业 Support 计划](#enterprise-support-option)
+ [删除 AWS 默认 VPC](#delete-default-vpc-option)

## AWS CloudTrail 数据事件
<a name="cloudtrail-data-event-option"></a>

启用后， AWS CloudTrail 数据事件选项将配置这些功能。
+ 在 AWS Control Tower 管理账户中创建组织跟踪，用于 CloudTrail
+ 开启 Amazon S3 和 Lambda 数据事件的日志记录
+ 使用加密功能加密所有 CloudTrail 数据事件并将其导出到 AWS Control Tower 日志存档账户中的 `aws-aft-logs-*` S3 存储桶 AWS KMS 
+ 启用**日志文件验证**设置

要启用此选项，请在 AFT 部署输入配置中将以下功能标志设置为 **true**。

```
aft_feature_cloudtrail_data_events
```

**先决条件**

在启用此功能选项之前，请确保在您的组织中 AWS CloudTrail 启用了的可信访问权限。

**要检查以下各项的可信访问状态 CloudTrail ：**

1. 导航到 AWS Organizations 控制台。

1. 选择 “**服务” > CloudTrail**。

1. 然后根据需要选择右上角的**启用可信访问权限**。

您可能会收到一条警告消息，建议您使用 AWS CloudTrail 控制台，但在这种情况下，请忽略该警告。在您准许可信访问之后，AFT 会创建跟踪，作为启用此功能选项的一部分。如果未启用可信访问，则当 AFT 尝试为数据事件创建跟踪时，您将收到一条错误消息。

**注意**  
此设置在组织级别起作用。启用此设置会影响中的所有账户 AWS Organizations，无论这些账户是否由 AFT 管理。启用此项设置时，AWS Control Tower 日志存档账户中的所有存储桶都将排除在 Amazon S3 数据事件之外。要了解更多信息，请参阅[AWS CloudTrail 用户指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) CloudTrail。

## AWS 企业 Support 计划
<a name="enterprise-support-option"></a>

启用此选项后，AFT 管道将为由 AFT 配置的账户开启 AWS 企业支持计划。

AWS 默认情况下，账户已启用 B AWS asic Support 计划。对于 AFT 预置的账户，AFT 提供企业支持级别的自动注册功能。配置过程会为该账户打开支持请求，请求将其添加到 E AWS nterprise Support 计划中。

要启用 Enterprise Support 选项，请在 AFT 部署输入配置中将以下功能标志设置为 **true**。

```
aft_feature_enterprise_support=false
```

要了解有关[AWS 支持计划的更多信息，请参阅比较](https://aws.amazon.com/premiumsupport/plans/) AWS 支持计划。

**注意**  
要使此功能正常运行，您必须将付款人账户注册到 Enterprise Support 计划。

## 删除 AWS 默认 VPC
<a name="delete-default-vpc-option"></a>

 启用此选项后，AFT 会删除 AFT 管理账户 VPCs 中的所有 AWS 默认值以及所有默认值 AWS 区域，即使尚未在这些账户中部署 AWS Control Tower 资源也是如此 AWS 区域。

 AFT 不会 VPCs 自动删除 AFT 配置的任何 AWS Control Tower 账户或您通过 AFT 在 AWS Control Tower 中注册的现有 AWS 账户的 AWS 默认账户。

默认情况下，创建新 AWS 账户时每个 AWS 区域账户都设置了 VPC。您的企业可能有标准的创建惯例 VPCs，这要求您删除 AWS 默认 VPC，并避免启用默认 VPC，尤其是对于 AFT 管理账户。

要启用此选项，请在 AFT 部署输入配置中将以下功能标志设置为 **true**。

```
aft_feature_delete_default_vpcs_enabled
```

以下是 AFT 部署输入配置的示例。

```
module "aft" {
  source = "github.com/aws-ia/terraform-aws-control_tower_account_factory"
  ct_management_account_id    = var.ct_management_account_id
  log_archive_account_id      = var.log_archive_account_id
  audit_account_id            = var.audit_account_id
  aft_management_account_id   = var.aft_management_account_id
  ct_home_region              = var.ct_home_region
  tf_backend_secondary_region = var.tf_backend_secondary_region

  vcs_provider                                  = "github"
  account_request_repo_name                     = "${var.github_username}/learn-terraform-aft-account-request"
  account_provisioning_customizations_repo_name = "${var.github_username}/learn-terraform-aft-account-provisioning-customizations"
  global_customizations_repo_name               = "${var.github_username}/learn-terraform-aft-global-customizations"
  account_customizations_repo_name              = "${var.github_username}/learn-terraform-aft-account-customizations"

  # Optional Feature Flags
  aft_feature_delete_default_vpcs_enabled = true
  aft_feature_cloudtrail_data_events      = false
  aft_feature_enterprise_support          = false
}
```

要了解有关[默认的更多信息，请参阅默认 VPC 和默认 VPCs子网](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)。

# AWS Control Tower Account Factory for Terraform 的资源注意事项
<a name="aft-resources"></a>

当您使用适用于 Terraform 的 AWS Control Tower Account Factory 设置着陆区时，会在您的 AWS 账户中创建多种类型的 AWS 资源。

**搜索资源**
+ 您可以使用标签来搜索最新的 AFT 资源列表。用于进行搜索的键值对如下：

  ```
  Key: managed_by | Value: AFT
  ```
+ 对于不支持标签的组件服务，您可以通过在资源名称中搜索 `aft` 来查找资源。

**注意**  
AFT 不会在管理账户中创建任何 AWS Backup 资源。

**最初创建的资源表（按账户划分）**


**AWS Control Tower Account Factory for Terraform 管理账户**  

| **AWS service** | **资源类型** | **资源名称** | 
| --- | --- | --- | 
| AWS Identity and Access Management | 角色 |  AWSAFTAdmin AWSAFTExecution AWSAFTService ct-aft-\$1 aft-\$1 codebuild\$1trigger\$1role python-layer-builder-aft-common-\$1 | 
| AWS Identity and Access Management | 策略 | aft-\$1 | 
| CodeCommit | Repositories | aft-\$1 | 
| CodeBuild | 构建项目 | aft-\$1 ct-aft-\$1 python-layer-builder-aft-common-\$1  | 
| 代码管道 | 管道 | **YourAccountId**-customizations-pipeline | 
| Amazon S3 | 存储桶 | aft-\$1  | 
| Lambda | 函数 | aft-\$1 | 
| Lambda | 图层 | aft-common-\$1 | 
| DynamoDB | 表 | aft-request aft-request-audit aft-request-metadata aft-controltower-events | 
| Step Functions | 状态机 | aft-account-provisioning-customizations aft-account-provisioning-framework aft-feature-options aft-invoke-customizations | 
| VPC | VPC | aft-management-vpc | 
| Amazon SNS | 主题 | aft-notifications aft-failure-notifications | 
| 亚马逊 EventBridge | 事件总线 | aft-events-from-ct-management | 
| 亚马逊 EventBridge | 事件规则 | aft-account-provisioning-customizations-trigger aft-account-request-codepipeline-trigger aft-lambda-account-request-processor aft-controltower-event-logger | 
| Key Management Service（KMS） | 客户托管密钥 | aft-backend-\$1-kms-key aft | 
| AWS Systems Manager | Parameter Store | /aft/\$1  | 
| Amazon SQS | 队列 | aft-account-request.fifo aft-account-request-dlg.fifo | 
| CloudWatch | 日志组 | /aws/\$1/ct-aft-\$1 /aws/\$1/aft-\$1 /aws/codebuild/python-layer-builder-aft-common-\$1 | 
| AWS Backup | 保管库 | aft-controltower-backup-vault | 
| AWS Backup | 计划 | aft-controltower-backup-plan | 
| AWS Support Center（可选） | Support 计划 | Enterprise | 


**AWS 通过 AWS Control Tower Account Factory 为 Terraform 配置的账户**  

| **AWS service** | **资源类型** | **资源名称** | 
| --- | --- | --- | 
| AWS Identity and Access Management | 角色 | AWSAFTExecution | 
| AWS Support Center（可选） | Support 计划 | Enterprise | 


**AWS Control Tower 管理账户**  

| **AWS service** | **资源类型** | **资源名称** | 
| --- | --- | --- | 
| AWS Identity and Access Management | 角色 |  AWSAFTExecution AWSAFTService aft-controltower-events-rule  | 
| AWS Systems Manager | Parameter Store | /aft/\$1 | 
| EventBridge | 事件规则 | aft-capture-ct-events | 
| CloudTrail （可选） | 跟踪 | aws-aft-CustomizationsCloudTrail | 
| AWS Support Center（可选） | Support 计划 | Enterprise | 


**AWS Control Tower 日志存档账户**  

| **AWS service** | **资源类型** | **资源名称** | 
| --- | --- | --- | 
| AWS Identity and Access Management | 角色 |  AWSAFTExecution AWSAFTService  | 
| Key Management Service（KMS） | 客户托管密钥 | aft | 
| Amazon S3 | 存储桶 | aws-aft-logs-\$1 aws-aft-s3-access-logs-\$1 | 
| AWS Support Center（可选） | Support 计划 | Enterprise | 


**AWS Control Tower 审计账户**  

| **AWS service** | **资源类型** | **资源名称** | 
| --- | --- | --- | 
| AWS Identity and Access Management | 角色 |  AWSAFTExecution AWSAFTService  | 
| AWS Support Center（可选） | Support 计划 | Enterprise | 

# 所需的角色
<a name="aft-required-roles"></a>

一般而言，角色和策略是 AWS中身份和访问管理（IAM）的一部分。有关更多信息，请参阅[《AWS IAM 用户指南》](https://docs.aws.amazon.com//IAM/latest/UserGuide/introduction.html)**。

AFT 在 AFT 管理账户和 AWS Control Tower 管理账户中创建了多个 IAM 角色和策略，以支持 AFT 管道的运维。这些角色是根据最低权限访问模型创建的，此模型将权限限制为每个角色和策略所需的最低限度的操作和资源集。为这些角色和策略分配了一`key:value`对 AWS 标签，以` managed_by:AFT`供识别。

除了这些 IAM 角色外，AFT 还创建了三个基本角色：
+ `AWSAFTAdmin` 角色
+ `AWSAFTExecution` 角色
+ `AWSAFTService` 角色

这些步骤将在以下各节详细介绍。

** AWSAFTAdmin 角色解释**

部署 AFT 时，将在 AFT 管理账户中创建 `AWSAFTAdmin` 角色。此角色支持 AFT 管道在 AWS Control Tower 和 AFT 预置账户中充当 `AWSAFTExecution` 角色，从而执行与账户预置和自定义相关的操作。

以下是附加到 `AWSAFTAdmin` 角色的内联策略（JSON 构件）：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::*:role/AWSAFTExecution",
                "arn:aws:iam::*:role/AWSAFTService"
            ]
        }
    ]
}
```

------

以下 JSON 构件显示 `AWSAFTAdmin` 角色的信任关系。占位符号 `012345678901` 被 AFT 管理账户 ID 编号所取代。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678901:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

** AWSAFTExecution 角色解释**

当您部署 AFT 时，将在 AFT 管理账户和 AWS Control Tower 管理账户中创建 `AWSAFTExecution` 角色。稍后，AFT 管道于 AFT 账户预置期间在每个 AFT 预置账户中创建 `AWSAFTExecution` 角色。

 AFT 最初使用 `AWSControlTowerExecution` 角色在指定账户中创建 `AWSAFTExecution` 角色。`AWSAFTExecution` 角色支持 AFT 管道运行在 AFT 框架的预置和预置自定义阶段执行的步骤，适用于已置备的 AFT 账户和共享账户。

**不同的角色可以帮助您限制范围**  
作为最佳实践，在资源初始部署阶段，将自定义权限与准许的权限分离开来。请记住，`AWSAFTService` 角色用于账户预置，而 `AWSAFTExecution` 角色用于账户自定义。这种分离限制了管道每个阶段准许的权限范围。如果您要自定义 AWS Control Tower 共享账户，这种区别就显得尤为重要，因为共享账户可能包含敏感信息，例如账单详细信息或用户信息。

`AWSAFTExecution`角色权限：**AdministratorAccess**— AWS 托管策略 

以下 JSON 构件显示附加到 `AWSAFTExecution` 角色的 IAM 策略（信任关系）。占位符号 `012345678901` 被 AFT 管理账户 ID 编号所取代。

`AWSAFTExecution` 的信任策略

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678901:role/AWSAFTAdmin"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

** AWSAFTService 角色解释**

`AWSAFTService` 角色在所有已注册和托管账户（包括共享账户和管理账户）中部署 AFT 资源。以前的资源只能由 `AWSAFTExecution` 角色部署。

`AWSAFTService` 角色适用于服务基础架构在预置阶段部署资源，而 `AWSAFTExecution` 角色仅用于部署自定义功能。通过以这种方式担任角色，您可以在每个阶段保持更精细的访问控制。

`AWSAFTService`角色权限：**AdministratorAccess**— AWS 托管策略 

以下 JSON 构件显示附加到 `AWSAFTService` 角色的 IAM 策略（信任关系）。占位符号 `012345678901` 被 AFT 管理账户 ID 编号所取代。

`AWSAFTService` 的信任策略

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678901:role/AWSAFTAdmin"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

# 组件服务
<a name="aft-components"></a>

部署 AFT 时，会将每项AWS服务中的组件添加到您的AWS环境中。
+ **[AWS Control Tower](https://docs.aws.amazon.com//controltower/latest/userguide/what-is-control-tower.html)** - AFT 使用 AWS Control Tower 管理账户中的 AWS Control Tower Account Factory 来预置账户。
+ **[Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html)** - AFT 会在 AFT 管理账户中创建 Amazon DynamoDB 表，用于存储账户请求、账户更新的审计历史记录、账户元数据以及 AWS Control Tower 生命周期事件。AFT 还会创建 DynamoDB Lambda 触发器来启动下游流程，例如启动 AFT 账户预置工作流。
+ **[亚马逊简单存储服务](https://docs.aws.amazon.com//AmazonS3/latest/userguide/Welcome.html)** — AFT 在 AFT 管理账户和 AWS Control Tower 日志存档账户中创建亚马逊简单存储服务 (S3) 存储桶，用于存储 AFT 管道所需的服务生成的AWS日志。AFT 还在主存储桶和辅助存储桶中创建一个 Terraform 后端 S3 存储桶AWS 区域，用于存储 AFT 管道工作流程中生成的 Terraform 状态。
+ **[Amazon Simple Notification Service](https://docs.aws.amazon.com//sns/latest/dg/welcome.html)** - AFT 会在 AFT 管理账户中创建 Amazon Simple Notification Service（SNS）主题，用于存储处理每个 AFT 账户请求后的成功和失败通知。您可以使用自己选择的协议来接收这些消息。
+ **[Amazon Simple Queuing Service](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)** - AFT 会在 AFT 管理账户中创建一个 Amazon Simple Queuing Service（Amazon SQS）FIFO 队列。该队列支持并行提交多个账户请求，但它一次只能向 AWS Control Tower Account Factory 发送一个请求以按顺序处理。
+ **[AWS CodeBuild](https://docs.aws.amazon.com//codebuild/latest/userguide/welcome.html)** — AFT 在 AFT 管理账户中创 CodeBuild 建 AWS 构建项目，以便在各个构建阶段初始化、编译、测试和应用 AFT 源代码的 Terraform 计划。
+ **[AWS CodePipeline](https://docs.aws.amazon.com//codepipeline/latest/userguide/welcome.html)** — AFT 在 AFT 管理账户中创建 AWS CodePipeline 管道，以便与您选择的、支持的 AWS CodeStar 连接提供商集成 AFT 源代码，并在 AWS 中触发构建任务 CodeBuild。
+ **[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)** - AFT 可在 AFT 管理账户中创建 AWS Lambda 函数和层，以便在账户请求、AFT 账户预置和账户自定义过程中执行步骤。
+ **[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com//systems-manager/latest/userguide/systems-manager-parameter-store.html)** - AFT 可在 AFT 管理账户中设置 AWS Systems Manager Parameter Store，用于存储 AFT 管道流程所需的配置参数。
+ **[亚马逊 CloudWatch — A](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)** FT 在 AFT 管理账户中创建亚马逊 CloudWatch 日志组，用于存储 AFT 管道使用的 AWS 服务生成的日志。 CloudWatch 日志的保留期设置为`Never Expire`。
+ **[Amazon VPC](https://docs.aws.amazon.com//vpc/latest/userguide/what-is-amazon-vpc.html)** - AFT 可创建 Amazon Virtual Private Cloud（VPC），用于将 AFT 管理账户中的服务和资源隔离到单独的网络环境中，从而增强安全性。
+ **[AWS KMS](https://docs.aws.amazon.com//kms/latest/developerguide/overview.html)** - AFT 可在 AFT 管理账户和 AWS Control Tower 日志存档账户中使用 AWS Key Management Service（KMS）。AFT 还可以创建密钥来加密 Terraform 状态、存储在 DynamoDB 表中的数据以及 SNS 主题。这些日志和构件是在 AFT 部署 AWS 资源和服务时生成的。默认情况下，AFT 创建的 KMS 密钥已启用每年轮换功能。
+ **[AWS身份和访问管理 (IAM) Man](https://docs.aws.amazon.com//IAM/latest/UserGuide/introduction.html)** agement — AFT 遵循推荐的最低权限模型。它根据需要在 AFT 管理账户、AWS Control Tower 账户和 AFT 预配置账户中创建AWS身份和访问管理 (IAM) 角色和策略，以执行 AFT 管道工作流程中所需的操作。
+ **[AWS Step Func](https://docs.aws.amazon.com//step-functions/latest/dg/welcome.html)** tions — AFT 在 AFT 管理账户中创建AWS Step Functions 状态机。这些状态机可以协调并自动执行 AFT 账户预置框架和自定义的流程和步骤。
+ **[亚马逊 EventBridge](https://docs.aws.amazon.com//eventbridge/latest/userguide/eb-what-is.html)** — AFT 在 AFT 和 AWS Control Tower 管理账户中创建亚马逊 EventBridge事件总线，用于在 AFT 管理账户的 DynamoDB 表中长期捕获和存储 AWS 控制塔生命周期事件。AFT 在 AFT 管理账户和 AWS Control Tower 管理账户中创建亚马逊 CloudWatch 事件规则，这些规则会触发 AFT 管道工作流程运行期间所需的多个步骤
+ **[AWS CloudTrail （可选）](https://docs.aws.amazon.com//awscloudtrail/latest/userguide/cloudtrail-user-guide.html)**— 启用此功能后，AFT 将在 AWS Control Tower 管理账户中创建AWS CloudTrail组织跟踪，用于记录 Amazon S3 存储桶和 Lamb AWS da 函数的数据事件。AFT 会将这些日志发送到 AWS Control Tower 日志存档账户中的中央 S3 存储桶。
+ **[AWS支持（可选）](https://aws.amazon.com//premiumsupport/)**— 启用此功能后，AFT 会为由 AFT 配置的账户开启AWS企业支持计划。默认情况下，创建AWS账户时会启用 B AWS asic Support 计划。

# AFT 账户预置管道
<a name="aft-provisioning-framework"></a>

管道的账户预置阶段完成后，AFT 框架将继续运行。它会自动执行一系列步骤，以确保在[账户自定义](aft-account-customization-options.md)阶段开始之前，新预置的账户已具备详细信息。

**以下是 AFT 管道执行的后续步骤。**

1. 验证账户请求输入。

1. 检索有关已预置账户的信息，例如账户 ID。

1. 将账户元数据存储在 AFT 管理账户的 DynamoDB 表中。

1. 在新配置的账户中创建 **AWSAFTExecution**IAM 角色。AFT 将担任此角色来执行账户自定义阶段，因为此角色授予对 Account Factory 产品组合的访问权限。

1. 应用您在账户请求输入参数中提供的账户标签。

1. 应用您在部署 AFT 时选择的 AFT 功能选项。

1. 应用您提供的 AFT 账户预置自定义设置。下一部分将详细介绍如何在 `git` 存储库中使用 AWS Step Functions 状态机设置这些自定义项。此阶段有时被称为*账户预置框架*阶段。这是核心预置流程的一部分，但是您之前已经设置了一个提供自定义集成的框架作为账户预置工作流的一部分，然后在下个阶段，系统将向账户添加其他自定义项。

1. 对于配置的每个账户，它都会 AWS CodePipeline 在 AFT 管理账户中创建一个账户，该账户将运行以执行（下一个全局）[账户自定义](aft-account-customization-options.md)阶段。

1. 为每个预置账户（和目标账户）调用账户自定义管道。

1. 向 SNS 主题发送成功或失败通知，您可以从该主题中检索消息。

## 使用状态机设置账户预置框架自定义
<a name="aft-customizations"></a>

如果您在预置账户之前设置了自定义的非 Terraform 集成，则这些自定义项将包含在您的 AFT 账户配置工作流中。例如，您可能需要进行某些自定义，以确保 AFT 创建的所有账户都符合组织的标准和策略（例如安全标准），并且在系统添加其他自定义项之前，这些标准可以添加到账户中。在接下来的全局账户自定义阶段开始之前，系统将在每个预置账户上实施这些*账户预置框架*自定义设置。

**注意**  
本部分中描述的 AFT 功能适用于理解 AWS Step Functions 功能的高级用户。作为替代方案，我们建议您在账户自定义阶段使用全局帮助程序。

AFT 账户预置框架会调用由您定义的 AWS Step Functions 状态机来实施您的自定义设置。请参阅 [AWS Step Functions 文档](https://docs.aws.amazon.com//step-functions/latest/dg/welcome.html)，详细了解可能的状态机集成。

下面是一些常用集成。
+ 采用您选择的语言的 AWS Lambda 函数
+ 使用 Docker 容器的 AWS ECS 或 AWS Fargate 任务
+ 使用自定义工作程序的 AWS Step Functions 活动，托管在 AWS 中或本地
+ Amazon SNS 或 SQS 集成

如果未定义 AWS Step Functions 状态机，则该阶段将在无操作的情况下通过。要创建 AFT 账户预置自定义状态机，请按照[创建 AFT 账户预置自定义状态机](#aft-create-customizations)中的说明进行操作。添加自定义设置之前，请确保您满足先决条件。

这些类型的集成不是 AWS Control Tower 的一部分，无法在 AFT 账户自定义的 API 之前的全局阶段添加这些集成。不过，AFT 管道允许您将这些自定义项设置为预置流程的一部分，它们将在预置工作流中运行。如以下各部分所述，在开始 AFT 账户预置阶段之前，您必须通过提前创建状态机来实施这些自定义设置。

**创建状态机的先决条件**
+ 具有经过全面部署的 AFT。有关 AFT 部署的更多信息，请参阅[部署 AWS Control Tower Account Factory for Terraform（AFT）](aft-getting-started.md)。
+ 在您的环境中为 AFT 账户预置自定义设置 `git` 存储库。请参阅[部署后步骤](aft-post-deployment.md)了解更多信息。

## 创建 AFT 账户预置自定义状态机
<a name="aft-create-customizations"></a>

**第 1 步：修改状态机定义**

修改示例 `customizations.asl.json` 状态机定义。该示例位于您在[部署后步骤](https://docs.aws.amazon.com//controltower/latest/userguide/aft-post-deployment.html)中所设置的用于存储 AFT 账户预置自定义项的 `git` 存储库中。要了解有关状态机定义的更多信息，请参阅《[AWS Step Functions 开发人员指南](https://docs.aws.amazon.com//step-functions/latest/dg/welcome.html)》。

**第 2 步：包含相应的 Terraform 配置**

将带有 `.tf` 扩展的 Terraform 文件与自定义集成的状态机定义放在同一个 `git` 存储库中。例如，如果您选择在状态机任务定义中调用 Lambda 函数，则需要将 `lambda.tf` 文件包含在同一目录中。确保包含自定义配置所需的 IAM 角色和权限。

当您提供适当的输入时，AFT 管道会自动调用您的状态机，并在 AFT 账户预置框架阶段部署您的自定义设置。

## 重新启动 AFT 账户预置框架和自定义
<a name="aft-provisioining-considerations"></a>

AFT 为通过 AFT 管道发布的每个账户执行账户预置框架和自定义步骤。要重新启动账户预置自定义，您可以使用以下两种方法之一：

1. 在账户请求存储库中对现有账户进行任何更改。

1. 使用 AFT 预置新账户。

# 账户自定义
<a name="aft-account-customization-options"></a>

AFT 可以在预置账户中部署标准或自定义配置。在 AFT 管理账户中，AFT 为每个账户提供一个管道。通过此管道，您可以在所有账户、一组账户或单个账户中实施自定义设置。您可以运行 Python 脚本、bash 脚本和 Terraform 配置，也可以在账户自定义阶段与 AWS CLI 交互。

## 概述
<a name="aft-customizations-overview"></a>

在您选择的 `git` 存储库（存储全局自定义项或账户自定义项的存储库）中指定自定义项后，AFT 管道将自动完成账户自定义阶段。要以追溯方式自定义账户，请参阅[重新调用自定义设置](#aft-re-invoke-customizations)。

**全局自定义（可选）**

您可以选择将某些自定义项应用于 AFT 预置的所有账户。例如，如果您需要创建特定的 IAM 角色，或在每个账户中部署自定义控件，则可以在 AFT 管道中的全局自定义阶段自动执行此操作。

**账户自定义（可选）**

要以不同于其他 AFT 预置账户的方式自定义单个账户或一组账户，您可以利用 AFT 管道的账户自定义部分来实施特定于账户的配置。例如，只有特定账户可能需要访问互联网网关。

## 自定义先决条件
<a name="aft-account-customization-prerequisites"></a>

在开始自定义账户之前，请确保满足以下先决条件。
+ 具有经过全面部署的 AFT。有关如何部署的信息，请参阅[配置并启动 AWS Control Tower Account Factory for Terraform](aft-getting-started.md#aft-configure-and-launch)。
+ 具有经过预先填充的 `git` 存储库，用于在您的环境中进行全局自定义和账户自定义。有关更多信息，请参阅[部署后步骤](aft-post-deployment.md)中的*第 3 步：填充每个存储库*。

## 应用全局自定义
<a name="aft-global-customizations"></a>

要应用全局自定义，必须将特定的文件夹结构推送到您选择的存储库。
+ 如果自定义配置采用 Python 程序或脚本的形式，请将配置放在存储库中的 **api\$1helpers/python** 文件夹下。
+ 如果自定义配置采用 Bash 脚本的形式，请将配置放在存储库中的 **api\$1helpers** 文件夹下。
+ 如果自定义配置采用 Terraform 形式，请将配置放在存储库中的 **terraform** 文件夹下。
+ 有关创建自定义配置的更多详细信息，请参考全局自定义 README 文件。

**注意**  
在 AFT 管道中，系统将在 AFT 账户预置框架阶段后自动应用全局自定义。

## 应用账户自定义
<a name="aft-account-customizations"></a>

****

 您可以将特定的文件夹结构推送到您选择的存储库，以应用账户自定义。在 AFT 管道中，系统将在全局自定义阶段后自动应用账户自定义。您还可以在账户自定义存储库中创建包含不同账户自定义项的多个文件夹。对于您需要的每个账户自定义设置，请按照以下步骤操作。

**应用账户自定义**

1.  **第 1 步：为账户自定义创建文件夹** 

    在您选择的存储库中，将 AFT 提供的 `ACCOUNT_TEMPLATE` 文件夹复制到新文件夹中。新文件夹的名称应与您在账户请求中提供的 `account_customizations_name` 一致。

1.  ** 将配置添加到您的特定账户自定义文件夹** 

    您可以根据配置的格式将配置添加到您的账户自定义文件夹。
   +  如果您的自定义配置采用 Python 程序或脚本的形式，请将其放在存储库中的 ***[account\$1customizations\$1name]*/api\$1helpers/python 文件夹**下。
   +  如果您的自定义配置采用 Bash 脚本的形式，请将其放在存储库中的 ***[account\$1customizations\$1name]*/api\$1helpers** 文件夹下。
   +  如果您的自定义配置采用 Terraform 的形式，请将其放在存储库中的 ***[account\$1customizations\$1name]*/terraform** 文件夹下。

    有关创建自定义配置的更多信息，请参考账户自定义 README 文件。

1.  ** 参考账户请求文件中的特定 `account_customizations_name` 参数** 

    AFT 账户请求文件包含输入参数 `account_customizations_name`。请输入您的账户自定义名称作为该参数的值。

**注意**  
 您可以为环境中的账户提交多个账户请求。如果您想应用不同或类似的账户自定义设置，请在账户请求中使用 `account_customizations_name` 输入参数指定账户自定义项。有关更多信息，请参阅 [Submit multiple account requests](https://docs.aws.amazon.com/controltower/latest/userguide/aft-multiple-account-requests.html)。

## 重新调用自定义设置
<a name="aft-re-invoke-customizations"></a>

AFT 提供在 AFT 管道中重新调用自定义设置的方法。当您添加了新的自定义步骤或对现有自定义项进行更改时，此方法非常有用。当您重新调用时，AFT 会启动自定义管道，对 AFT 预置账户进行更改。 event-source-based重新调用允许您对个人账户、所有账户、根据其 OU 对账户或根据标签选择的账户应用自定义设置。

请按照以下三个步骤为 AFT 预置账户重新调用自定义设置。

**第 1 步：将更改推送到全局或账户自定义 `git` 存储库**

您可以根据需要更新您的全局和账户自定义设置，并将更改推送回 `git` 存储库。此时什么都不会发生，必须按照接下来的两个步骤操作，由事件源调用自定义管道。

**第 2 步：启动 AWS Step Function 运行以重新调用自定义设置**

AFT 提供在 AFT 管理账户中称为 `aft-invoke-customizations` 的 AWS Step Function。该函数的目的是为 AFT 预置账户重新调用自定义管道。

下面是您可以创建的（JSON 格式）事件架构的示例，用于将输入传递到 `aft-invoke-customizations` AWS Step Function。

```
{
  "include": [
    {
      "type": "all"
    },
    {
      "type": "ous",
      "target_value": [ "ou1","ou2"]
    },
    {
      "type": "tags",
      "target_value": [ {"key1": "value1"}, {"key2": "value2"}]
    },
    {
      "type": "accounts",
      "target_value": [ "acc1_ID","acc2_ID"]
    }
  ],

  "exclude": [
    {
      "type": "ous",
      "target_value": [ "ou1","ou2"]
    },
    {
      "type": "tags",
      "target_value": [ {"key1": "value1"}, {"key2": "value2"}]
    },
    {
      "type": "accounts",
      "target_value": [ "acc1_ID","acc2_ID"]
    }
  ]
}
```

 示例事件架构显示，您可以选择要在重新调用流程中包含或排除的账户。您可以按组织单位（OU）、账户标签和账户 ID 进行筛选。如果您未应用任何筛选条件并包含 `"type":"all"` 语句，则系统会为所有 AFT 预置账户重新调用自定义设置。

**注意**  
 如果您的 AWS Control Tower Account Factory for Terraform (AFT) 版本为 1.6.5 或更高版本，则可以使用语法嵌套定 OUs 位）。`OU Name (ou-id-1234`有关更多信息，请参阅以下主题[GitHub](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/issues/280)。

 您填写事件参数后，将运行 Step Functions 并调用相应的自定义设置。AFT 一次最多可以调用 5 个自定义设置。Step Functions 会等待并循环运行，直到所有符合事件标准的账户都完成自定义设置。

**步骤 3：监控 AWS 步骤函数输出并观察 AWS 的 CodePipeline 运行情况**
+ 生成的 Step Function 输出包含与 Step Function 输入事件源匹配的帐户 IDs 。
+ 在 “**开发者工具**” CodePipeline 下导航到 AWS，查看账户 ID 的相应自定义渠道。

## 使用 AFT 账户自定义请求跟踪进行故障排除
<a name="aft-customization-request"></a>

 基于包含目标账户和自定义请求 IDs的 AWS Lambda 发射日志的账户自定义工作流程。AFT 允许您使用 Amazon CloudWatch Logs 跟踪自定义请求并对其进行故障排除，方法是向您提供 L CloudWatch ogs Insights 查询，您可以使用这些查询按目标账户或自定义请求 ID 筛选与您的自定义请求相关的 CloudWatch 日志。有关更多信息，请参阅《亚马逊[日志*用户指南》中的使用 Amaz CloudWatch on Logs 分析 CloudWatch 日志*数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

**使用 AFT 的 CloudWatch 日志见解**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1.  在导航窗格中，选择**日志**，然后选择**日志洞察**。

1.  选择**查询**。

1.  在**示例查询**下，选择 **Account Factory for Terraform**，然后选择以下查询之一：
   +  **按账户 ID 筛选自定义日志** 
**注意**  
 请务必*"YOUR-ACCOUNT-ID"*使用您的目标账户 ID 进行替换。

     ```
     fields @timestamp, log_message.account_id as target_account_id, log_message.customization_request_id as customization_request_id, log_message.detail as detail, @logStream
     | sort @timestamp desc
     | filter log_message.account_id == "YOUR-ACCOUNT-ID" and @message like /customization_request_id/
     ```
   +  **按自定义请求 ID 筛选自定义日志** 
**注意**  
 请务必*"YOUR-CUSTOMIZATION-REQUEST-ID"*使用您的自定义请求编号进行替换。您可以在 AFT 账户配置框架 AWS Step Functions 状态机的输出中找到您的自定义请求 ID。有关 AFT 账户预置框架的更多信息，请参阅 [AFT 账户预置管道](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provisioning-framework.html) 

     ```
     fields @timestamp, log_message.account_id as target_account_id, log_message.customization_request_id as customization_request_id, log_message.detail as detail, @logStream
     | sort @timestamp desc
     | filter log_message.customization_request_id == "YOUR-CUSTOMIZATION-REQUEST-ID"
     ```

1.  选择查询后，请确保选择时间间隔，然后选择**运行查询**。

# AFT 中源代码版本控制的替代方案
<a name="aft-alternative-vcs"></a>

AFT AWS CodeCommit 用于源代码版本控制系统 (VCS)，它允许其他[CodeConnections](https://docs.aws.amazon.com//dtconsole/latest/userguide/supported-versions-connections.html)满足您的业务需求或现有架构的系统。

如果您是首次部署 AFT，并且没有现有的 CodeCommit存储库，则必须指定外部 VCS 提供商，这是 AFT 部署先决条件的一部分。

**AFT 支持以下源代码控制替代方案：**
+ GitHub
+ GitHub 企业服务器
+ BitBucket
+ GitLab
+ GitLab 自我管理

**注意**  
如果您指定 AWS CodeCommit 为 VCS，则无需执行任何其他步骤。AFT 会使用默认名称在您的环境中创建必要的 `git` 存储库。但是，您可以根据需要覆盖默认存储库名称，以符合您的组织标准。 CodeCommit

## 使用 AFT 设置替代源代码版本控制系统（自定义 VCS）
<a name="aft-alternate-vcs-steps"></a>

要为 AFT 部署设置替代源代码版本控制系统，请按照以下步骤操作。

**步骤 1：在支持的第三方版本控制系统（VCS）中创建 `git` 存储库。**

如果您不使用 AWS CodeCommit，则必须在 AFT 支持的第三方 VCS 提供商环境中为以下项目创建`git`存储库。
+ **AFT 账户申请。**[提供示例代码](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-request)。有关 AFT 账户请求的更多信息，请参阅 [使用 AFT 预置新账户](aft-provision-account.md)。
+ **AFT 账户预置自定义。**[提供示例代码](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-provisioning-customizations)。有关 AFT 账户预置自定义的更多信息，请参阅 [创建 AFT 账户预置自定义状态机](aft-provisioning-framework.md#aft-create-customizations)。
+ **AFT 全局自定义。**[提供示例代码](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-global-customizations)。有关 AFT 全局自定义的更多信息，请参阅 [账户自定义](aft-account-customization-options.md)。
+ **AFT 账户自定义。**[提供示例代码](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-customizations)。有关 AFT 账户自定义的更多信息，请参阅 [账户自定义](aft-account-customization-options.md)。

**步骤 2：指定 AFT 部署所需的 VCS 配置参数**

作为 AFT 部署的一部分，需要使用以下输入参数来配置 VCS 提供商。
+ **vcs\$1provid** er：如果您未使用 AWS CodeCommit，请根据您的用例将 VCS 提供程序指定为`"bitbucket"``"github"``"githubenterprise"``"gitlab"`、、或。
+ **github\$1enterprise\$1url：仅适用于 GitHub 企业客户，请指定 URL**。 GitHub 
+ **账户\$1request\$1repo\$1name**：对于 AWS CodeCommit 用户，此值设置为。`aft-account-request`在 AFT 支持的第三方 VCS 提供商环境中，使用您的实际存储库名称更新此输入值。对于 Github BitBucket GitLab、 GitHub Enterprise GitLab 和 Self-Managed，存储库名称的格式`[Org]/[Repo]`必须为。
+ **account\$1customizations\$1repo\$1name**：对于 AWS CodeCommit 用户，此值设置为。`aft-account-customizations`在 AFT 支持的第三方 VCS 提供商环境中，使用您的存储库名称更新此输入值。对于 Github BitBucket GitLab、 GitHub Enterprise GitLab 和 Self-Managed，存储库名称的格式`[Org]/[Repo]`必须为。
+ **account\$1provisioning\$1customizations\$1repo\$1name**：对于 AWS CodeCommit 用户，此值设置为 `aft-account-provisioning-customizations`。在 AFT 支持的第三方 VCS 提供商环境中，使用您的存储库名称更新此输入值。对于 Github BitBucket GitLab、 GitHub Enterprise GitLab 和 Self-Managed，存储库名称的格式`[Org]/[Repo]`必须为。
+ **global\$1customizations\$1repo\$1name**：对于 AWS CodeCommit 用户，此值设置为。`aft-global-customizations`在 AFT 支持的第三方 VCS 提供商环境中，使用您的存储库名称更新此输入值。对于 Github BitBucket GitLab、 GitHub Enterprise GitLab 和 Self-Managed，存储库名称的格式`[Org]/[Repo]`必须为。
+ **account\$1request\$1repo\$1branch**：默认情况下，该分支为 `main`，但该值可以被覆盖。

默认情况下，AFT 来自每个 `git` 存储库的 `main` 分支。您可以使用其他输入参数覆盖该分支名称值。有关输入参数的更多信息，请参阅 [AFT Terraform module](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/blob/main/README.md#inputs) 中的自述文件。

**对于现有 AWS CodeCommit 客户**  
 如果您使用新名称为 AFT 创建 CodeCommit 存储库，则可以通过更新这些输入参数的值来更新存储库名称。

**步骤 3：完成第三方 VCS 提供商的 AWS CodeCommit 连接**

部署运行时，AFT 要么创建所需的 AWS CodeCommit 存储库，要么为您选择的第三方 VCS 提供商创建 AWS CodeCommit 连接。如果是后者，则必须手动登录 AFT 管理账户的控制台才能完成待处理的 CodeCommit 连接。有关完成 CodeCommit 连接的更多说明，请参阅[AWS CodeCommit 文档](https://docs.aws.amazon.com//dtconsole/latest/userguide/connections-update.html)。

# 将 AFT 从另一个 VCS 提供商移AWS CodeCommit 至其他 V
<a name="move-a-vcs"></a>

本节概述了如何将适用于 Terraform 的 AWS Control Tower Account Factory (AFT) 从AWS CodeCommit 版本控制系统 (VCS) 转移到另一个 VCS 提供商。

**步骤 1：**在您选择的 VCS 中设置新存储库。

**步骤 2：**将这些存储库作为新的远程存储库添加到 `git` 中。

**第 3 步：**向新 VCS 提供程序执行 `git push`。

**注意**  
您创建的存储库结构应与中的相同AWS CodeCommit。更改结构会阻碍 AFT 执行所需代码的能力。  
aft-account-request
 aft-account-customizations
 aft-global-customizations
aft-account-provisioning-customizations

**步骤 4：**在您的 AWS Control Tower 管理账户中，更新 Terraform 模块（引导）以指向您的 VCS 提供程序，如以下示例所示：

**示例：GitLab **[使用 Terraform OSS](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/blob/main/examples/gitlab%2Btf_oss/main.tf)

- 执行 `terraform plan`，以预览更改，然后执行 `terraform apply`。

**第 5 步。**完成以下步骤以完成设置 CodeConnection （以前称为 CodeStar）：

1. 登录 AFT 管理账户

1. 找到并完成新 VCS 提供商的待处理状态AWS CodeConnections ，如[更新待处理的连接](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-update.html)中所述，或者在AWS控制台中 [`https://us-east-1.console.aws.amazon.com/codesuite/settings/connections`]。

1. 参考：[部署后步骤](https://docs.aws.amazon.com//controltower/latest/userguide/aft-post-deployment.html)

**注意**  
在调用 `aft-invoke-customizations` *Step Functions* 之前，账户管道会保留之前的源。此调用可以作为升级的一部分完成，也可以作为下一次自定义调用的一部分来完成。

如需了解更多信息，请参阅此博客：[如何将AWS CodeCommit 仓库迁移到其他 Git 提供商](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider)。

# 数据保护
<a name="aft-data-protection"></a>

[AWS责任共担模式](https://aws.amazon.com//compliance/shared-responsibility-model/)应用于 AFT 中的数据保护。出于数据保护目的，我们建议您遵循安全性方面的以下最佳实践。
+ 遵守 AWS Control Tower 提供的数据保护指南。有关更多信息，请参阅 [AWS Control Tower 中的数据保护](controltower-console-encryption.md)。
+ 保留 AFT 部署时生成的 Terraform 状态配置。有关更多信息，请参阅 [部署 AWS Control Tower Account Factory for Terraform（AFT）](aft-getting-started.md)。
+ 按照组织的安全策略的指示，定期轮换敏感凭证。机密信息的示例包括有 Terraform 令牌、`git` 令牌等。

 **静态加密** 

AFT 创建使用密钥管理服务密钥进行静态加密的 Amazon S3 存储桶、亚马逊 SNS 主题、亚马逊 SQS 队列和亚马逊 DynamoDB 数据库。AWS默认情况下，AFT 创建的 KMS 密钥已启用每年轮换功能。如果你选择 Terraform 的 Terraform Cloud 或 Terraform Enterprise 发行版，AFT 会包含一个 Systems Manager SecureString 参数来存储AWS敏感的 Terraform 令牌值。

AFT 使用中[组件服务](aft-components.md)描述的默认静态加密的AWS服务。有关详细信息，请参阅 AFT 每个组件AWS服务的AWS文档，并了解每项服务所遵循的数据保护实践。

 **传输中加密** 

默认情况下，AFT 依赖于[组件服务](aft-components.md)中描述的在传输中使用加密的AWS服务。有关详细信息，请参阅 AFT 每个组件AWS服务的AWS文档，并了解每项服务所遵循的数据保护实践。

 对于 Terraform Cloud 或 Terraform Enterprise 发行版，AFT 会调用 HTTPS 端点 API 来访问您的 Terraform 组织。如果您选择AWS CodeStar 连接支持的第三方 VCS 提供商，AFT 会调用 HTTPS 端点 API 来访问您的 VCS 提供商组织。

# 从 AFT 中删除账户
<a name="aft-remove-account"></a>

 本主题介绍如何从 AFT 中删除账户，以便 AFT 管道停止部署和更新该账户。

**重要**  
 从 AFT 管道中删除账户的操作是不可逆的，并且可能导致状态丢失。

 当您想要关闭已停用应用程序的账户、隔离被盗的账户或将账户从一个组织转移到另一个组织时，您可以从 AFT 中删除账户。

**注意**  
 从 AFT 中删除账户不同于删除 AWS Control Tower 账户或 AWS 账户。当您从 AFT 中删除账户时，AWS Control Tower 仍会管理该账户。要删除 AWS Control Tower 账户或 AWS 账户，请参阅以下内容：  
 《AWS Control Tower 用户指南》**中的 [Unmanage an account](https://docs.aws.amazon.com/controltower/latest/userguide/unmanage-account.html)。
 《AWS Billing 用户指南》**中的 [Closing an account](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/close-account.html)。

**从 AFT 管道中删除账户**

 以下过程介绍了如何从 AFT 管道中删除账户。

1.  **从存储账户请求的 `git` 存储库中删除账户** 

    在存储账户请求的 `git` 存储库中，删除要从 AFT 中删除的账户的账户请求。

    当您从账户请求存储库中删除账户请求时，AFT 会删除自定义管道和账户元数据。有关更多信息，请参阅上的 AFT [1.8.0 版本说明](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/releases/tag/1.8.0)。 GitHub

1.  **删除 Terraform 工作区（仅适用于 Terraform 云和 Terraform 企业版客户）** 

    删除要从 AFT 删除的账户的全局自定义和账户自定义工作区。

1.  **从亚马逊 S3 后端删除 Terraform 状态** 

    在 AFT 管理账户中，删除要从 AFT 中删除的账户的 Amazon S3 存储桶内的所有相关文件夹。
**提示**  
 在以下示例中，将 `012345678901` 替换为 AFT 管理账户 ID 编号。

**示例：Terraform OSS**  
 当您选择 Terraform OSS 时，您会在 `aft-backend-012345678901-primary-region` 和 `aft-backend-012345678901-secondary-region` Amazon S3 存储桶中找到每个账户的 3 个文件夹。这些文件夹与账户自定义状态**、自定义管道状态**和全局自定义状态**相关 

**示例：Terraform 云或 Terraform 企业版**  
 当您选择 Terraform 云或 Terraform 企业版时，您会在 `aft-backend-012345678901-primary-region` 和 `aft-backend-012345678901-secondary-region` Amazon S3 存储桶中找到每个账户的文件夹。这些文件夹与自定义管道状态**相关。

# 运行指标
<a name="aft-operational-metrics"></a>

默认情况下，*Account Factory for Terraform（AFT）* 会向 AWS 发送匿名的运营指标。我们使用这些数据来了解客户如何使用 AFT，从而改善解决方案的质量和功能。在 AFT 部署期间，您可以通过更改参数来选择不参与数据收集。启用收集后，以下数据将发送至 AWS：
+ **解决方案：**特定于 AFT 的标识符
+ **版本：**AFT 的版本
+ **通用唯一标识符（UUID）：**为每个 AFT 部署随机生成的唯一标识符
+ **时间戳：**数据收集时间戳
+ **数据：**客户采取的 AFT 配置和操作

AWS 拥有所收集的数据。数据收集受 [AWS 隐私政策](https://aws.amazon.com/privacy/)的约束。

**注意**  
1.6.0 之前的 AFT 版本不会向 AWS 报告使用情况指标。

要选择不使用报告指标，请执行以下操作：
+ 如下方示例所示，在 Terraform 输入配置文件中将 `aft_metrics_reporting` 的输入值设置为 `false`，然后重新部署 AFT。如果您未明确设置该值，则该值在默认情况下将设置为 `true`。

如果您复制示例，请记得用您的实际 ID 和区域值代替示例项目中用 `x` 表示的字符串。

```
    module "control_tower_account_factory" {
    source = "aws-ia/control_tower_account_factory/aws"
    
    # Required Vars
    ct_management_account_id    = "xxxxxxxxxxx"
    log_archive_account_id      = "xxxxxxxxxxx"
    audit_account_id            = "xxxxxxxxxxx"
    aft_management_account_id   = "xxxxxxxxxxx"
    ct_home_region              = "xx-xxxx-x"
    tf_backend_secondary_region = "xx-xxxx-x"
    
    # Optional Vars
    aft_metrics_reporting = false    # to opt out, set this value to false 
    }
```

# Account Factory for Terraform（AFT）故障排除指南
<a name="account-troubleshooting-guide"></a>

 本节可以帮助您排查在使用 Account Factory for Terraform（AFT）时可能会遇到的常见问题。

**Topics**
+ [一般性问题](#w2aac44c33c45b7)
+ [与账户预置/注册相关的问题](#w2aac44c33c45b9)
+ [与调用自定义相关的问题](#w2aac44c33c45c11)
+ [与账户自定义工作流相关的问题](#w2aac44c33c45c13)

## 一般性问题
<a name="w2aac44c33c45b7"></a>
+  **已超过 AWS 资源配额** 

   如果您的日志组显示您已超出 AWS 资源配额，请联系 Supp [AWS ort](https://aws.amazon.com/premiumsupport/)。Account Factory 使用的资源 AWS 服务 配额包括 AWS CodeBuild AWS Organizations、和 AWS Systems Manager。有关更多信息，请参阅下列内容：
  +  《CodeBuild 用户指南》** 中的[什么是 AWS CodeBuild？](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 
  +  [什么是 AWS Organizations？](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 在 Organi *zations 用户指南*中。
  +  [什么是 AWS Systems Manager？](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 在 S *ystems Manager 用户指南*中。
+  **Account Factory 版本过时** 

   如果您遇到问题并认为这是一个错误，请确保您使用的是最新版本的 Account Factory。有关更多信息，请参阅 [Updating the Account Factory version](https://docs.aws.amazon.com/controltower/latest/userguide/update-aft-version.html)。
+  **对 Account Factory 源代码进行了本地更改** 

   Account Factory 是一个开源项目。AWS Control Tower 支持 Account Factory 核心代码。如果您在本地对 Account Factory 核心代码进行更改，AWS Control Tower 只能尽力为您的 Account Factory 部署提供支持。
+ **Account Factory 角色权限不足** 

   Account Factory 会创建 IAM 角色和策略来管理所提供账户的部署和自定义。如果您更改这些角色或策略，Account Factory 管道可能无法执行某些操作。有关更多信息，请参阅 [Required roles](https://docs.aws.amazon.com/controltower/latest/userguide/aft-required-roles.html)。
+  **账户存储库未正确填充** 

   在预置账户之前，请务必按照[部署后步骤](https://docs.aws.amazon.com/controltower/latest/userguide/aft-post-deployment.html)进行操作。
+  **手动更改 OU 后未检测到偏移** 
**注意**  
 AWS Control Tower 会自动检测偏移。有关解决偏移的信息，请参阅 [Detect and resolve drift in AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/drift.html#resolving-drift)。

   手动更改组织单元（OU）时，不会检测到偏移。这是由于 Account Factory 的事件驱动性质所致。提交账户请求时，Terraform 管理的资源是 Amazon DynamoDB 项目，而不是直接账户。更改项目后，请求将排入队列，AWS Control Tower 则会通过 Service Catalog（管理账户详细信息的服务）来处理这些请求。如果您手动更改 OU，则不会检测到偏移，因为账户请求未更改。

## 与账户预置/注册相关的问题
<a name="w2aac44c33c45b9"></a>
+  **账户请求（电子邮件地址/名称）已存在** 

   该问题通常会导致 Service Catalog 产品在预置过程中出现故障，或者出现 `ConditionalCheckFailedException`。

   您可以通过执行下列操作之一，找到有关此问题的更多信息：
  +  查看你的 Terraform 或 Lo CloudWatch gs 日志组。
  +  查看发送到 Amazon SNS 主题 `aft-failure-notifications` 的故障。
+  **账户请求格式不正确** 

   确保您的账户请求符合预期架构。有关示例，请参阅上的 [terraform-aws-control\$1tower\$1account\$1factory](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos/aft-account-request/examples)。 GitHub
+  **超过 AWS Organizations** 

   确保您的账户请求不超过 AWS Organizations 资源配额。有关更多信息，请参阅 Organizati [ons 的 AWS 配额](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html)。

## 与调用自定义相关的问题
<a name="w2aac44c33c45c11"></a>
+  **目标账户未加入 Account Factory** 

   确保自定义请求中包含的所有账户都已加入 Account Factory。有关更多信息，请参阅 [Update an existing account](https://docs.aws.amazon.com/controltower/latest/userguide/aft-update-account.html)。
+  **自定义请求的目标账户存在于 DynamoDB 表 `aft-request-metadata` 中，但不在账户请求存储库中** 

   通过执行下列操作之一，将您的自定义调用请求格式化以排除违规账户：
  +  在 DynamoDB 表 `aft-request-metadata` 中，删除引用已不在账户请求存储库中的账户的条目。
  +  不要使用“全部”作为目标。
  +  不要以账户所属的 OU 为目标。
  +  不要直接以账户为目标。
+  **针对 Terraform Cloud 使用了错误的令牌** 

   确保您设置了正确的令牌。Terraform Cloud 仅支持基于团队的令牌，而不支持基于组织的令牌。
+  **在账户自定义管道创建之前，账户创建失败；因此无法对账户进行自定义。**

   在账户请求存储库中更改账户规范。当您进行更改（例如更改账户的标签值）时，即使管道不存在，Account Factory 也会遵循尝试创建管道的路径。

## 与账户自定义工作流相关的问题
<a name="w2aac44c33c45c13"></a>

 如果您遇到与账户自定义工作流相关的问题，请确保您的 AFT 为 1.8.0 或更高版本，并从 DynamoDB 请求表中删除所有与账户相关的元数据实例。

 有关 AFT 1.8.0 版本的信息，请参阅上的 [1.8.0 版本](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/releases/tag/1.8.0)。 GitHub

 有关如何检查和更新 AFT 版本的信息，请参阅以下内容：
+  [检查 AFT 版本](https://docs.aws.amazon.com/controltower/latest/userguide/check-aft-version.html) 
+  [更新 AFT 版本](https://docs.aws.amazon.com/controltower/latest/userguide/update-aft-version.html) 

 您还可以使用 Amazon L CloudWatch ogs Insights 查询筛选包含目标账户和自定义请求的日志，从而跟踪自定义请求并对其进行故障排除 IDs。有关更多信息，请参阅 [Troubleshooting with AFT account customization request tracing](https://docs.aws.amazon.com/controltower/latest/userguide/aft-account-customization-options.html)。