

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

# 自定义 AWS Control Tower 登录区
<a name="customize-landing-zone"></a>

AWS Control Tower 登录区的某些方面可以在控制台中进行配置，例如区域选择和可选控件。其他更改则可以通过自动化方式在控制台之外进行。

例如，您可以使用 AWS Control Tower 的自定义功能（一种*适用于 AWS CloudFormation 模板和 AWS Control Tower 生命周期事件的 GitOps风格自定义框架）为着陆区创建更广泛的自定义设置*。

# 从 AWS Control Tower 控制台进行自定义
<a name="console-customize"></a>

要对登录区进行这些自定义，请按照 AWS Control Tower 控制台提供的步骤操作。

**在设置过程中选择自定义名称**
+ 您可以在设置过程中选择顶级 OU 名称。[你可以 OUs随时使用 AWS Organizations 主机重命名，但是对你的输入进行更改 AWS Organizations 可能会导致可修复 OUs 的漂移。](drift.md)
+ 您可以选择共享的**审计**和**日志存档**账户的名称，但在设置后无法更改名称。（这是一次性选择）。

**提示**  
请记住，在中重命名 OU AWS Organizations 并不能更新 Account Factory 中相应的预配置产品。要自动更新预配置的产品（并避免出现偏移），必须通过 AWS Control Tower 执行 OU 操作，包括创建、删除或重新注册 OU。

**选择 AWS 区域**
+ 您可以通过选择特定的 AWS 区域进行治理来自定义您的着陆区。按照 AWS Control Tower 控制台中的步骤执行操作。
+ 在更新 landing zone 时，你可以选择和取消选择 AWS 区域进行治理。
+ 您可以将 “区域拒绝” 控件设置为 “**已启用**” 或 **“未启用”**，并控制用户对非治理 AWS 区域中大多数 AWS 服务的访问权限。

有关 cfCT AWS 区域 在哪些地方有部署限制的信息，请参阅[控件限制](control-limitations.md)。

**通过添加可选控件进行自定义**
+ 强烈推荐的控件和可选控件都是可选择的，这意味着您可以通过选择要启用的控件，自定义登录区的实施级别。默认情况下，[可选控件](https://docs.aws.amazon.com//controltower/latest/userguide/optional-controls.html)处于未启用状态。
+ 利用可选的[数据驻留控件](https://docs.aws.amazon.com//controltower/latest/userguide/data-residency-controls.html)，您可以自定义存储数据并允许访问数据的区域。
+ 集成 Security Hub CSPM 标准中的可选控件允许您扫描 AWS Control Tower 环境以检查是否存在安全风险。
+ 可选的主动控制允许您在 CloudFormation 资源配置之前对其进行检查，以确保新资源符合您环境的控制目标。

**自定义您的 AWS CloudTrail 路线**
+ 当您将着陆区更新到 3.0 或更高版本时，您可以选择加入或选择退出由 AWS Control Tower 管理的组织级 CloudTrail 路径。每次更新登录区时，您都可以更改这个选择。AWS Control Tower 会在您的管理账户中创建一个组织级跟踪，并且该跟踪会根据您的选择进入活动或非活动状态。着陆区 3.0 不支持账号级别的 CloudTrail 路径；但是，如果您需要这些路径，则可以配置和管理自己的路线。重复跟踪可能会产生额外费用。

**在控制台中创建自定义成员账户**
+ 您可以从 AWS Control Tower 控制台创建自定义的 AWS Control Tower 成员账户，也可以更新现有的成员账户以添加自定义设置。有关更多信息，请参阅 [使用 Account Factory Customization（AFC）功能自定义账户](af-customization-page.md)。

# 在 AWS Control Tower 控制台之外自动执行自定义
<a name="automate-customizations"></a>

有些自定义设置无法通过 AWS Control Tower 控制台执行，但可以通过其他方式来实现。例如：
+ 在配置过程中，你可以使用 Account F [*actory for Terraform (AFT) 以 GitOps风格的工作流程自定义帐户*](taf-account-provisioning.md)。

  AFT 通过 Terraform 模块进行部署，该模块可在 [AFT 存储库](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main)中找到。
+ 您可以使用 AWS Control Tower 的自定义 (cfcT) [*自定义您的 AWS Control Tower*](cfct-overview.md) 着陆区，这是一套基于 AWS CloudFormation 模板和服务控制策略构建的功能 (SCPs)。您可以将自定义模板和策略部署到组织内的个人账户和组织单位 (OUs)。

  cfCT 的源代码可在[GitHub 存储库](https://github.com/aws-solutions/aws-control-tower-customizations)中找到。
+ 您可以在 AWS上使用登录区加速器（LZA）自定义 AWS Control Tower 登录区。LZA 解决方案的设计符合 AWS 最佳实践，并符合多个全球合规框架。建议您将 AWS Control Tower 部署为基础登录区，然后根据需要使用 LZA 增强登录区的功能。有关更多信息，请参阅 [AWS Control Tower 和登录区加速器](https://docs.aws.amazon.com//controltower/latest/userguide/about-lza.html)。

# AWS Control Tower 和登录区加速器
<a name="about-lza"></a>

本节介绍结合使用 AWS Control Tower 和**登录区加速器**（LZA）解决方案的好处。

*您可以在AWS上使用登录区加速器（LZA）自定义 AWS Control Tower 登录区。*

LZA 是一种解决方案，它部署了一组基础功能，旨在与AWS最佳实践和多个全球合规框架保持一致，以帮助您管理和治理多账户环境。LZA 是使用 Cl AWS oud Development Kit (CDK) 构建的。

LZA 会自动设置一个适合托管安全工作负载的云环境。该解决方案可以全部部署AWS 区域，以帮助您保持运营和治理的一致性。LZA 解决方案的设计符合AWS最佳实践，并符合多个全球合规框架。

我们建议您将 AWS Control Tower 部署为您的基础登录区，然后根据需要使用 LZA 增强登录区功能。LZA 和 AWS Control Tower 的结合提供了一个全面的无代码解决方案，可帮助您管理和治理多账户环境，该环境旨在支持受到高度监管的工作负载和复杂的合规要求。结合使用 AWS Control Tower 和登录区加速器可帮助您建立平台就绪状态，包括安全性、合规性和运营功能。

LZA 的源代码可在[GitHub 存储库](https://github.com/awslabs/landing-zone-accelerator-on-aws)中找到。

有关如何结合使用 LZA 和 AWS Control Tower 的更多信息，请参阅《[LZA 实施指南](https://docs.aws.amazon.com//solutions/latest/landing-zone-accelerator-on-aws/prerequisites.html)》。

## Customizations for AWS Control Tower（CfCT）的优势
<a name="benefits-of-cfct"></a>

我们称为 *Customizations for AWS Control Tower*（CfCT）的功能包可帮助您为登录区创建自定义项，而且比在 AWS Control Tower 控制台中所能创建的自定义项更广泛。它提供了一种 GitOps风格的自动化流程。您可以重塑登录区以满足业务需求。

此*infrastructure-as-code*自定义过程将 AWS CloudFormation 模板与 AWS 服务控制策略 (SCPs) 和 AWS Control Tower [生命周期事件](lifecycle-events.md)集成，因此您的资源部署与着陆区保持同步。例如，当您使用 Account Factory 创建新账户时，可以自动部署附加到该账户和 OU 的资源。

**注意**  
与 Account Factory 和 AFT 不同，cfcT 不是专门用于创建新账户，而是通过部署你指定的资源来自定义账户和 OUs 着陆区。

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

**优势**
+ **扩展自定义的安全 AWS 环境** — 您可以更快地扩展您的多账户 AWS Control Tower 环境，并将 AWS 最佳实践整合到可重复的自定义工作流程中。
+ **实例化您的需求** — 您可以使用表达您的政策意图的 AWS CloudFormation 模板和服务控制策略根据您的业务需求自定义 AWS Control Tower 着陆区。
+ **利用 AWS Control Tower 生命周期事件进一步实现自动化** - 生命周期事件允许您根据之前一系列事件的完成情况部署资源。您可以依靠生命周期事件来帮助您将资源部署到账户并 OUs自动部署。
+ **扩展网络架构** - 您可以部署自定义的网络架构，以改善和保护连接，例如中转网关。

## 其他 CfCT 示例
<a name="cfct-examples"></a>
+  AWS 架构博客文章《使用[服务目录和 AWS Control Tower *自定义 AWS Control Tower* 部署一致的 DNS》和 AWS Control Tower 自定义项中给出了一个使用 AWS Control Tower 定制 (cfcT) 的网络用](https://aws.amazon.com/blogs//architecture/deploy-consistent-dns-with-aws-service-catalog-and-aws-control-tower-customizations/)例示例。
+ [`aws-samples`存储库](https://github.com/aws-samples/aws-security-reference-architecture-examples)中提供了一个[与 cfcT 和 GuardDuty Amazon 相关的](https://github.com/aws-samples/aws-security-reference-architecture-examples/tree/main/aws_sra_examples/solutions/guardduty/guardduty_org/customizations_for_aws_control_tower)具体示例。 GitHub 
+ 有关 CfCT 的其他代码示例，请参阅 [`aws-samples` 存储库](https://github.com/aws-samples/aws-security-reference-architecture-examples)中的“ AWS 安全参考架构”部分。其中许多示例都在名为 `customizations_for_aws_control_tower` 的目录中包含示例 `manifest.yaml` 文件。

有关 AWS 安全参考架构的更多信息，请参阅[AWS 规范性指南页面](https://docs.aws.amazon.com//prescriptive-guidance/latest/security-reference-architecture/welcome.html)。

# Customizations for AWS Control Tower（CfCT）概述
<a name="cfct-overview"></a>

*AWS Control Tower* (cfcT) 的自定义可帮助您自定义 AWS Control Tower 着陆区，并与 AWS 最佳实践保持一致。使用 AWS CloudFormation 模板和服务控制策略（SCPs）实现自定义。

此 CfCT 功能与 AWS Control Tower 生命周期事件集成，因此您的资源部署会与登录区保持同步。例如，在通过 Account Factory 创建新账户时，将自动部署附加到该账户的所有资源。您可以将自定义模板和策略部署到组织内的个人账户和组织单位 (OUs)。

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

 以下视频介绍了关于部署可扩展的 CfCT 管道和常见 CfCT 自定义项的最佳实践。

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


以下部分针对部署 Customizations for AWS Control Tower（CfCT），介绍了架构方面的注意事项以及相关配置步骤。它包括一个指向[AWS CloudFormation](https://aws.amazon.com/cloudformation)模板的链接，该模板根据安全性和可用性 AWS 的最佳实践来启动、配置和运行所需 AWS 服务。

*本主题面向在 AWS 云架构方面拥有实践经验的 IT 基础设施架构师和开发人员。*

有关 AWS Control Tower 自定义项 (cfcT) 的最新更新和变更的信息，请参阅存储库中的 [changelog.md 文件。](https://github.com/aws-solutions/aws-control-tower-customizations/blob/master/CHANGELOG.md) GitHub 

# 架构概述
<a name="architecture"></a>

部署 cfcT 将在 AWS 云中构建以下环境，并以 Amazon S3 存储桶作为配置源。

![\[AWS Control Tower 自定义项的架构图\]](http://docs.aws.amazon.com/zh_cn/controltower/latest/userguide/images/customizations-for-aws-control-tower-architecture-diagram.png)


cfcT 包括一个您在 AWS Control Tower 管理账户中部署的 AWS CloudFormation 模板。该模板会启动构建工作流所需的所有组件，因此您可以自定义 AWS Control Tower 登录区。

**注意**  
CfCT 必须部署在 AWS Control Tower 主区域和 AWS Control Tower 管理账户中，因为 AWS Control Tower 登录区正是部署在这些位置。有关设置 AWS Control Tower 登录区的信息，请参阅 [开始使用 AWS Control Tower](getting-started-with-control-tower.md)。

在部署 CfCT 时，它会通过 [Amazon Simple Storage Service](https://aws.amazon.com/s3/)（Amazon S3）将自定义资源打包并上传到代码管道源。上传过程会自动调用服务控制策略 (SCPs) 状态机和[AWS CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)状态机以 SCPs 在 OU 级别部署，或者在 OU 或账户级别部署堆栈实例。

**备注**  
默认情况下，CfCT 创建一个 Amazon S3 存储桶来存储管道源。如果您已有 AWS CodeCommit 存储库，则可以将其位置更改为[CodeCommit](https://aws.amazon.com/codecommit/)存储库。有关更多信息，请参阅 [[Set up Amazon S3 as the configuration source](cfct-s3-source.md)](cfct-s3-source.md)。

**CfCT 会部署两个工作流：**
+ [AWS CodePipeline](https://aws.amazon.com/codepipeline/) 工作流
+ 以及 AWS Control Tower 生命周期事件工作流。

**工作 AWS CodePipeline 流程**

工作 AWS CodePipeline 流程用于配置 AWS CodePipeline、[AWS CodeBuild](https://aws.amazon.com/codebuild/)项目和[AWS Step Functions](https://aws.amazon.com/step-functions/)协调组织内部的 AWS CloudFormation StackSets 管理。 SCPs

当您上传配置包时，CfCT 会调用代码管道来运行三个阶段。
+ **构建阶段** — 使用 AWS CodeBuild 验证配置包的内容。
+ **SCP Stag** e — 调用服务控制策略状态机，该状态机调用 AWS Organizations API 进行创建。 SCPs
+ CloudFormation St@@ **ag** e — 调用堆栈集状态机来部署您在清单[文件中提供的账户列表或 OUs中](the-manifest-file.md)指定的资源。

在每个阶段，代码管道都会调用堆栈集和 SCP 步骤函数，这些函数将自定义堆栈集部署 SCPs 到目标个人账户或整个组织单位。

**备注**  
有关自定义配置包的详细信息，请参阅 [CfCT 自定义指南](cfct-customizations-dev-guide.md)。

**AWS Control Tower 生命周期事件工作流**

在 AWS Control Tower 中创建新账户时，[生命周期事件](lifecycle-events.md)可以调用 AWS CodePipeline 工作流程。您可以通过此工作流程自定义配置包，该工作流程包括[亚马逊 EventBridge事件规则、亚马逊](https://aws.amazon.com/eventbridge/)[简单队列服务](https://aws.amazon.com/sqs/) (Amazon SQS) 先入先出 (FIFO) 队列和函数。[AWS Lambda](https://aws.amazon.com/lambda/)

当 Amazon EventBridge 事件规则检测到匹配的生命周期事件时，它会将事件传递到 Amazon SQS FIFO 队列，调用该 AWS Lambda 函数，然后调用代码管道来执行堆栈集的下游部署和。 SCPs

# 费用
<a name="cost"></a>

运行 cfCT 的成本取决于运行次数、 AWS CodePipeline 运行时长、 AWS Lambda 函数的 AWS CodeBuild 数量和持续时间以及发布的 Amazon EventBridge 事件数量。例如，如果您使用 **build.general1.small** 在一个月内运行 100 个构建，其中每个构建运行 5 分钟，则运行 CfCT 的大致成本为**每月 3.00 美元**。有关完整详细信息，您可以查看您正在运行的每项 AWS 服务的定价网页。

删除模板后，将保留亚马逊简单存储服务 (Amazon S3) Service 存储桶 AWS CodeCommit 和基于 Git 的存储库资源，以保护您的配置信息。根据您选择的选项，将根据存储在 Amazon S3 存储桶中的数据量和 Git 请求数量（不适用于 Amazon S3 资源）向您收费。有关详情，请参阅 [Amazon S3](https://aws.amazon.com/s3/pricing/) 和 [AWS CodeCommit](https://aws.amazon.com/codecommit/pricing/) 定价。

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

 以下 AWS 服务是 *AWS Control Tower 定制*服务 (cfcT) 的组成部分。

## AWS CodeCommit
<a name="comp-aws-codecommit"></a>

如果您已有 AWS CodeCommit 存储库，则可以将其配置为管道的来源，作为 Amazon S3 的替代方案。

根据您对 CloudFormation 模板的输入，cfcT 可以创建一个[AWS CodeCommit](https://aws.amazon.com/codecommit/)存储库，其示例配置与 Amazon 简单存储服务部分所述的配置相同。

要将 cfcT AWS CodeCommit 存储库克隆到本地计算机，必须创建凭据以允许您临时访问存储库，如[AWS CodeCommit 用户指南](https://docs.aws.amazon.com//codecommit/latest/userguide/temporary-access.html#temporary-access-configure-credentials)中所述。有关版本兼容性的信息，请参阅 [Setting up for AWS CodeCommit](https://docs.aws.amazon.com//console/codecommit/connect-tc-alert-np)。

**注意**  
如果您尚未使用 CodeCommit，则唯一的选择是将 Amazon S3 存储桶设置为配置包的存储位置。 CodeCommit 如果您是首次部署 cfCT，则不可用。

## AWS CodePipeline
<a name="comp-aws-codepipeline"></a>

AWS CodePipeline 根据配置包的更新验证、测试和实施更改，这些更改将在默认 Amazon S3 存储桶或存储 AWS CodeCommit 库中完成。有关配置源控件的更多信息，请参阅 [Using Amazon S3 as the Configuration Source](cfct-s3-source.md)。该管道包括验证和管理配置文件和模板、核心帐户、 AWS Organizations 服务控制策略的阶段，以及 AWS CloudFormation StackSets。有关管道阶段的更多信息，请参阅 [CfCT 自定义指南](cfct-customizations-dev-guide.md)

## AWS Key Management Service
<a name="comp-aws-kms"></a>

CfCT 创建一个 [AWS Key Management Service](https://aws.amazon.com/kms/)（AWS KMS）`CustomControlTowerKMSKey` 加密密钥。此密钥用于加密 Amazon S3 配置存储桶中的对象、Amazon SQS 队列以及 AWS Systems Manager Parameter Store 中的敏感参数。默认情况下，只有由 CfCT 预置的角色才有权使用此密钥执行加密或解密操作。要访问配置文件、FIFO 队列或 Parameter Store `SecureString` 值，必须将管理员添加到 `CustomControlTowerKMSKey` 策略。默认情况下，不会启用自动密钥轮换。

## AWS Lambda
<a name="comp-aws-lambda"></a>

在 AWS Control Tower 的初始安装和部署期间， AWS CloudFormation StackSets 或在 AWS Control Tower 生命周期事件 AWS Organizations SCPs 期间，cfcT 使用 AWS Lambda 函数来调用安装组件。

## Amazon Simple Notification Service
<a name="comp-amazon-sns"></a>

 CfCT 可在工作流期间向 [Amazon Simple Notification Service](https://aws.amazon.com/sns/)（Amazon SNS）主题发布管道审批等通知。只有当您选择接收管道审批通知时，才会启动 Amazon SNS。

## Amazon Simple Storage Service
<a name="comp-amazon-s3"></a>

 部署 CfCT 时，CfCT 会创建具有唯一名称的 Amazon Simple Storage Service（Amazon S3）存储桶：

 **示例：Amazon S3 存储桶名称** 

 `custom-control-tower-configuration-accountID-region` 

 该存储桶包含名为 `_custom-control-tower-configuration.zip` 的示例配置文件 

请注意文件名中的前导下划线。

 此 zip 文件提供了示例清单以及描述必要文件夹结构的相关示例模板。这些示例可帮助您开发用于自定义 AWS Control Tower 登录区的配置包。示例清单确定了在实施自定义设置时所需的堆栈集和服务控制策略 (SCPs) 的必要配置。

您可以使用此示例配置包作为模型，开发和上传您的自定义包，这将自动触发 CfCT 配置管道。

有关自定义配置文件的信息，请参阅 [CfCT 自定义指南](cfct-customizations-dev-guide.md)。

## Amazon Simple Queue Service
<a name="comp-amazon-sqs"></a>

cfcT 使用亚马逊简单队列服务 (Amazon SQS) Simple Queue SERVICE FIFO 队列从亚马逊捕获生命周期事件。 EventBridge它会触发一个 AWS Lambda 函数，该函数调用 AWS CodePipeline 以部署 AWS CloudFormation StackSets或。 SCPs有关的更多信息 SCPs，请参阅[AWS Organizations](https://aws.amazon.com/organizations/)。

## AWS Step Functions
<a name="comp-aws-step-functions"></a>

 CfCT 创建 Step Functions 来编排自定义部署。这些 Step Functions 会转换配置文件，以便根据需要跨环境部署自定义。

## AWS Systems Manager 参数存储
<a name="comp-aws-sm-parameter-store"></a>

[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 存储 CfCT 配置参数。这些参数允许您集成相关的配置模板。例如，您可以将每个账户配置为将 AWS CloudTrail 数据记录到集中式的 Amazon S3 存储桶。此外，Systems Manager Parameter Store 还提供了一个集中位置，管理员可以在其中查看 CfCT 输入和参数。

# 部署注意事项
<a name="cfct-considerations"></a>

请务必在部署 AWS Control Tower 登录区的同一账户和区域中启用 *Customizations for AWS Control Tower*（CfCT）；也就是说，您必须将其部署在 AWS Control Tower 主区域的 AWS Control Tower 管理账户中。默认情况下，CfCT 通过在该账户和区域中设置配置管道来创建和运行登录区配置包。

## 准备部署
<a name="deploy-custom-aws-ct-deploy"></a>

在为初始部署准备 CloudFormation 模板时，您可以选择一些选项。您可以选择配置源，也可以允许手动批准管道部署。接下来的两部分将详细介绍这些选项。

### 选择配置源
<a name="deploy-config-source"></a>

默认情况下，模板会创建一个 Amazon Simple Storage Service（Amazon S3）存储桶来将示例配置包存储为名为 `_custom-control-tower-configuration.zip` 的 `.zip` 文件。Amazon S3 存储桶受版本控制，您可以根据需要更新配置包。有关更新配置包的信息，请参阅 [Using Amazon S3 as the Configuration Source](cfct-s3-source.md)。

**记得删除下划线**  
示例配置包文件名以下划线 (\$1) 开头， AWS CodePipeline 因此不会自动启动。完成自定义配置包后，请务必上传不带下划线（\$1）的 `custom-control-tower-configuration.zip`，以便在 AWS CodePipeline中开始部署。

如果您已有 AWS CodeCommit Git 存储库，则可以将配置包的存储位置从 Amazon S3 存储桶更改为 AWS CodeCommit Git 存储库。为此，请在 CloudFormation 参数中选择该`CodeCommit`选项。

**要压缩还是不压缩？**  
使用默认 S3 存储桶时，请确保配置包以 `.zip` 文件形式提供。如果您使用的是 AWS CodeCommit 存储库，请务必在不压缩文件的情况下将配置包置于存储库中。有关在中创建和存储配置包的信息 AWS CodeCommit，请参见[CfCT 自定义指南](cfct-customizations-dev-guide.md)。

您可以使用示例配置包来创建自己的自定义配置源。如果已准备好部署自定义配置，请将配置包手动上传到 Amazon S3 存储桶或 AWS CodeCommit 存储库。该管道会在您上传配置文件时自动启动。

### 选择管道配置批准参数
<a name="deploy-pipeline-config-parameters"></a>

该 AWS CloudFormation 模板提供了手动批准部署配置更改的选项。默认情况下，不启用手动批准。有关更多信息，请参阅 [Step 1. Launch the stack](step1.md)。

启用手动批准后，配置管道将验证对 AWS Control Tower 文件清单和模板所做的自定义，然后暂停该流程，直到获得手动批准。获得批准后，部署将根据需要继续运行剩余的管道阶段，以实施 *Customizations for AWS Control Tower*（CfCT）功能。

您可以通过拒绝首次尝试运行管道，使用手动批准参数来阻止运行 AWS Control Tower 配置的自定义。此参数还允许您手动验证 AWS Control Tower 配置更改的自定义，作为实施前的最终控件。

## 更新 Customizations for AWS Control Tower
<a name="update"></a>

如果您之前部署过 cfCT，则必须更新 CloudFormation 堆栈才能获取 cfCT 框架的最新版本。有关详细信息，请参阅 [Update the Stack](update-stack.md)。

# 模板和源代码
<a name="cfct-template"></a>

 Customizations for AWS Control Tower（CfCT）会在您启动 AWS CloudFormation 模板后部署到您的管理账户中。您可以从 GitHub 下载该[模板](  https://github.com/aws-solutions/aws-control-tower-customizations/blob/main/customizations-for-aws-control-tower.template)，然后从 [AWS CloudFormation](https://console.aws.amazon.com/cloudformation/home?region=us-east-1) 将其启动。

 **customizations-for-aws-control-tower.template** 会部署以下内容：
+  AWS CodeBuild 项目 
+  AWS CodePipeline 项目 
+  Amazon EventBridge 规则 
+  AWS Lambda 函数 
+  Amazon Simple Queue Service 队列 
+  Amazon Simple Storage Service 存储桶，带有示例配置包 
+  AWS Step Functions 

**注意**  
 您可以根据自己的特定需求来自定义模板。

## 源代码存储库
<a name="cfct-source-code"></a>

您可以访问我们的 [GitHub 存储库](https://github.com/aws-solutions/aws-control-tower-customizations)以下载 CfCT 的模板和脚本，并与他人共享您的登录区自定义项。

# 自动部署
<a name="deployment"></a>

在启动自动部署之前，请查看相关[注意事项](cfct-considerations.md)。请按照本部分中的分步说明配置该解决方案并将其部署到您的 AWS Control Tower 管理账户中。

**部署用时**：大约 15 分钟

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

CfCT 必须部署在您的 AWS Control Tower 管理账户以及您的 AWS Control Tower 主区域中。如果您没有设置登录区，请参阅 [开始使用 AWS Control Tower](getting-started-with-control-tower.md)。

## 部署步骤
<a name="what-we-cover"></a>

部署 CfCT 的过程包括两个主要步骤。有关详细说明，请访问每个步骤的链接。

[第 1 步：启动堆栈](step1.md)
+ 在管理账户中启动 CloudFormation 模板。
+ 查看模板参数，并根据需要进行调整。

[第 2 步：创建自定义程序包](step2.md)
+ 创建自定义配置包。

**重要**  
要下载正确的 AWS CloudFormation 模板并启动 CfCT，请单击本部分中提供的 GitHub 链接。请勿访问指向任何先前指定的 S3 存储桶的旧链接。

# 第 1 步：启动堆栈
<a name="step1"></a>

本部分中的 CloudFormation 模板将在您的账户中部署 *Customizations for AWS Control Tower*（CfCT）。

**注意**  
您需要承担运行 CfCT 时使用 AWS 服务的费用。有关更多详细信息，请参阅 [费用](cost.md)。

1. 要启动 *Customizations for AWS Control Tower*，请[从 GitHub 下载该模板](  https://github.com/aws-solutions/aws-control-tower-customizations/blob/main/customizations-for-aws-control-tower.template)，然后从 [AWS CloudFormation](https://console.aws.amazon.com/cloudformation/home?region=us-east-1) 启动它。

1. 默认情况下，该模板在美国东部（弗吉尼亚州北部）区域启动。要在其他 AWS 区域中启动 CfCT，请使用控制台导航栏中的区域选择器。
**注意**  
CfCT 必须在您部署 AWS Control Tower 登录区（即您的主区域）的同一区域和账户中启动。

1. 在**创建堆栈**页面上，验证 **URL** 文本框中是否显示了正确的模板 URL，然后选择**下一步**。

1. 在**指定堆栈详细信息**页面上，为您的 CfCT 堆栈分配一个名称。

1. 在**参数**下，查看以下参数，必要时在模板中进行修改。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/controltower/latest/userguide/step1.html)

1. 选择**下一步**。

1. 在 **配置堆栈选项** 页面上，请选择 **下一步**。

1. 在 **Review** 页面上，审核并确认设置。务必选中确认模板将创建 AWS Identity and Access Management（IAM）资源的复选框。

1. 选择 **Create stack（创建堆栈）**以部署堆栈。

   您可以在 CloudFormation 控制台的**状态**列中查看堆栈的状态。您应在大约 15 分钟后看到 **CREATE\$1COMPLETE** 状态。

# 第 2 步：创建自定义程序包
<a name="step2"></a>

对于启动的堆栈，您可以通过自定义随附的配置包，为 AWS Control Tower 登录区和服务控制策略（SCP）添加自定义。有关创建自定义程序包的详细说明，请参阅 [CfCT 自定义指南](cfct-customizations-dev-guide.md)。

**注意**  
如果不上传自定义配置包，管道就无法运行。

# 更新堆栈
<a name="update-stack"></a>

 如果您之前部署了 *Customizations for AWS Control Tower*（CfCT），请按照以下步骤更新 AWS CloudFormation 堆栈，以获取最新版本的 CfCT 框架。

**重要**  
 在完成以下步骤之前，必须将 [GitHub 中的最新模板](  https://github.com/aws-solutions/aws-control-tower-customizations/blob/main/customizations-for-aws-control-tower.template) 上传到 Amazon Simple Storage Service（Amazon S3）存储桶。有关如何开始使用 Amazon S3 的说明，请参阅《Amazon Simple Storage Service 用户指南》**中的 [Amazon S3 入门](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)。

1.  登录 [AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)。

1.  选择现有的 **Customizations for AWS Control Tower**（CfCT）CloudFormation 堆栈，然后选择**更新**。

1.  在**先决条件 - 准备模板**下，选择**替换当前模板**。

1.  在**指定模板**下，执行以下操作：

   1.  对于**模板源**，请选择**替换当前模板**。

   1.  对于 **Amazon S3 URL**，请输入您之前从 GitHub 上传到 Amazon S3 的模板的模板 URL，然后选择**下一步**。

   1.  验证模板 URL 是否正确。选择**下一步**，然后再次选择**下一步**。

1. 在**参数**下，检查模板的参数，并根据需要进行修改。请参阅 [Step 1. Launch the stack](step1.md) 以获取有关参数的详细信息。

1. 选择**下一步**。

1. 在 **配置堆栈选项** 页面上，请选择 **下一步**。

1. 在 **Review** 页面上，审核并确认设置。务必选中确认模板可能会创建 AWS Identity and Access Management (IAM) 资源的复选框。

1. 选择**查看更改集**并验证更改。

1. 选择**更新堆栈**以部署堆栈。

   您可以在 AWS CloudFormation 控制台的**状态**列中查看堆栈的状态。您应在大约 15 分钟后看到 **UPDATE\$1COMPLETE** 状态。

# 删除堆栈集
<a name="cfct-delete-stack"></a>

如果您在清单文件中启用了堆栈集删除，则可以删除堆栈集。默认情况下，`enable_stack_set_deletion` 参数设置为 `false`。在此配置中，从 CfCT 清单文件中移除资源时，不会采取任何操作来删除关联的堆栈集。

如果您在清单文件中将 `enable_stack_set_deletion` 的值更改为 `true`，则从清单文件中移除关联资源时，CfCT 会删除堆栈集及其所有资源。

清单文件的**版本 2** 支持此功能。

**重要**  
如果最初将 `enable_stack_set_deletion` 的值设置为 `true`，下次调用 CfCT 时，**所有**以前缀 `CustomControlTower-` 开头、具有关联的密钥标签 `Key:AWS_Solutions, Value: CustomControlTowerStackSet` 且未在清单文件中声明的资源都将被暂存以供删除。

以下是有关如何在 `manifest.yaml` 文件中设置此参数的示例：

```
version: 2021-03-15
region: us-east-1
enable_stack_set_deletion: true   #New opt-in functionality


resources: 
  - name: demo_resource_1
    resource_file: s3://demo_bucket/resource.template
    deployment_targets:
      accounts:
        - 012345678912
    deploy_method: stack_set
    ...
    regions:
    - us-east-1
    - us-west-2

  - name: demo_resource_2
    resource_file: s3://demo_bucket/resource.template
    deployment_targets:
      accounts:
        - 012345678912
    deploy_method: stack_set
    ...
    regions: 
    - us-east-1
    - eu-north-1
```

# 将 Amazon S3 设置为配资源
<a name="cfct-s3-source"></a>

设置 *AWS Control Tower 自定义项*时，它会在一个名为 `custom-control-tower-configuration-account-ID-region` 的 Amazon Simple Storage Service（Amazon S3）存储桶中存储一个初始配置文件，该文件名为 `_custom-control-tower-configuration.zip`。

**注意**  
如果您选择下载并修改此文件，请记得将更改内容压缩，另存为名为 `custom-control-tower-configuration.zip` 的新文件，然后将其上传回同一个 Amazon S3 存储桶。  
Amazon S3 存储桶是管道的默认源。完成默认设置后，在将文件名中不带下划线前缀的 zip 配置文件上传到 S3 存储桶时，将自动启动管道。

该 zip 文件受采用 AWS Key Management Service（AWS KMS）的[服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html)（SSE）以及对 KMS 密钥的[禁用](https://docs.aws.amazon.com/kms/latest/developerguide/determining-access.html)措施的保护。要访问该 zip 文件，必须更新 KMS 密钥策略以指定应被授予访问权限的角色。该角色可以是管理员、用户或两者兼而有之。请按照以下过程操作：

1. 导航至 [AWS Key Management Service 控制台](https://console.aws.amazon.com/kms/home)。

1. 在**客户托管密钥**中，选择 **CustomControlTowerKMSKey**。

1. 选择**密钥策略**选项卡。然后，选择**编辑**。

1. 在**编辑密钥策略**页面中，找到代码中的 **Allow Use of the key** 部分，然后添加以下权限之一：
   + 添加管理角色：

     `arn:aws:iam::<account-ID>:role/<administrator-role>`
   + 添加用户：

     `arn:aws:iam::<account-ID>:user/<username>`

1. 选择**保存更改**。

1. 导航到 [Amazon S3 控制台](https://console.aws.amazon.com/s3/home)，找到包含 zip 配置文件的 S3 存储桶，然后选择“下载”。

1. 对清单文件和模板文件进行必要的配置更改。有关自定义清单和模板文件的信息，请参阅 [CfCT 自定义指南](cfct-customizations-dev-guide.md)。

1. 上传更改：

   1. 压缩修改后的配置文件，并将文件命名为：`custom-control-tower-configuration.zip`。

   1. 使用带有 AWS KMS 主密钥（`CustomControlTowerKMSKey`）的 SSE，将该文件上传到 Amazon S3。

# 设置 GitHub 为配置源
<a name="cfct-github-configuration-source"></a>

本节介绍如何部署以来源为AWS Control Tower (cfcT) GitHub 的自定义项。该过程包括以下三个主要步骤：
+ 准备存储 GitHub 库
+ 创建 GitHub 代码连接
+ 部署堆CloudFormation栈

## 准备存储 GitHub 库
<a name="prepare-github-cfct-source"></a>

 在您的 GitHub 账户中创建存储库，模板中使用的默认名称为`custom-control-tower-configuration`。考虑将目标存储库设为*私有*。在 CfCT 存储库[部署文件夹](https://github.com/aws-solutions/aws-control-tower-customizations/tree/main/deployment)中名为 `manifest.yaml` 的 `yaml` 文件中定义自定义设置。

[https://docs.aws.amazon.com//controltower/latest/userguide/cfct-customizations-dev-guide.html](https://docs.aws.amazon.com//controltower/latest/userguide/cfct-customizations-dev-guide.html)提供了有关创建 `manifest.yaml` 以配置自定义的详细指导。

## 创建 GitHub 连接
<a name="create-github-cfct-connection"></a>

在 GitHub 的 **开发人员工具 - 连接**实例中，执行以下步骤：

1. 选择 “**创建连接**”，然后选择 GitHub 作为提供商

1. 选择 “**创建 GitHub 应用程序连接**”，然后在 “**连接名称**” 字段中输入 **GitHub cfcT** 或您选择的任何名称

1. 选择 “**Connect t** o”， GitHub然后选择 “**安装新应用程序**”

1. 为您的存储库选择 GitHub 用户或组织

1. 在**存储库访问**下，选择**仅选择存储库**，然后选择您之前创建的存储库，并选择**保存**您的工作。

1. 注意 Code Connections ARN-部署堆栈时需要它。CloudFormation

## 部署堆CloudFormation栈
<a name="deploy-github-cfct-stack"></a>
+ 从存储库下载 `custom-control-tower-initiation.template` 文件。
+ 使用`custom-control-tower-initiation.template`文件创建新CloudFormation堆栈。
+ 在 “**AWS CodePipeline 源**” 下，选择 **GitHub （通过代码连接）**。
+ 在 “**GitHub 设置”** 下，指定以下字段：
  + 对于 **Code Connection 的 ARN**，提供 Code Connection ARN
  + 对于 “**GitHub 用户” 或 “组织**”，请提供您在其中创建存储库的 GitHub 用户或组织的名称
  + 在 “**GitHub 存储库名称**” 中，输入存储库名称（默认为`custom-control-tower-configuration`）
  + 在 “**GitHub 分支名称**” 中，输入分支名称（默认为`main`）

# 运行指标集合
<a name="cfct-metrics"></a>

 *Customizations for AWS Control Tower*（CfCT）包括向 AWS 发送匿名运行指标的选项。AWS 使用这些数据来了解客户如何使用 CfCT 以及其他相关服务和产品。启用数据收集后，将向 AWS 发送以下信息：
+ **解决方案 ID：**AWS 解决方案标识符
+ **唯一 ID（UUID）：**为每个部署随机生成的唯一标识符
+ **时间戳：**数据收集时间戳
+ **状态机执行计数：**以增量方式统计该状态机的运行次数
+ **清单版本：**配置中使用的清单版本

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

 要选择不向 AWS 发送匿名运行指标，请完成以下任务之一：
+  **按如下所示更新 AWS CloudFormation 模板映射部分：**

   *从* 

  ```
  AnonymousData:
       SendAnonymousData:
          Data: Yes
  ```

   *更改为* 

  ```
  AnonymousData:
       SendAnonymousData:
          Data: No
  ```
+  **部署 CfCT 后，在 Parameter Store 控制台中查找 `/org/primary/metrics_flag` SSM 参数密钥，并将该值更新为 `No`。**

# CfCT 自定义指南
<a name="cfct-customizations-dev-guide"></a>

 *AWS Control Tower 定制 (cfcT) 指南适用于想要为公司和客户定制*和扩展 AWS Control Tower 环境的管理员、 DevOps 专业人士、独立软件供应商、IT 基础设施架构师和系统集成商。它提供了有关使用 CfCT 自定义包自定义和扩展 AWS Control Tower 环境的信息。

**注意**  
 要部署和配置 (cfcT)，必须通过 AWS CodePipeline部署和处理配置包。以下各部分详细介绍了这一过程。

# CodePipeline 概述
<a name="cfct-codepipeline-overview"></a>

配置包需要亚马逊简单存储服务 (Amazon S3) S AWS CodePipeline ervice 和。配置包包含以下项目：
+ 一个清单文件
+ 一组配套模板
+ 其他 JSON 文件，用于描述和实现您的 AWS Control Tower 环境自定义

默认情况下，`_custom-control-tower-configuration.zip` 配置包按以下命名约定加载到 Amazon S3 存储桶中：

`custom-control-tower-configuration-accountID-region`.

**注意**  
 默认情况下，CfCT 创建一个 Amazon S3 存储桶来存储管道源。大多数客户都使用此默认设置。如果您已有 AWS CodeCommit 存储库，则可以将源位置更改为存储 AWS CodeCommit 库。有关更多信息，请参阅《*AWS CodePipeline 用户指南》 CodePipeline*[中的编辑管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-edit.html)。

*清单文件*是一个文本文件，描述了您可以部署哪些 AWS 资源来自定义 landing zone。 CodePipeline 执行以下任务：
+ 提取清单文件、一组配套模板及其他 JSON 文件
+ 执行清单和模板验证
+ 调用 CfCT 清单文件中的各部分来运行特定的[管道阶段](#code-pipeline-stages)。

通过自定义清单文件并从配置包文件名中删除下划线（\$1）来更新配置包时，它会自动启动 AWS CodePipeline。

**记住下划线**  
示例配置包文件名以下划线（\$1）开头，因此不会自动触发 AWS CodePipeline 。完成配置包的自定义后，上传不带下划线（\$1）的文件 `custom-control-tower-configuration.zip`，以便在 AWS CodePipeline中触发部署。

## AWS CodePipeline 阶段
<a name="code-pipeline-stages"></a>

cfcT 管道需要几个 AWS CodePipeline 阶段才能实施和更新您的 AWS Control Tower 环境。

1. **源阶段**

   源阶段是初始阶段。您的自定义配置包将启动此管道阶段。的源 AWS CodePipeline 可以是 Amazon S3 存储桶，也可以是 AWS CodeCommit 存储库，可以在其中托管配置包。

1. **构建阶段**

   构建阶段 AWS CodeBuild 需要验证配置包的内容。这些检查包括使用 CloudFormation `validate-template`和测试`manifest.yaml`文件语法和架构，以及包中包含或远程托管的所有 CloudFormation 模板`cfn_nag`。如果清单文件和 CloudFormation 模板通过测试，管道将继续执行下一阶段。如果测试失败，您可以查看 CodeBuild 日志以确定问题，并根据需要编辑配置源文件。

1. **手动审批阶段（可选）**

   手动审批阶段为可选阶段。如果启用此阶段，它将提供对配置管道的额外控制。它会在部署期间暂停管道，直到获得审批。启动堆栈时，您可以通过将**管道审批阶段**参数编辑为**是**来选择手动审批。

1. **策略阶段**

   策略阶段调用服务控制策略 (SCP) 或资源控制策略 (RCP) 状态机来调用 AWS Organizations APIs 该创建或。 SCPs RCPs

1. **CloudFormation 资源阶段**

    CloudFormation 资源阶段调用堆栈集状态机来部署您在清单文件中提供的账户或组织单位列表 (OUs) 中指定的资源。状态机按照清单文件中指定的顺序创建 CloudFormation 资源。要指定资源依赖关系，请按照清单文件中指定资源的顺序进行排列。清单文件中资源的顺序是指定依赖关系的唯一方法。

# 定义自定义配置
<a name="cfct-custom-configuration"></a>

您将使用 CfCT 清单文件、一组配套模板和其他 JSON 文件来定义您的自定义 AWS Control Tower 配置。您需要将这些文件打包成一个文件夹结构，并以 `.zip` 文件的形式放入 Amazon S3 存储桶中，如以下代码示例所示。

**自定义配置文件夹结构**

```
- manifest.yaml
- policies/                                                [optional]
   - service control policies files (*.json)
- templates/                                               [optional]
   - template files for AWS CloudFormation Resources (*.template)
```

前面的示例描述了自定义配置文件夹的结构。无论您选择 Amazon S3 还是 AWS CodeCommit 存储库作为源存储位置，文件夹结构都保持不变。如果您选择 Amazon S3 作为源存储，请将所有文件夹和文件压缩成一个 `custom-control-tower-configuration.zip` 文件，然后仅将 `.zip` 文件上传到指定的 Amazon S3 存储桶。

**注意**  
如果您正在使用 AWS CodeCommit，请将文件放在存储库中而不压缩文件。

# CfCT 清单文件
<a name="the-manifest-file"></a>

cfcT `manifest.yaml` 文件是一个描述您的 AWS 资源的文本文件。以下示例显示了 CfCT 清单文件的结构。

```
---
region: String
version: 2021-03-15

resources:
  #set of CloudFormation resources, SCP policies, or RCP policies
...
```

如前面的代码示例所示，清单文件的前两行指定了 **region** 和 **version** 关键字对应的值。以下是这些关键字的定义。

**region** - AWS Control Tower 默认区域的文本字符串。此值必须是有效的 AWS 区域名称（例如`us-east-1``eu-west-1`、或`ap-southeast-1`）。创建自定义 AWS Control Tower 资源（例如 CloudFormation StackSets）时，AWS Control Tower 主区域是默认区域，除非指定了更具体的资源区域。

```
region:your-home-region
```

**version** – 清单架构版本号。支持的最新版本为 2021-03-15。

```
version: 2021-03-15
```

**注意**  
强烈建议您使用最新版本。要在最新版本中更新清单属性，请参阅 [CfCT 清单的版本升级](cfct-compatibility.md)。

上一个示例中显示的下一个关键字是 **resources** 关键字。清单文件的 **resources** 部分结构化程度很高。它包含资源的详细列表，这些 AWS 资源将由 cfCT 管道自动部署。下一部分将具体介绍这些资源及其可用参数。

# CfCT 清单文件的资源部分
<a name="cfct-manifest-file-resources-section"></a>

 本主题介绍 CfCT 清单文件的**资源**部分，您将在此定义自定义项所需的资源。CfCT 清单文件的这一部分从关键字**资源**开始，一直持续到文件末尾。

 清单文件的**资源**部分指定了 cfcT 通过代码管道自动部署的 CloudFormation StackSets RCPs、或 AWS Organizations SCPs 和。您可以列出 OUs账户和区域来部署堆栈实例。

 堆栈实例部署在账户级别，而不是 OU 级别。 SCPs 并 RCPs 在 OU 级别部署。有关更多信息，请参阅 [Build your own customizations](https://docs.aws.amazon.com/controltower/latest/userguide/cfcn-byo-customizations.html)。

 以下示例模板描述了清单文件的 **resources** 部分中可能可用的条目。

```
resources: # List of resources
  - name: [String]
    resource_file: [String] [Local File Path, S3 URI, S3 URL] 
    deployment_targets: # account and/or organizational unit names
      accounts: # array of strings, [0-9]{12}
        - 012345678912
        - AccountName1
      organizational_units: #array of strings
        - OuName1
        - OuName2 
    deploy_method: scp | stack_set | rcp
    parameters: # List of parameters [SSM, Alfred, Values]
      - parameter_key: [String]
        parameter_value: [String]  
    export_outputs: # list of ssm parameters to store output values
      - name: /org/member/test-ssm/app-id
        value: $[output_ApplicationId]    
    regions: #list of strings
    - [String]
```

**本主题的其余部分将详细介绍前面代码示例中显示的关键字的定义。**

**名称**-与关联的名称 CloudFormation StackSets。 您提供的字符串为堆栈集分配了一个更便于用户使用的名称。
+  **类型**：字符串
+ **是否必需**：是
+ **有效值：**a-z、A-Z、0-9 和连字符 (-)。名称必须以字母开头。

**description** – 资源的描述。
+ **类型**：字符串
+ **必需**：否

 **resource\$1** file — 可以将此文件指定为清单文件的相对位置、指向 JSON 中用于创建 CloudFormation 资源的 CloudFormation 模板或 AWS Organizations 服务控制策略的 Amazon S3 URI 或 URL， SCPs或。 RCPs
+ **类型**：字符串
+ **是否必需**：是 

1. 以下示例显示了 `resource_file`，它是配置包中资源文件的相对位置。

   ```
   resources:
     - name: SecurityRoles
       resource_file: templates/custom-security.template
   ```

1. 以下示例显示了以 Amazon S3 URI 形式提供的资源文件 

   ```
   resources:
     - name: SecurityRoles
       resource_file: s3://amzn-s3-demo-bucket/[key-name]
   ```

1. 以下示例显示了以 Amazon S3 HTTPS URL 形式提供的资源文件 

   ```
   resources:
     - name: SecurityRoles
       resource_file: https://bucket-name.s3.Region.amazonaws.com/key-name
   ```
**注意**  
如果您提供的是 Amazon S3 URL，请验证存储桶策略是否允许您在其中部署 CfCT 的 AWS Control Tower 管理账户进行读取访问。如果您提供的是 Amazon S3 HTTPS URL，请验证该路径是否使用了点表示法。例如 `S3.us-west-1`。CfCT 不支持在 S3 与区域之间包含短划线的端点，例如 `S3‐us-west-2`。

1. 以下示例显示了 Amazon S3 存储桶策略和存储资源的 ARN。

   ```
   {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
           "Effect": "Allow",
           "Principal": {"AWS": "arn:aws:iam::AccountId:root"},
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::my-bucket/*”
          }
      ]
   }  
   ```

   您将使用正在部署 cfcT 的管理 AWS 账户的账户 ID 替换示例中显示的*AccountId*变量。有关更多示例，请参阅《Amazon Simple Storage Service 用户指南》中的[存储桶策略示例](https://docs.aws.amazon.com//AmazonS3/latest/userguide/example-bucket-policies.html)。

**parameters** – 指定 CloudFormation 参数的名称和值。
+ **类型** MapList：
+ **必需**：否

参数部分包含成对的 key/value 参数。以下伪模板概述了 **parameters** 部分。

```
parameters:
  - parameter_key: [String]
    parameter_value: [String]
```
+ **parameter\$1key** – 与参数关联的键。
  +  **类型**：字符串
  + **必需**：是（在参数属性下）
  + **有效值**：a-z、A-Z 和 0-9 
+ **parameter\$1value** – 与参数关联的输入值。
  + **类型**：字符串 
  +  **必需**：是（在参数属性下） 

**deploy\$1method** – 用于将资源部署到账户中的部署方法。当前，**deploy\$1met** hod 支持使用资源部署`stack_set`选项（通过部署） CloudFormation StackSets、`scp`选项部署资源（如果您正在部署 SCPs）或`rcp`选项（如果您正在部署）来部署资源。 RCPs
+ **类型**：字符串 
+ **有效值：** `stack_set` \$1 `scp` \$1 `rcp`
+ **是否必需**：是

****deplo@@ **yment\$1t** argets — 账户或组织单位 (OUs) 列表，cfcT 将在其中部署 CloudFormation 资源，指定为账户或组织单位。****

**注意**  
 如果要部署 SCP 或 RCP，则目标必须是 OU，而不是账户。
+ **类型**：`account name` 或 `account number` 字符串列表，表示此资源将部署到给定的账户列表中，或 `OU names` 字符串列表，表示此资源将部署到给定的 OU 列表中。
+ **必需**：**accounts** 或 **organizational\$1units** 中至少一个
  + **accounts**：

    **类型**：`account name` 或 `account number` 字符串列表，表示此资源将部署到给定的账户列表中。
  + **organizational\$1units**：

    **类型**：`OU names` 字符串列表，表示此资源将部署到给定的 OU 列表中。如果您提供的 OU 不包含账户且未添加 **accounts** 属性，则 CfCT 只会创建堆栈集。
**注意**  
组织的管理账户 ID 不是允许的值。默认情况下，CfCT 不支持将堆栈实例部署到组织的管理账户。如果您有特殊使用案例，请参阅[根 OU](https://docs.aws.amazon.com//controltower/latest/userguide/cfct-root-ou.html)。

**export\$1output** s — 表示 SSM 参数密钥的 name/value 对列表。这些 SSM 参数键允许您将模板输出存储到 SSM Parameter Store 中。输出仅供清单文件前面定义的其他资源参考。

```
export_outputs: # List of SSM parameters
  - name: [String]
    value: [String]
```
+ **类型**：**name** 和 **value** 键值对的列表。**name** 包含 SSM Parameter Store 键的 `name` 字符串，**value** 包含该参数的 `value` 字符串。
+ **有效值：**任何字符串或与模板输出`$[output_CfnOutput-Logical-ID]`变量*CfnOutput-Logical-ID*对应的变量。有关 CloudFormation 模板中 “输出” 部分的更多信息，请参阅*CloudFormation 用户指南*中的[https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/outputs-section-structure.html](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)。
+ **必需**：否 

例如，以下代码片段将模板 `VPCID` 输出变量存储到名为 `/org/member/audit/vpc_id` 的 SSM 参数键中。

```
export_outputs: # List of SSM parameters
  - name: /org/member/audit/VPC-ID
    value: $[output_VPCID]
```

**注意**  
**export\$1outputs** 键名称可能包含一个 `output` 以外的值。例如，如果 **name** 为 `/org/environment-name`，**value** 可能为 `production`。

**区域** — cfcT 将在其中部署 CloudFormation 堆栈实例的区域列表。
+ **类型：**任何 AWS 商业区域名称列表，表示此资源将部署到给定的区域列表中。如果清单文件中不存在此关键字，则资源将仅部署在主区域中。
+ **必需**：否 

# 根 OU
<a name="cfct-root-ou"></a>

 在 **V2 版本的清单文件（2021-03-15）**中，CfCT 支持将**根**作为 `organizational_units` 下组织单元（OU）的值。
+ 如果您选择`scp`或的部署方法，则当您在下添加根时 `rcp``organizational_units`，AWS Control Tower 会将策略应用于根 OUs 下的所有策略。如果您选择的部署方法是 `stack_set`，则在 `organizational_units` 下添加根时，CfCT 会在该根下注册 AWS Control Tower 的所有账户中部署堆栈集，但管理账户除外。
+ 根据 AWS Control Tower 最佳实践，管理账户仅用于管理成员账户和账单。请勿在 AWS Control Tower 管理账户中运行生产工作负载。

  根据最佳实践指南，AWS Control Tower 部署将管理账户置于根 OU 下，这样它就具有完全访问权限并且不会运行其他资源。因此，该**AWSControlTowerExecution**角色未部署到管理账户。
+ 我们建议您遵循这些管理账户的最佳实践。如果您有需要在管理账户中部署堆栈集的特定使用案例，请将**账户**添加为部署目标并指定管理账户。否则，请勿将**账户**添加为部署目标。您必须在管理账户中创建缺失的资源，包括所需的 IAM 角色。

要在管理账户中部署堆栈集，请将 `accounts` 添加为部署目标并指定管理账户。否则，请勿将账户添加为部署目标。

```
---
region: your-home-region
version: 2021-03-15

resources:

  …truncated…

    deployment_targets:
      organizational_units:
        - Root
```

**注意**  
只有 V2 版本的清单文件（2021-03-15）支持根 OU 功能。如果您将 **Root** 添加为下的 OU`organizational_units`，请不要添加任何其他 OU OUs。

# 嵌套 OU
<a name="cfct-nested-ou"></a>

cfcT 支持在清单 V2 版本 (2021-03-15) 中列出嵌套在`organizational_units`关键字 OUs 下的一个或多个嵌套内容。

需要嵌套 OU 的完整路径（不包括 Root），使用冒号作为分隔符 OUs。对于部署方法`scp`或`rcp`，AWS Control Tower 会 RCPs 将 SCPs 或部署到嵌套 OU 路径中的最后一个 OU。对于部署方法 `stack_set`，AWS Control Tower 将堆栈集部署到嵌套 OU 路径中最后一个 OU 下的所有账户。

例如，请考虑路径 `OUName1:OUName2:OUName3`。该路径中的最后一个 OU 是 `OUName3`。CfcT 仅 RCPs 将 SCPs 或集`OUName3`和堆栈集部署到所有直接下属`OUName3`的账户。

```
---
region: your-home-region
version: 2021-03-15

resources:

  …truncated…

    deployment_targets:
      organizational_units:
        - OuName1:OUName2:OUName3
```

**注意**  
只有 V2 版本的清单文件（2021-03-15）支持嵌套 OU 功能。

# 构建您自己的自定义
<a name="cfcn-byo-customizations"></a>

要构建自己的自定义项，您可以通过添加或更新服务控制策略 (SCPs)、资源控制策略 (RCPs) 和 CloudFormation 资源来修改 cfcT `manifest.yaml` 文件。对于必须部署的资源，您可以添加或删除帐户和 OUs。您可以添加或修改包文件夹中的模板，创建自己的文件夹，并引用 `manifest.yaml` 文件中的模板或文件夹。

本部分介绍构建自己的自定义的两个主要部分：
+ 如何为服务控制策略设置自己的配置包
+ 如何为堆 AWS CloudFormation 栈集设置自己的配置包

# 为 SCPs 或设置配置包 RCPs
<a name="cfcn-set-up-custom-scps"></a>

本节介绍如何为服务控制策略 (SCPs) 或资源控制策略 (RCPs) 创建配置包。此过程的两个主要部分是（1）准备 CfCT 清单文件，以及（2）准备您的文件夹结构。

## 步骤 1：编辑 manifest.yaml 文件
<a name="cfct-byo-scp-step-1"></a>

使用示例 `manifest.yaml` 文件作为起点。输入所有必要的配置。添加 `resource_file` 和 `deployment_targets` 详细信息。

以下代码段显示了默认清单文件。

```
---
region: us-east-1
version: 2021-03-15

resources: []
```

`region` 的值将在部署期间自动添加。它必须与您在其中部署 CfCT 的区域匹配。此区域必须与 AWS Control Tower 区域相同。

要在 Amazon S3 存储桶中存储的 zip 包中的 `example-configuration` 文件夹中添加自定义 SCP 或 RCP，请打开 `example-manifest.yaml` 文件并开始编辑。

```
---
region: your-home-region
version: 2021-03-15

resources:
  - name: test-preventive-controls
    description: To prevent from deleting or disabling resources in member accounts
    resource_file: policies/preventive-controls.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
      organizational_units: #array of strings
        - OUName1
        - OUName2 

…truncated…
```

以下代码段显示了示例自定义清单文件。您可以通过一次更改添加多个策略。

```
---
region: us-east-1
version: 2021-03-15

resources:
  - name: block-s3-public-access
    description: To S3 buckets to have public access
    resource_file: policies/block-s3-public.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
      organizational_units: #array of strings
        - OUName1
        - OUName2
```

## 步骤 2：创建文件夹结构
<a name="cfct-byo-scp-step-2"></a>

如果您使用的是 Amazon S3 URL 作为资源文件并使用 key/value 成对的**参数**，则可以跳过此步骤。

您必须包含 JSON 格式的 SCP 策略或 RCP 策略才能支持清单文件，因为清单文件会引用 JSON 文件。确保文件路径与清单文件中提供的路径信息相匹配。
+ *策略* JSON 文件包含 RCPs 要部署到的 SCPs 或 OUs。

以下代码段显示了示例清单文件的文件夹结构。

```
- manifest.yaml
- policies/
   - block-s3-public.json
```

以下代码段是示例 `block-s3-public.json` 策略文件。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"GuardPutAccountPublicAccessBlock",
         "Effect":"Deny",
         "Action":"s3:PutAccountPublicAccessBlock",
         "Resource":"arn:aws:s3:::*"
      }
   ]
}
```

------

# 为以下各项设置配置包 CloudFormation StackSets
<a name="cfcn-byo-cfn-stacksets"></a>

本节介绍如何为设置配置包 CloudFormation StackSets。此过程的两个主要部分是（1）准备清单文件，以及（2）更新文件夹结构。

## 步骤 1：编辑现有清单文件
<a name="cfcn-byo-cfn-stacksets-step-1"></a>

将新 CloudFormation StackSets 信息添加到您之前编辑的清单文件中。

为了便于查看，以下代码段包含的自定义清单文件与之前为 SCPs 或 RCPs设置配置包时显示的相同。现在，您可以进一步编辑此文件，以包含有关您的资源的详细信息。

```
---
region: us-east-1
version: 2021-03-15

resources:
  
  - name: block-s3-public-access
    description: To S3 buckets to have public access
    resource_file: policies/block-s3-public.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
    organizational_units: #array of strings
    - OUName1
    - OUName2
```

以下代码段显示了包含 `resources` 详细信息的经编辑的示例清单文件。`resources` 的顺序决定了创建 `resources` 依赖关系的执行顺序。您可以根据业务需求编辑以下示例清单文件。

```
---
region: your-home-region
version: 2021-03-15

…truncated…

resources:
  - name: stackset-1
    resource_file: templates/create-ssm-parameter-keys-1.template
    parameters:
      - parameter_key: parameter-1
        parameter_value: value-1
    deploy_method: stack_set
    deployment_targets:
      accounts: # array of strings, [0-9]{12}
        - account number or account name
        - 123456789123
      organizational_units: #array of strings, ou ids, ou-xxxx
        - OuName1
        - OUName2 
    export_outputs:
      - name: /org/member/test-ssm/app-id
        value: $[output_ApplicationId]
    regions:
      - region-name

  - name: stackset-2
    resource_file: s3://bucket-name/key-name
    parameters:
      - parameter_key: parameter-1
        parameter_value: value-1
    deploy_method: stack_set
    deployment_targets:
      accounts: # array of strings, [0-9]{12}
        - account number or account name
        - 123456789123
      organizational_units: #array of strings
        - OuName1
        - OUName2 
regions:
  - region-name
```

以下示例显示您可以在清单文件中添加多个 CloudFormation 资源。

```
---
region: us-east-1
version: 2021-03-15

resources:
  - name: block-s3-public-access
    description: To S3 buckets to have public access
    resource_file: policies/block-s3-public.json
    deploy_method: scp | rcp
    #Apply to the following OU(s)
    deployment_targets:
      organizational_units: #array of strings
        - Custom
        - Sandbox

  - name: transit-network
    resource_file: templates/transit-gateway.template
    parameter_file: parameters/transit-gateway.json
    deploy_method: stack_set
    deployment_targets:
      accounts: # array of strings, [0-9]{12}
        - Prod
        - 123456789123 #Network
      organizational_units: #array of strings
        - Custom
    export_outputs:
      - name: /org/network/transit-gateway-id
        value: $[output_TransitGatewayID]
    regions:
      - us-east-1
```

## 步骤 2：更新文件夹结构
<a name="cfct-byo-cfn-stacksets-step-2"></a>

更新文件夹结构时，可以在清单文件中包含所有支持的 CloudFormation 模板文件以及 SCP 或 RCP 策略文件。验证文件路径是否与清单文件中提供的路径相匹配。
+ *模板*文件包含要部署的 AWS 资源 OUs 和帐户。
+ *policy* 文件包含模板文件中使用的输入参数。

以下示例显示了在[步骤 1](#cfcn-byo-cfn-stacksets-step-1) 中创建的示例清单文件的文件夹结构。

```
- manifest.yaml
- policies/
   - block-s3-public.json
- templates/
   - transit-gateway.template
```

# “alfred” 助手和 CloudFormation 参数文件
<a name="alfred-helper"></a>

 cfCT 为你提供了一种名为 *alfred* helper 的机制，用于获取模板中定义的 [SSM 参数存储](https://docs.aws.amazon.com//systems-manager/latest/userguide/systems-manager-parameter-store.html)密钥的值。 CloudFormation 使用 *alfred* 助手，您可以使用存储在 SSM 参数存储中的值，而无需更新模板。 CloudFormation 有关更多信息，请参阅[什么是 CloudFormation 模板？](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html#gettingstarted.templatebasics.what) 在《*CloudFormation 用户指南》*中。

**重要**  
 *alfred* 助手有两个限制。参数仅在 AWS Control Tower 管理账户的主区域中可用。作为最佳实践，可以考虑使用堆栈实例之间不会发生变化的值。当“alfred”助手检索参数时，它会从导出该变量的堆栈集中随机选择一个堆栈实例。

## 示例
<a name="w2aac28c41c15c13b7"></a>

 假设你有两个 CloudFormation 堆栈集。*堆栈集 1* 有一个堆栈实例，可部署到一个区域中的一个账户。它在可用区中创建 Amazon VPC 和子网，并且 `VPC ID` 和 `subnet ID` 必须作为参数值传递到*堆栈集 2* 中。在可将 `VPC ID` 和 `subnet ID` 传递到*堆栈集 2* 中之前，必须使用 `AWS:::SSM::Parameter` 将 `VPC ID` 和 `subnet ID` 存储在*堆栈集 1* 中。有关更多信息，请参阅《CloudFormation 用户指南》**中的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html)。

**CloudFormation 堆栈集 1：**

 在以下片段中，*alfred* 助手可以`subnet ID`从参数存储中获取`VPC ID`和的值，并将它们作为输入传递给 StackSet 状态机。

```
VpcIdParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: '/stack_1/vpc/id'
      Description: Contains the VPC id
      Type: String
      Value: !Ref MyVpc

SubnetIdParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: '/stack_1/subnet/id'
      Description: Contains the subnet id
      Type: String
      Value: !Ref MySubnet
```

**CloudFormation 堆栈集 2：**

 该片段显示了 CloudFormation stack 2 `manifest.yaml` 文件中指定的参数。

```
parameters:
      - parameter_key: VpcId
        parameter_value: $[alfred_ssm_/stack_1/vpc/id]
      - parameter_key: SubnetId
        parameter_value: $[alfred_ssm_/stack_1/subnet/id]
```

**CloudFormation 堆栈集 2.1：**

 该片段显示您可以列出`alfred_ssm`属性以支持类型*CommaDelimitedList*参数。有关更多信息，请参阅《CloudFormation 用户指南》**中的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#parameters-section-structure-properties-type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#parameters-section-structure-properties-type)。

```
parameters:
      - parameter_key: VpcId # Type: String
        parameter_value: $[alfred_ssm_/stack_1/vpc/id']
      - parameter_key: SubnetId # Type: String
        parameter_value: $[ alfred_ssm_/stack_1/subnet/id']
      - parameter_key: AvailablityZones # Type: CommaDelimitedList
        parameter_value:   - "$[alfred_ssm_/availability_zone_1]"  - "$[alfred_ssm_/availability_zone_2]"
```

**自定义包的 JSON 架构**  
cfcT 定制包的 JSON 架构位于[上的 GitHub源代码存储库](https://github.com/aws-solutions/aws-control-tower-customizations)中。您可以将该架构与许多您最喜欢的开发工具一起使用，而且您可能会发现，在构建自己的 CfCT `manifest.yaml` 文件时，该架构有助于减少错误。

# CfCT 清单的版本升级
<a name="cfct-compatibility"></a>

有关最新版本的 *AWS Control Tower 自定义项* (cfcT) 的信息，请参阅存储[`CHANGELOG.md`库中的 GitHub 文件](https://github.com/aws-solutions/aws-control-tower-customizations/blob/master/CHANGELOG.md)。

**警告**  
*AWS Control Tower 定制*版 (cfcT) 2.2.0 版引入了 cfcT 清单架构（版本 *2021-03-* 15），以与相关服务保持一致。 AWS APIs清单架构允许单个 manifest.yaml 文件通过分离的工作流程管理支持的资源（CloudFormation 模板和 RCPs）。 SCPs DevOps  
强烈建议您将 CfCT 清单架构从版本 *2020-01-01* 升级到版本 *2021-03-15* 或更高版本。  
CfCT 继续支持 `manifest.yaml` 文件的版本 *2021-03-15* 和 *2020-01-01*。无需更改现有配置。但是，版本 *2020-01-01* 已**终止支持**。我们不再为版本 *2020-01-01* 提供更新或添加增强功能。*2020-01-01* 版本不支持根 OU 和嵌套 OU 功能。

**CfCT 清单版本 *2021-03-15* 中已弃用的属性：**

```
organization_policies
policy_file
apply_to_accounts_in_ou

cloudformation_resources
template_file
deploy_to_account
deploy_to_ou
ssm_parameters
```

## 强制 CfCT 升级步骤
<a name="mandatory-upgrade-steps"></a>

升级到 CfCT 清单架构版本 *2021-03-15* 时，必须进行以下更改才能更新文件。以下各部分概述了过渡期间的强制性和建议性更改。

**组织策略**

1. **将**组织政策 RCPs **下的 SCPs 或移到新的属性资源下。**

1. 将 **policy\$1file** 属性更改为新属性 **resource\$1file**。

1. 将 **apply\$1to\$1accounts\$1in\$1ou** 属性更改为新属性 **deployment\$1targets**。OU 列表应在子属性 **organizational\$1units** 下定义。组织策略不支持子属性 **accounts**。

1. 添加一个值为 **scp** 或 **rcp** 的新属性 **deploy\$1method**。

**CloudFormation 资源**

1. **将 **cloudformation\$1resources 下的 CloudFormation 资源移到新的属性资源**下。**

1. 将 **template\$1file** 属性更改为新属性 **resource\$1file**。

1. 将 **deploy\$1to\$1ou** 属性更改为新属性 **deployment\$1targets**。OU 列表应在子属性 **organizational\$1units** 下定义。

1. 将 **deploy\$1to\$1accounts** 属性更改为新属性 **deployment\$1targets**。账户列表应在子属性 **accounts** 下定义。

1. 将 **ssm\$1parameters** 属性更改为新属性 **export\$1outputs**。

## 强烈建议的 CfCT 升级步骤
<a name="highly-recommended-upgrade-steps"></a>

**CloudFormation 参数**

1. 将 **parameter\$1file** 属性更改为新属性 **parameters**。

1. 删除 **parameter\$1file** 属性值中的文件路径。

1. 将现有参数 JSON 文件中的参数键和参数值复制到 **parameters** 属性的新格式中。这将帮助您在清单文件中管理它们。

**注意**  
CfCT 清单版本 *2021-03-15* 支持 **parameter\$1file** 属性。