

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

# 使用 Account Factory Customization（AFC）功能自定义账户
<a name="af-customization-page"></a>

**注意**  
单一账户配置、更新和自定义必须针对 AWSControlTowerBaseline 已启用的组织单位 (OU)。如果 OU 未 AWSControlTowerBaseline 启用，您可以激活账户自动注册，或使用 ResetEnabledBaseline 该 OU EnabledControls 上 ResetEnabledControl EnabledBaselines 的 API 来注册账户。有关详细信息 AWSControlTowerBaseline，请参阅：[适用于 OU 级别的基准类型](types-of-baselines.md#ou-baseline-types)。

当您从 AWS 控制塔控制台预置资源 AWS 账户 时，AWS 控制塔允许您自定义新资源和现有资源。在您设置 Account Factory Customization 后，AWS Control Tower 会在将来进行预置时自动执行此流程，因此您无需维护任何管线。资源预置完成后，自定义账户就立即可供使用。

**为新账户预置蓝图**

您的自定义账户在 AWS 控制塔账户工厂中通过 CloudFormation 模板或 Terraform 进行配置。您需要定义一个用作自定义账户*蓝图*的模板。您的蓝图描述了配置账户时所需的特定资源和配置。 Pre-defined 还提供由 AWS 合作伙伴构建和管理的蓝图。有关合作伙伴管理的蓝图的更多信息，请参阅 [AWS Service Catalog 入门库](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/getting-started-library.html)。

**将蓝图应用于现有账户**

您也可以按照 AWS Control Tower 控制台中的**更新账户**步骤操作，将自定义蓝图应用于现有账户。有关更多信息，请参阅 [在控制台中更新账户](updating-account-factory-accounts.md#update-account-in-console)。

**定义：您的中心账户**

您的账户蓝图存储在中 AWS 账户，就我们而言，该账户被称为*中心账户*。蓝图以 Service Catalog 产品的形式存储。我们称此产品为蓝图，以将它与任何其他 Service Catalog 产品区分开来。要详细了解如何创建 Service Catalog 产品，请参阅《AWS Service Catalog 管理员指南》**中的[创建产品](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/productmgmt-cloudresource.html)。

**注意**  
AWS Control Tower 包含*主动控制功能*，用于监控 AWS Control Tower 中的 CloudFormation 资源。或者，您也可以在登录区中激活这些控制功能。当您应用主动控制功能时，它们会进行检查以确保您要部署到账户的资源符合您组织的政策和程序。有关主动控制功能的更多信息，请参阅[主动控制功能](https://docs.aws.amazon.com/controltower/latest/userguide/proactive-controls.html)。

有关使用 AFC 的更多信息，请参阅 [Automate account customization using Account Factory Customization in AWS Control Tower](https://aws.amazon.com/blogs/mt/automate-account-customization-using-account-factory-customization-in-aws-control-tower/)。

**先决条件**  
在开始使用 AWS Control Tower Account Factory 创建自定义账户之前，您必须部署一个 AWS Control Tower 登录区环境，并且必须使用 AWS Control Tower 注册一个组织单元（OU），新创建的账户将存放在该单位中。

**自定义准备工作**
+ *指定中心账户：*您可以创建一个新账户作为中心账户，也可以使用现有账户 AWS 账户。强烈建议您不要使用 AWS Control Tower 管理账户作为蓝图中心账户。
+ *添加必要的角色：*如果您计划注册 AWS 账户 AWS Control Tower 并对其进行自定义，则必须先将该`AWSControlTowerExecution`角色添加到这些账户，就像您注册到 AWS Control Tower 的任何其他账户一样。
+ *配置合作伙伴蓝图（可选）：*如果您计划使用具有市场订阅要求的合作伙伴蓝图，则必须先从 AWS Control Tower 管理账户配置这些蓝图，然后再将合作伙伴蓝图部署为 Account Factory 自定义蓝图。

**Topics**
+ [设置以进行自定义](afc-setup-steps.md)
+ [从蓝图创建自定义账户](create-afc-customized-account.md)
+ [在注册时使用 AFC 自定义账户](enroll-and-customize.md)
+ [向 AWS Control Tower 账户添加蓝图](add-blueprint-to-account.md)
+ [更新蓝图](update-a-blueprint.md)
+ [从账户中删除蓝图](remove-a-blueprint.md)
+ [合作伙伴蓝图](partner-blueprints.md)
+ [Account Factory Customization（AFC）的注意事项](#af-limitations)
+ [如果出现蓝图错误](#af-error)
+ [根据以下内容自定义 AFC 蓝图的政策文档 CloudFormation](#custom-policy-document)
+ [创建 Terraform-based 服务目录产品所需的额外权限](#custom-policy-document-tf)
+ [过渡到 AWS Service Catalog 外部产品类型](#service-catalog-external-product-type)

**注意**  
每个 AWS Control Tower 账户可以部署一个蓝图。

## Account Factory Customization（AFC）的注意事项
<a name="af-limitations"></a>
+ AFC 仅支持使用单一 AWS Service Catalog 蓝图产品进行自定义。
+  AWS Service Catalog 蓝图产品必须在中心账户中创建，并且必须在与 AWS 控制塔着陆区主区域相同的区域中创建。
+ 必须使用正确的名称、权限和信任策略创建 `AWSControlTowerBlueprintAccess` IAM 角色。
+ AWS Control Tower 支持两种蓝图部署选项：仅部署到主区域，或者部署到受 AWS Control Tower 监管的所有区域。不可以选择具体区域。
+ 当您更新成员账户中的蓝图时，无法更改蓝图中心账户 ID 和 AWS Service Catalog 蓝图产品。
+ AWS Control Tower 不支持在单个蓝图更新操作中删除现有蓝图并添加新蓝图。您可以先删除蓝图，然后通过单独的操作添加新蓝图。
+ AWS Control Tower 会根据您是在创建或注册自定义账户还是非自定义账户来改变行为。如果您不是在使用蓝图创建或注册自定义账户，AWS Control Tower 会在 AWS Control Tower 管理账户中创建 Account Factory 预置产品（通过 Service Catalog）。如果您在使用蓝图创建或注册账户时指定了自定义，则 AWS Control Tower 不会在 AWS Control Tower 管理账户中创建 Account Factory 预置产品。

## 如果出现蓝图错误
<a name="af-error"></a>

**应用蓝图时出现错误**

如果在将蓝图应用于账户（无论是新账户还是注册到 AWS Control Tower 的现有账户）的过程中出现错误，则恢复过程相同。该账户将存在，但它不是自定义的，也没有注册到 AWS Control Tower 中。要继续操作，请按照步骤将账户注册到 AWS Control Tower，并在注册时添加蓝图。

**创建 `AWSControlTowerBlueprintAccess` 角色时出现错误，以及解决办法**

当您通过 AWS Control Tower 账户创建 `AWSControlTowerBlueprintAccess` 角色时，必须使用 `AWSControlTowerExecution` 角色以主体身份登录。如果您以任何其他身份登录，则 `CreateRole` 操作会被 SCP 阻止，如以下构件所示：

```
{
            "Condition": {
                "ArnNotLike": {
                    "aws:PrincipalArn": [
                        "arn:aws:iam::*:role/AWSControlTowerExecution",
                        "arn:aws:iam::*:role/stacksets-exec-*"
                    ]
                }
            },
            "Action": [
                "iam:AttachRolePolicy",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:DeleteRolePermissionsBoundary",
                "iam:DeleteRolePolicy",
                "iam:DetachRolePolicy",
                "iam:PutRolePermissionsBoundary",
                "iam:PutRolePolicy",
                "iam:UpdateAssumeRolePolicy",
                "iam:UpdateRole",
                "iam:UpdateRoleDescription"
            ],
            "Resource": [
                "arn:aws:iam::*:role/aws-controltower-*",
                "arn:aws:iam::*:role/*AWSControlTower*",
                "arn:aws:iam::*:role/stacksets-exec-*"
            ],
            "Effect": "Deny",
            "Sid": "GRIAMROLEPOLICY"
        }
```

可采用以下解决办法：
+ （最推荐）担任 `AWSControlTowerExecution` 角色并创建 `AWSControlTowerBlueprintAccess` 角色。如果您选择此解决办法，请务必在操作完成后立即注销 `AWSControlTowerExecution` 角色，以防止对资源进行意外更改。
+ 登录一个未在 AWS Control Tower 中注册的账户，因此不受此 SCP 约束。
+ 临时编辑此 SCP 以允许该操作。
+ （强烈不推荐）使用您的 AWS Control Tower 管理账户作为中心账户，这样它就不受 SCP 约束。

## 根据以下内容自定义 AFC 蓝图的政策文档 CloudFormation
<a name="custom-policy-document"></a>

当您通过账户工厂启用蓝图时，AWS 控制塔会指示 CloudFormation 您 StackSet 代表创建蓝图。 CloudFormation 需要访问您的托管账户才能在中创建 CloudFormation 堆栈。 StackSet尽管 CloudFormation 已通过该`AWSControlTowerExecution`角色在托管账户中拥有管理员权限，但此角色不能由 CloudFormation担任。

作为启用蓝图的一部分，AWS Control Tower 在成员账户中创建一个角色，该角色 CloudFormation 可以假定该角色完成 StackSet 管理任务。通过 Account Factory 启用自定义蓝图的最简单方法是使用 *allow-all* 策略，因为这些策略与任何蓝图模板兼容。

但是，最佳实践建议你必须限制目标账户 CloudFormation 的权限。您可以提供自定义策略，AWS Control Tower 将其应用于其创建的角色 CloudFormation 以供使用。例如，如果蓝图创建了一个名为 *something-important* 的 SSM 参数，则您可以提供以下策略：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFormationActionsOnStacks",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": "arn:aws:cloudformation:*:*:stack/*"
        },
        {
            "Sid": "AllowSsmParameterActions",
            "Effect": "Allow",
            "Action": [
                "ssm:PutParameter",
                 "ssm:DeleteParameter",
                 "ssm:GetParameter",
                 "ssm:GetParameters"
            ],
            "Resource": "arn:*:ssm:*:*:parameter/something-important"
        }
    ]
}
```

------

该`AllowCloudFormationActionsOnStacks`声明是所有 AFC 自定义策略所必需的； CloudFormation 使用此角色创建堆栈实例，因此它需要权限才能对堆栈执行 CloudFormation 操作。`AllowSsmParameterActions` 部分特定于正在启用的模板。

**解决权限问题**

使用受限策略启用蓝图时，您可能会发现没有足够的权限来启用蓝图。要解决这些问题，请修改您的策略文件，并更新成员账户的蓝图首选项以使用更正后的策略。要检查该策略是否足以启用蓝图，请确保已授予 CloudFormation 权限，并且您可以使用该角色直接创建堆栈。

## 创建 Terraform-based 服务目录产品所需的额外权限
<a name="custom-policy-document-tf"></a>

当您使用适用于 AFC 的 Terraform 配置文件创建 AWS Service Catalog 外部产品时，除了创建模板中定义的资源所需的权限外，还 AWS Service Catalog 需要将某些权限添加到您的 AFC 自定义 IAM 政策中。如果您选择默认的完整 **Admin** 策略，则无需添加这些额外权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "resource-groups:CreateGroup",
                "resource-groups:ListGroupResources",
                "resource-groups:DeleteGroup",
                "resource-groups:Tag"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "tag:GetResources",
                "tag:GetTagKeys",
                "tag:GetTagValues",
                "tag:TagResources",
                "tag:UntagResources"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": "s3:GetObject",
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/servicecatalog:provisioning": "true"
                }
            }
        }
    ]
}
```

------

有关使用中的外部产品类型创建 Terraform 产品的更多信息 AWS Service Catalog，请参阅《服务目录管理员指南》[中的](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/getstarted-launchrole-Terraform.html)步骤 5：创建启动角色。

## 过渡到 AWS Service Catalog 外部产品类型
<a name="service-catalog-external-product-type"></a>

AWS Service Catalog 将对 * Terraform 开源*产品和预配置产品的支持更改为一种名为外部的新产品类型。* *要了解有关此过渡的更多信息，请查看《AWS Service Catalog 管理员指南》**中的 [Updating existing Terraform Open Source products and provisioned products to the External product type](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/update_terraform_open_source_to_external.html)。

此更改会影响您通过 AWS Control Tower Account Factory 自定义创建或注册的现有账户。要将这些账户过渡到*外部*产品类型，您需要同时在 AWS Service Catalog 和 AWS Control Tower 中进行更改。

**过渡到外部产品类型**

1. 升级现有的 Terraform 参考引擎 AWS Service Catalog ，使其包括对*外部*和 * Terraform 开源产品类型的支持。*有关更新 Terraform 参考引擎的说明，请查看存储库。[AWS Service Catalog GitHub ](https://github.com/aws-samples/service-catalog-engine-for-terraform-os)

1. 在中 AWS Service Catalog，复制任何现有的 * Terraform 开源*产品（蓝图），副本使用新的外部产品类型。* ***不要终止现有的 Terraform 开源蓝图**。

1. 在 AWS Control Tower 中，使用 *Terraform 开源*蓝图更新每个账户，以使用新的*外部*蓝图。

   1. 要更新蓝图，必须先完全移除 *Terraform 开源*蓝图。有关更多详细信息，请查看[从账户中删除蓝图](https://docs.aws.amazon.com/controltower/latest/userguide/remove-a-blueprint.html)。

   1. 将新的*外部*蓝图添加到同一个账户。有关更多详细信息，请查看[向 AWS Control Tower 账户添加蓝图](https://docs.aws.amazon.com/controltower/latest/userguide/add-blueprint-to-account.html)。

1. 在所有使用 * Terraform 开源*蓝图的账户更新为*外部*蓝图后，返回 AWS Service Catalog 并终止所有使用 * Terraform 开源作为产品类型的产品。*

1. 今后，所有使用 AWS Control Tower Account Factory 自定义创建或注册的账户都必须使用 *CloudFormation* 或*外部*产品类型引用蓝图。

   对于使用*外部*产品类型创建的蓝图，AWS Control Tower 仅支持使用 Terraform 模板和 Terraform 参考引擎进行的账户自定义。要了解更多信息，请查看[设置以进行自定义](https://docs.aws.amazon.com/controltower/latest/userguide/afc-setup-steps.html)。

**注意**  
在创建新账户时，AWS Control Tower 不支持将 *Terraform 开源*作为一种产品类型。要了解有关这些更改的更多信息，请查看管理员指南[中的将现有 Terraform 开源产品和预置产品](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/update_terraform_open_source_to_external.html)更新为*外部*产品类型。*AWS Service Catalog * AWS Service Catalog 将根据需要支持客户完成此产品类型转换。如需帮助，请联系您的客户代表。