

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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*

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

企業通常會維護分散在多個 的多個 AWS 帳戶 ， AWS 區域 以便在工作負載之間建立強大的隔離障礙。為了保持安全與合規，其管理團隊會安裝代理程式型工具，例如用於安全性掃描的 [CrowdStrike](https://www.crowdstrike.com/falcon-platform/)、[SentinelOne](https://www.sentinelone.com/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 Agent](https://www.datadoghq.com/) 或 [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 [Simple Storage Service (Amazon S3](https://repost.aws/knowledge-center/ec2-instance-access-s3-bucket)Amazon EC2) 執行個體
+ 您組織使用 設定的登陸區域 [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html)
+ （選用） [適用於 Terraform (AFT) 的帳戶工廠](https://catalog.workshops.aws/control-tower/en-US/customization/aft)

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

**資源詳細資訊**

此模式使用 [Account Factory for Terraform (AFT) ](https://catalog.workshops.aws/control-tower/en-US/customization/aft)建立所有必要 AWS 的資源和程式碼管道，以在部署帳戶中部署資源。程式碼管道在兩個儲存庫中執行：
+ **全域自訂**包含將跨向 AFT 註冊的所有帳戶執行的 Terraform 程式碼。
+ **帳戶自訂**包含將在部署帳戶中執行的 Terraform 程式碼。

您也可以在帳戶自訂資料夾中執行 [Terraform](https://developer.hashicorp.com/terraform/intro) 命令，在不使用 AFT 的情況下部署此解決方案。

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 bucket (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_tw/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. 在成員帳戶中，自動化會將部署命令傳送至 Distributor。

1. Distributor 會將軟體套件分散到各個執行個體。

此解決方案使用 內的管理帳戶 AWS Organizations，但您也可以指定 帳戶 （委派管理員） 來代表組織管理此帳戶。

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

**AWS 服務**
+ [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 雲端。它可簡化應用程式和資源管理、縮短偵測和解決操作問題的時間，並協助您大規模安全地管理 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/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。

**程式碼儲存庫**

此模式的說明和程式碼可在 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/prescriptive-guidance/latest/patterns/centralize-software-package-distribution-in-aws-organizations-by-using-terraform.html) | DevOps 工程師 | 

### 自訂參數和部署檔案
<a name="customize-parameters-and-deployment-files"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 更新狀態管理員關聯的輸入參數。 | 更新 `account-customization/association.tf` 檔案中的下列輸入參數，以定義您想要在執行個體上維護的狀態。如果預設參數值支援您的使用案例，您可以使用這些參數值。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 初始化 Terraform 組態。 | 若要使用 AFT 自動部署解決方案，請將程式碼推送至 AWS CodeCommit：<pre>$ git add *<br />$ git commit -m "message"<br />$ git push</pre><br />您也可以從 `account-customization` 資料夾執行 Terraform 命令，在不使用 AFT 的情況下部署此解決方案。若要初始化包含 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證 SSM 文件的建立。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/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>


| 問題 | 解決方案 | 
| --- | --- | 
| 狀態管理員關聯失敗或停滯在待定狀態。 | 請參閱 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 儲存庫）
+ [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 文件）