

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

# 教學課程：使用 AWS CloudFormation StackSets 部署動作建立管道
<a name="tutorials-stackset-deployment"></a>

在本教學課程中，您可以使用 AWS CodePipeline 主控台建立具有部署動作的管道，以建立堆疊集和建立堆疊執行個體。當管道執行時，範本會建立堆疊集，並建立和更新部署堆疊集的執行個體。

**重要**  
在建立管道的過程中，CodePipeline 將使用客戶提供的 S3 成品儲存貯體來製作成品。（這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中，請確定 S3 成品儲存貯體由 所擁有 AWS 帳戶 ，安全且可靠。

有兩種方式可以管理堆疊集的許可：自我管理和受管 AWS IAM 角色。本教學課程提供具有自我管理許可的範例。

若要最有效地在 CodePipeline 中使用 Stacksets，您應該清楚了解 CloudFormation StackSets 背後的概念及其運作方式。請參閱*AWS CloudFormation 《 使用者指南*》中的 [StackSets 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html)。

**Topics**
+ [先決條件](#tutorials-stackset-deployment-prereq)
+ [步驟 1：上傳範例 AWS CloudFormation 範本和參數檔案](#tutorials-stackset-deployment-upload)
+ [步驟 2：建立管道](#tutorials-stackset-action-pipeline)
+ [步驟 3：檢視初始部署](#tutorials-stackset-action-initial)
+ [步驟 4：新增 CloudFormationStackInstances 動作](#tutorials-stacksets-instances)
+ [步驟 5：檢視部署的堆疊集資源](#tutorials-stacksets-view)
+ [步驟 6：更新堆疊集](#tutorials-stacksets-update)

## 先決條件
<a name="tutorials-stackset-deployment-prereq"></a>

對於堆疊集操作，您可以使用兩個不同的帳戶：管理帳戶和目標帳戶。您可以在管理員帳戶中建立堆疊集。您可以建立屬於目標帳戶中堆疊集的個別堆疊。

**使用管理員帳戶建立管理員角色**
+ 請遵循[設定堆疊集操作的基本許可](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html#stacksets-prereqs-accountsetup)中的指示。您的角色必須命名為 **`AWSCloudFormationStackSetAdministrationRole`**。

**在目標帳戶中建立服務角色**
+ 在信任管理員帳戶的目標帳戶中建立服務角色。請遵循[設定堆疊集操作的基本許可](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html#stacksets-prereqs-accountsetup)中的指示。您的角色必須命名為 **`AWSCloudFormationStackSetExecutionRole`**。

## 步驟 1：上傳範例 AWS CloudFormation 範本和參數檔案
<a name="tutorials-stackset-deployment-upload"></a>

為您的堆疊集範本和參數檔案建立來源儲存貯體。下載範例 AWS CloudFormation 範本檔案、設定參數檔案，然後在上傳至 S3 來源儲存貯體之前壓縮檔案。

**注意**  
請務必先壓縮來源檔案，再上傳至 S3 來源儲存貯體，即使唯一的來源檔案是 範本。



**建立 S3 來源儲存貯體**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 選擇**建立儲存貯體**。

1. 在**儲存貯體名稱**中，輸入儲存貯體的名稱。

   在 **區域中**，選擇您要建立管道的區域。選擇**建立儲存貯體**。

1. 建立儲存貯體後，會顯示成功橫幅。選擇 **Go to bucket details (前往儲存貯體詳細資訊)**。

1. 在 **Properties (屬性)** 標籤上，選擇 **Versioning (版本控制)**。選擇 **Enable versioning (啟用版本控制)**，然後選擇 **Save (儲存)**。

**建立 AWS CloudFormation 範本檔案**

1. 下載下列範例範本檔案，以產生堆疊集的 CloudTrail 組態：[https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSCloudtrail.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSCloudtrail.yml)。

1. 儲存檔案為 `template.yml`。

**建立 parameters.txt 檔案**

1. 建立具有部署參數的檔案。參數是您想要在執行時間更新堆疊中的值。下列範例檔案會更新堆疊集的範本參數，以啟用記錄驗證和全域事件。

   ```
   [
     {
       "ParameterKey": "EnableLogFileValidation",
       "ParameterValue": "true"
     }, 
     {
       "ParameterKey": "IncludeGlobalEvents",
       "ParameterValue": "true"
     }
   ]
   ```

1. 儲存檔案為 `parameters.txt`。

**建立 account.txt 檔案**

1. 使用您要建立執行個體的帳戶建立檔案，如下列範例檔案所示。

   ```
   [
       "111111222222","333333444444"
   ]
   ```

1. 儲存檔案為 `accounts.txt`。

**建立和上傳來源檔案**

1. 將檔案合併為單一 ZIP 檔案。您的檔案在 ZIP 檔案中看起來應該像這樣。

   ```
   template.yml
   parameters.txt
   accounts.txt
   ```

1. 將 ZIP 檔案上傳至 S3 儲存貯體。此檔案是**建立管道**精靈為 CodePipeline 中的部署動作建立的來源成品。

## 步驟 2：建立管道
<a name="tutorials-stackset-action-pipeline"></a>

在本節中，您可以採取下列動作建立管道：
+ 具有 S3 來源動作的來源階段，其中來源成品是您的範本檔案和任何支援的來源檔案。
+ 具有建立 CloudFormation 堆疊集之堆疊集部署動作的部署階段。
+ 具有 CloudFormation 堆疊執行個體部署動作的部署階段，可在目標帳戶中建立堆疊和執行個體。

**使用 CloudFormationStackSet 動作建立管道**

1. 登入 AWS 管理主控台 並開啟 CodePipeline 主控台，網址為 https：//[http://console.aws.amazon.com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

1. 在 **Welcome (歡迎)** 頁面、**Getting started (入門)** 頁面、或者 **Pipelines (管道)** 頁面上，選擇 **Create pipeline (建立管道)**。

1. 在**步驟 1：選擇建立選項**頁面的**建立選項**下，選擇**建置自訂管道**選項。選擇**下一步**。

1. 在**步驟 2：選擇管道設定**中，在**管道名稱**中輸入 **MyStackSetsPipeline**。

1. 在**管道類型**中，針對本教學課程的目的選擇 **V1**。您也可以選擇 **V2**；不過請注意，管道類型在特性和價格方面有所不同。如需詳細資訊，請參閱[管道類型](pipeline-types.md)。

1. 在**服務角色**中，選擇**新服務角色**，以允許 CodePipeline 在 IAM 中建立服務角色。

1. 在**成品存放**區中，保留預設值。
**注意**  
這不是原始碼的來源儲存貯體。這是管道的成品存放區。每個管道都需要有個別成品存放區，例如 S3 儲存貯體。當您建立或編輯管道時，您必須在管道區域中擁有一個成品儲存貯體，並在您執行動作的每個 AWS 區域中擁有一個成品儲存貯體。  
如需詳細資訊，請參閱[輸入和輸出成品](welcome-introducing-artifacts.md)及[CodePipeline 管道結構參考](reference-pipeline-structure.md)。

   選擇**下一步**。

1. 在**步驟 3：新增來源階段**頁面的**來源提供者**中，選擇 **Amazon S3**。

1. 在**儲存貯**體中，輸入您為此教學課程建立的 S3 來源儲存貯體，例如 `BucketName`。在 **S3 物件金鑰**中，輸入 ZIP 檔案的檔案路徑和檔案名稱，例如 `MyFiles.zip`。

1. 選擇**下一步**。

1. 在**步驟 4：新增建置階段**中，選擇**略過建置階段**，然後再次選擇**略過**以接受警告訊息。

   選擇**下一步**。

1. 在**步驟 5：新增測試階段**中，選擇**略過測試階段**，然後再次選擇**略過**以接受警告訊息。

   選擇**下一步**。

1. 在**步驟 6：新增部署階段**：

   1. 在**部署提供者**中，選擇**AWS CloudFormation 堆疊集**。

   1. 在**堆疊集名稱**中，輸入堆疊集的名稱。這是範本建立的堆疊集名稱。
**注意**  
請記下您的堆疊集名稱。當您將第二個 StackSets 部署動作新增至管道時，將使用它。

   1. 在**範本路徑**中，輸入上傳範本檔案的成品名稱和檔案路徑。例如，使用預設來源成品名稱 輸入下列項目`SourceArtifact`。

      ```
      SourceArtifact::template.yml
      ```

   1. 在**部署目標**中，輸入上傳帳戶檔案的成品名稱和檔案路徑。例如，使用預設來源成品名稱 輸入下列項目`SourceArtifact`。

      ```
      SourceArtifact::accounts.txt
      ```

   1. 在**部署目標 AWS 區域**中，輸入一個區域以部署初始堆疊執行個體，例如 `us-east-1`。

   1. 展開**部署選項**。在**參數**中，輸入您上傳參數檔案的成品名稱和檔案路徑。例如，使用預設來源成品名稱 輸入下列項目`SourceArtifact`。

      ```
      SourceArtifact::parameters.txt
      ```

      若要將參數輸入為常值輸入而非檔案路徑，請輸入下列內容：

      ```
      ParameterKey=EnableLogFileValidation,ParameterValue=true
      ParameterKey=IncludeGlobalEvents,ParameterValue=true
      ```

   1. 在**功能**中，選擇 CAPABILITY\$1IAM 和 CAPABILITY\$1NAMED\$1IAM。

   1. 在**許可模型**中，選擇 SELF\$1MANAGED。

   1. 在**容錯能力百分比**中，輸入 `20`。

   1. 在**最大並行百分比**中，輸入 `25`。

   1. 選擇**下一步**。

   1. 在**步驟 7：檢閱**中，選擇**建立管道**。您的管道隨即顯示。

   1. 允許您的管道執行。

## 步驟 3：檢視初始部署
<a name="tutorials-stackset-action-initial"></a>

檢視初始部署的資源和狀態。驗證部署成功建立堆疊集後，您可以將第二個動作新增至**部署**階段。

**檢視資源**

1. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

1. 在 **Pipelines (管道)** 下，選擇您的管道，然後選擇 **View (檢視)**。本圖顯示您的管道來源和部署階段。

1. 在管道的 **CloudFormationStackSet** CloudFormation 動作上選擇動作。堆疊集的範本、資源和事件會顯示在 CloudFormation 主控台中。

1. 在左側導覽面板中，選擇 **StackSets**。在清單中，選擇新的堆疊集。

1. 選擇**堆疊執行個體**索引標籤。確認您提供的每個帳戶有一個堆疊執行個體是在 us-east-1 區域中建立的。確認每個堆疊執行個體的狀態為 `CURRENT`。

## 步驟 4：新增 CloudFormationStackInstances 動作
<a name="tutorials-stacksets-instances"></a>

在管道中建立下一個動作，以允許 CloudFormation StackSets 建立剩餘的堆疊執行個體。

**在管道中建立下一個動作**

1. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

   在 **Pipelines (管道)** 下，選擇您的管道，然後選擇 **View (檢視)**。本圖顯示您的管道來源和部署階段。

1. 選擇編輯管道。管道會以**編輯**模式顯示。

1. 在**部署**階段，選擇**編輯**。

1. 在**AWS CloudFormation 堆疊集**部署動作下，選擇**新增動作群組**。

1. 在**編輯動作**頁面上，新增動作詳細資訊：

   1. 在**動作名稱**中，輸入動作的名稱。

   1. 在**動作提供者**中，選擇**AWS CloudFormation 堆疊執行個體**。

   1. 在**輸入成品**下，選擇 **SourceArtifact**。

   1. 在**堆疊集名稱**中，輸入堆疊集的名稱。這是您在第一個動作中提供的堆疊集名稱。

   1. 在**部署目標**中，輸入上傳帳戶檔案的成品名稱和檔案路徑。例如，使用預設來源成品名稱 輸入下列項目`SourceArtifact`。

      ```
      SourceArtifact::accounts.txt
      ```

   1. 在**部署目標 AWS 區域**中，輸入用於部署剩餘堆疊執行個體的區域，例如 `us-east-2`和 `eu-central-1` ，如下所示：

      ```
      us-east2, eu-central-1
      ```

   1. 在**容錯能力百分比**中，輸入 `20`。

   1. 在**最大並行百分比**中，輸入 `25`。

   1. 選擇**儲存**。

   1. .手動發佈變更。您更新的管道會在部署階段中顯示兩個動作。

## 步驟 5：檢視部署的堆疊集資源
<a name="tutorials-stacksets-view"></a>

您可以檢視堆疊集部署的資源和狀態。

**檢視資源**

1. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

1. 在**管道**下，選擇您的管道，然後選擇**檢視**。本圖顯示您的管道來源和部署階段。

1. 選擇管道中**`AWS CloudFormation Stack Instances`**動作 CloudFormation 的動作。堆疊集的範本、資源和事件會顯示在 CloudFormation 主控台中。

1. 在左側導覽面板中，選擇 **StackSets**。在清單中，選擇您的堆疊集。

1. 選擇**堆疊執行個體**索引標籤。驗證您提供的每個帳戶的所有剩餘堆疊執行個體是否已在預期區域中建立或更新。確認每個堆疊執行個體的狀態為 `CURRENT`。

## 步驟 6：更新堆疊集
<a name="tutorials-stacksets-update"></a>

對堆疊集進行更新，並將更新部署到執行個體。在此範例中，您也可以變更要指定用於更新的部署目標。不屬於更新一部分的執行個體會移至過期狀態。

1. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

1. 在**管道**下，選擇管道，然後選擇**編輯**。在**部署**階段，選擇**編輯**。

1. 選擇 在管道中編輯**AWS CloudFormation 堆疊集**動作。在**描述**中，使用堆疊集的新描述覆寫現有描述。

1. 選擇 編輯管道中的**AWS CloudFormation 堆疊執行個體**動作。在**部署目標 AWS 區域**中，刪除建立動作時輸入的`us-east-2`值。

1. 儲存變更。選擇**發行變更**以執行您的管道。

1. 在 中開啟您的動作 CloudFormation。選擇 **StackSet 資訊**索引標籤。在 **StackSet 描述**中，確認已顯示新的描述。

1. 選擇**堆疊執行個體**索引標籤。在**狀態**下，確認 us-east-2 中堆疊執行個體的狀態為 `OUTDATED`。