

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

# 使用 Terraform 在 AWS Organizations 中集中分发软件包
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform"></a>

*Pradip kumar Pandey、Chintamani Aphale、T.V.R.L.Phani Kumar Dadi、Pratap Kumar Nanda、Aarti Rajput 和 Mayuri Shinde，Amazon Web Services*

## Summary
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-summary"></a>

为了 AWS 区域 在工作负载之间建立强大的隔离屏障 AWS 账户 ，企业通常会维护多个分散在多个工作负载中的多个分布。为了保持安全和合规，他们的管理团队安装了基于代理的工具，例如[CrowdStrike[SentinelOne](https://www.sentinelone.com/platform/)](https://www.crowdstrike.com/falcon-platform/)、或用于安全扫描的[TrendMicro](https://www.trendmicro.com/en_sg/business.html)工具，以及用于监控的 [Amazon CloudWatch 代理](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)、[Datadog Agen](https://www.datadoghq.com/) t 或代[AppDynamics 理](https://www.appdynamics.com/product/how-it-works/agents-and-controller)。当这些团队想要在这个广阔的环境中以集中方式自动完成软件包管理和分发时，他们通常会面临挑战。

[Distributor](https://docs.aws.amazon.com/systems-manager/latest/userguide/distributor.html) 是 [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 的一项功能，它通过单一简化界面，自动将软件打包和发布到云端和本地服务器上的托管 Microsoft Windows 和 Linux 实例。此模式演示了如何使用 Terraform 进一步简化管理软件安装的过程，并以最少的努力在大量实例和成员帐户中 AWS Organizations 运行脚本。

此解决方案适用于由 Systems Manager 管理的 Amazon、Linux 和 Windows 实例。

## 先决条件和限制
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-prereqs"></a>
+ 包含待安装软件的 [Distributor 软件包](https://docs.aws.amazon.com/systems-manager/latest/userguide/distributor-working-with-packages-create.html)
+ [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) 版本 0.15.0 或更高版本
+ [由 Systems Manager 管理](https://docs.aws.amazon.com/systems-manager/latest/userguide/managed_instances.html)并具有[访问目标账户中的亚马逊简单存储服务 (Amazon S3 EC2) 的基本权限的亚马逊弹性计算云 (Amazon S3](https://repost.aws/knowledge-center/ec2-instance-access-s3-bucket)) 实例
+ 通过使用 [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html) 为贵组织设置的登录区
+ （可选）[Account Factory for Terraform（AFT）](https://catalog.workshops.aws/control-tower/en-US/customization/aft)

## 架构
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-architecture"></a>

**资源详细信息**

此模式使用 Account F [actory for Terraform (AFT) 创建所有必需的 AWS 资源，并使用代码管道在部署账户](https://catalog.workshops.aws/control-tower/en-US/customization/aft)中部署资源。该代码管道在两个存储库中运行：
+ **全局自定义**包含 Terraform 代码，该代码将在所有注册了 AFT 的账户中运行。
+ **账户自定义**包含将在部署账户中运行的 Terraform 代码。

您也可以在不使用 AFT 的情况下部署此解决方案，方法是在账户自定义文件夹中运行 [Terraform](https://developer.hashicorp.com/terraform/intro) 命令。

Terraform 代码部署了以下资源：
+ AWS Identity and Access Management (IAM) 角色和策略
  + [SystemsManager-AutomationExecutionRole](https://docs.aws.amazon.com/systems-manager/latest/userguide/running-automations-multiple-accounts-regions.html) 授予用户在目标账户中运行自动化的权限。
  + [SystemsManager-AutomationAdministrationRole](https://docs.aws.amazon.com/systems-manager/latest/userguide/running-automations-multiple-accounts-regions.html) 授予用户在多个账户和组织单位中运行自动化的权限（OUs）。
+ 软件包的压缩文件和 manifest.json
  + 在 Systems Manager 中，[软件包](https://docs.aws.amazon.com/systems-manager/latest/userguide/distributor-working-with-packages-create.html)至少包含一个软件或可安装资产 .zip 文件。
  + JSON 清单包含指向软件包代码文件的指针。
+ S3 存储桶
  + 在整个组织中共享的分布式程序包安全地存储在 Amazon S3 存储桶中。
+ AWS Systems Manager 文档（SSM 文档）
  + `DistributeSoftwarePackage` 包含将软件包分发到成员账户中每个目标实例的逻辑。
  + `AddSoftwarePackageToDistributor`包含打包可安装软件资产并将其添加到 Automation 的逻辑，该功能为 AWS Systems Manager。
+ Systems Manager 关联
  + Systems Manager 关联用于部署解决方案。

**架构和工作流**

![在 AWS Organizations 中集中分发软件包的架构图](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/da584449-e12b-4878-a61d-00d8cea3d3d7/images/2718f2c4-f816-4e34-89b8-8182c128e6db.png)


下图说明了以下步骤：

1. 要从集中式账户运行解决方案，您需要将软件包或软件与部署步骤一起上传到 S3 存储桶。

1. 您的自定义包将显示在 Systems Manager 控制台[文档](https://ap-southeast-2.console.aws.amazon.com/systems-manager/documents?region=ap-southeast-2)部分的**我拥有**选项卡中。

1. State Manager 是 Systems Manager 的一项功能，用于在整个组织中创建、安排和运行软件包的关联。该关联规定，软件包必须先在托管式节点上安装并运行，然后才能安装到目标节点上。

1. 该关联指示 Systems Manager 在目标节点上安装软件包。

1. 对于后续的任何安装或更改，用户可以定期或从单个位置手动运行相同的关联，以跨账户执行部署。

1. 在成员账户中，Automation 会向 Distributor 发送部署命令。

1. Distributor 跨实例分发软件包。

此解决方案使用其中的管理帐户 AWS Organizations，但您也可以指定一个帐户（委托管理员）来代表组织对其进行管理。

## 工具
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-tools"></a>

**Amazon Web Services**
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。此模式使用 Amazon S3 集中并安全地存储分发式程序包。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 可帮助您管理在 AWS Cloud端运行的应用程序和基础设施。它简化了应用程序和资源管理，缩短了检测和解决操作问题的时间，并帮助您大规模安全地管理 AWS 资源。此模式使用了 Systems Manager 的以下功能：
  + [Distributor](https://docs.aws.amazon.com/systems-manager/latest/userguide/distributor.html) 可以帮助您打包软件并将其发布到 Systems Manager 托管实例。
  + [自动化](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-automation.html)简化了许多 AWS 服务的常见维护、部署和补救任务。
  + [文档](https://docs.aws.amazon.com/systems-manager/latest/userguide/documents.html)在您的组织和账户中对您的 Systems Manager 托管实例执行操作。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)是一项账户管理服务，可帮助您将多个 AWS 账户整合到一个由您创建和集中管理的组织中。

**其他工具**
+ [Terraform](https://www.terraform.io/) 是一款基础设施即代码 (IaC) 工具 HashiCorp ，可帮助您创建和管理云和本地资源。

**代码存储库**

此模式的说明和代码可在 GitHub [集中式包分发](https://github.com/aws-samples/aws-organization-centralised-package-distribution)存储库中找到。

## 最佳实践
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-best-practices"></a>
+ 要向关联分配标签，请使用 [AWS Command Line Interface （AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 或 [AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-welcome.html)。不支持使用 Systems Manager 控制台将标签添加到关联。有关更多信息，请参阅 Systems Manager 文档中的[标记 Systems Manager 资源](https://docs.aws.amazon.com/systems-manager/latest/userguide/tagging-resources.html)。
+ 要使用共享自另一个账户的文档的新版本来运行关联，将文档版本设置为 `default`。
+ 要仅为目标节点添加标签，请使用一个标签键。如果要使用多个标签键将您的节点设为目标，请使用资源组选项。

## 操作说明
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-epics"></a>

### 配置源文件和账户
<a name="configure-source-files-and-accounts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 
| 更新全局变量。 | 在 `global-customization/variables.tf` 文件中更新以下输入参数。这些变量适用于 AFT 创建和管理的所有账户。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 
| 更新账户变量。 | 在 `account-customization/variables.tf` 文件中更新以下输入参数。这些变量仅适用于由 AFT 创建和管理的特定账户。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 

### 自定义参数和部署文件
<a name="customize-parameters-and-deployment-files"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 更新 State Manager 关联的输入参数。 | 更新 `account-customization/association.tf` 文件中的以下输入参数，以定义要在实例上保持的状态。如果默认参数值支持您的使用案例，您可以使用默认参数值。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 
| 准备软件包的压缩文件和 `manifest.json` 文件。 | 此模式在文件夹中提供了带有 PowerShell 安装和卸载脚本的可安装文件示例（Windows 为.msi，Linux 为.rpm）。`account-customization/package`[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 

### 运行 Terraform 命令预调配资源
<a name="run-terraform-commands-to-provision-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 初始化 Terraform 配置。 | 要使用 AFT 自动部署解决方案，请将代码推送到 AWS CodeCommit：<pre>$ git add *<br />$ git commit -m "message"<br />$ git push</pre><br />您也可以在不使用 AFT 的情况下通过从 `account-customization` 文件夹中运行 Terraform 命令来部署此解决方案。要初始化包含 Terraform 文件的工作目录，请运行以下命令：<pre>$ terraform init</pre> | DevOps 工程师 | 
| 预览更改。 | 要预览 Terraform 将对基础设施所做的更改，请运行以下命令：<pre>$ terraform plan</pre><br />此命令评估 Terraform 配置，以确定已声明的资源的所需状态。它还将所需状态与要在工作区中预调配的实际基础设施进行比较。 | DevOps 工程师 | 
| 应用更改。 | 运行以下命令以实现您对 `variables.tf` 文件所做的更改：<pre>$ terraform apply</pre> | DevOps 工程师 | 

### 验证资源
<a name="validate-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证 SSM 文档创建。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html)您应看到 `DistributeSoftwarePackage` 和 `AddSoftwarePackageToDistributor` 软件包。 | DevOps 工程师 | 
| 验证自动化部署成功。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 
| 验证软件包已部署到目标成员账户实例。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程师 | 

## 问题排查
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| State Manager 关联失败或停留在待处理状态。 | 请参阅 AWS 知识中心中的[疑难解答信息](https://repost.aws/knowledge-center/ssm-state-manager-association-fail)。 | 
| 计划关联无法运行。 | 您的日程安排可能无效。State Manager 目前不支持在 cron 表达式中为关联指定月数。使用 [cron 或 rate 表达式](https://docs.aws.amazon.com/systems-manager/latest/userguide/reference-cron-and-rate-expressions.html)来确认计划。 | 

## 相关资源
<a name="centralize-software-package-distribution-in-aws-organizations-by-using-terraform-resources"></a>
+ [集中式软件包分发](https://github.com/aws-samples/aws-organization-centralised-package-distribution)（GitHub 存储库）
+ [Account Factory for Terraform (AFT)](https://catalog.workshops.aws/control-tower/en-US/customization/aft)
+ [用例和最佳实践](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-best-practices.html)（AWS Systems Manager 文档）