

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

# 账户自定义
<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.  选择查询后，请确保选择时间间隔，然后选择**运行查询**。