

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

# 教學課程：建立使用 AWS CloudFormation 部署動作變數的管道
<a name="tutorials-cloudformation-action"></a>

在本教學課程中，您會使用 AWS CodePipeline 主控台建立具有部署動作的管道。管道執行時，此範本會建立堆疊，並建立 `outputs` 檔案。堆疊範本產生的輸出是 CodePipeline 中 AWS CloudFormation 動作產生的變數。

在從範本建立堆疊的動作中，您可以指定變數命名空間。然後，該 `outputs` 檔案產生的變數可以被後續動作使用。在此範例中，您會根據 AWS CloudFormation 動作產生的`StackName`變數建立變更集。手動核准之後，您執行變更集，然後建立根據 `StackName` 變數刪除堆疊的刪除堆疊動作。

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

**Topics**
+ [先決條件：建立 AWS CloudFormation 服務角色和 CodeCommit 儲存庫](#tutorials-cloudformation-action-prereq)
+ [步驟 1：下載、編輯和上傳範例 AWS CloudFormation 範本](#tutorials-cloudformation-action-upload)
+ [步驟 2：建立管道](#tutorials-cloudformation-action-pipeline)
+ [步驟 3：新增 CloudFormation 部署動作以建立變更集](#tutorials-cloudformation-action-changeset)
+ [步驟 4：新增手動核准動作](#tutorials-cloudformation-action-approval)
+ [步驟 5：新增 CloudFormation 部署動作以執行變更集](#tutorials-cloudformation-action-deployment)
+ [步驟 6：新增 CloudFormation 部署動作以刪除堆疊](#tutorials-cloudformation-action-delete)

## 先決條件：建立 AWS CloudFormation 服務角色和 CodeCommit 儲存庫
<a name="tutorials-cloudformation-action-prereq"></a>

您必須已擁有下列各項目：
+ CodeCommit 儲存庫。您可以使用您在 中建立的 AWS CodeCommit 儲存庫[教學課程：建立簡單的管道 (CodeCommit 儲存庫）](tutorials-simple-codecommit.md)。
+ 此範例會從範本建立 Amazon DocumentDB 堆疊。您必須使用 AWS Identity and Access Management (IAM) 來建立具有下列 Amazon DocumentDB 許可 AWS CloudFormation 的服務角色。

  ```
  "rds:DescribeDBClusters",
  "rds:CreateDBCluster",
  "rds:DeleteDBCluster",
  "rds:CreateDBInstance"
  ```

## 步驟 1：下載、編輯和上傳範例 AWS CloudFormation 範本
<a name="tutorials-cloudformation-action-upload"></a>

下載範例 AWS CloudFormation 範本檔案，並將其上傳至 CodeCommit 儲存庫。

1. 導覽至您 區域的範例範本。例如，使用 的 資料表[https://docs.aws.amazon.com/documentdb/latest/developerguide/quick_start_cfn.html#quick_start_cfn-launch_stack](https://docs.aws.amazon.com/documentdb/latest/developerguide/quick_start_cfn.html#quick_start_cfn-launch_stack)來選擇區域並下載範本。下載 Amazon DocumentDB 叢集的 範本。檔案名稱為 `documentdb_full_stack.yaml`。

1. 將 `documentdb_full_stack.yaml` 檔案解壓縮，然後在文字編輯器中開啟檔案。進行下列變更：

   1. 在此範例中，將下列 `Purpose:` 參數新增至範本中的 `Parameters` 區段。

      ```
        Purpose:
          Type: String
          Default: testing
          AllowedValues:
            - testing
            - production
          Description: The purpose of this instance.
      ```

   1. 在此範例中，將下列 `StackName` 輸出新增至範本中的 `Outputs:` 區段。

      ```
        StackName:
          Value: !Ref AWS::StackName
      ```

1. 將範本檔案上傳至您的 AWS CodeCommit 儲存庫。您必須將解壓縮和編輯過的範本檔案上傳至儲存庫的根目錄。

   若要使用 CodeCommit 主控台上傳您的檔案：

   1. 開啟 CodeCommit 主控台，然後從儲存庫清單中選擇您的**儲存庫**。

   1. 選擇 **Add file (新增檔案)**，然後選擇 **Upload file (上傳檔案)**。

   1. 選取 **Choose file (選擇檔案)**，然後瀏覽您的檔案。輸入您的使用者名稱和電子郵件地址來確定變更。選擇 **Commit changes (遞交變更)**。

   您的檔案在儲存庫的根層級看起來應該像這樣：

   ```
   documentdb_full_stack.yaml
   ```

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

在本節中，您可以採取下列動作建立管道：
+ 具有 CodeCommit 動作的來源階段，其中來源成品是您的範本檔案。
+ 具有 部署動作的 CloudFormation 部署階段。

系統會為精靈所建立的來源和部署階段中每個動作指派變數命名空間，分別是 `SourceVariables` 和 `DeployVariables`。由於動作已指派命名空間，因此在此範例中設定的變數可供下游動作使用。如需詳細資訊，請參閱[變數參考](reference-variables.md)。

**使用精靈建立管道**

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：選擇管道設定**中，在**管道名稱**中輸入 **MyCFNDeployPipeline**。

1. CodePipeline 提供 V1 和 V2 類型的管道，其特性和價格有所不同。V2 類型是您可以在 主控台中選擇的唯一類型。如需詳細資訊，請參閱[管道類型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。如需 CodePipeline 定價的資訊，請參閱 [定價](https://aws.amazon.com/codepipeline/pricing/)。

1. 在 **Service role (服務角色)** 中，執行下列其中一項作業：
   + 選擇**新服務角色**，以允許 CodePipeline 在 IAM 中建立服務角色。
   + 選擇 **Existing service role (現有服務角色)**。在 **Role name (角色名稱)** 中，從清單選擇您的服務角色。

1. 在 **Artifact store (成品存放區)** 中：

   1. 針對您為管道選取的區域中的管道，選擇**預設位置**以使用預設成品存放區，例如指定為預設的 Amazon S3 成品儲存貯體。

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

   選擇**下一步**。

1. 在**步驟 3：新增來源階段**：

   1. 在 **Source provider (來源提供者)** 中選擇 **AWS CodeCommit**。

   1. 在**儲存庫名稱**中，選擇您在 中建立的 CodeCommit 儲存庫名稱[步驟 1：建立 CodeCommit 儲存庫](tutorials-simple-codecommit.md#codecommit-create-repository)。

   1. 在 **Branch name (分支名稱)** 中，選擇包含最新程式碼更新的分支名稱。

   選取儲存庫名稱和分支之後，即會顯示要為此管道建立的 Amazon CloudWatch Events 規則。

   選擇**下一步**。

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

   選擇**下一步**。

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

   選擇**下一步**。

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

   1. 在 **Action name (動作名稱)** 中，選擇 **Deploy (部署)**。在 **Deploy provider (部署提供者)** 中，選擇 **CloudFormation**。

   1. 在 **Action mode (動作模式)** 中，選擇 **Create or update a stack (建立或更新堆疊)**。

   1. 在 **Stack name (堆疊名稱)** 中，輸入堆疊的名稱。這是範本將建立的堆疊名稱。

   1. 在 **Output file name (輸出檔案名稱)** 中，輸入輸出檔案的名稱，例如 **outputs**。這是在建立堆疊後由此動作建立的檔案名稱。

   1. 展開 **Advanced (進階)**。在 **Parameter overrides (參數覆寫)** 下，輸入範本覆寫作為索引鍵/值組。例如，此範本需要下列覆寫。

      ```
      {
      "DBClusterName": "MyDBCluster",
      "DBInstanceName": "MyDBInstance",
      "MasterUser": "UserName",
      "MasterPassword": "Password",
      "DBInstanceClass": "db.r4.large",
      "Purpose": "testing"}
      ```

      如果您未輸入覆寫，範本會建立具有預設值的堆疊。

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

   1. 在**步驟 7：檢閱**中，選擇**建立管道**。您應該會看到顯示管道階段的圖表。允許您的管道執行。您的兩階段管道已完成，並準備好新增其他階段。

## 步驟 3：新增 CloudFormation 部署動作以建立變更集
<a name="tutorials-cloudformation-action-changeset"></a>

在管道中建立下一個動作， CloudFormation 允許 在手動核准動作之前建立變更集。



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

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

1. 選擇編輯管道，或繼續在 **Edit (編輯)** 模式中顯示管道。

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

1. 新增部署動作，為在上一個動作中建立的堆疊建立變更集。您可以在階段中的現有動作之後新增此動作。

   1. 在 **​Action name (動作名稱)** 中，輸入 **Change\$1Set**。在**動作提供者**中，選擇**AWS CloudFormation **。

   1. 在 **Input artifact (輸入成品)** 中，選擇 **SourceArtifact**。

   1. 在 **Action mode (動作模式)** 中，選擇 **Create or replace a change set (建立或取代變更集)**。

   1. 在 **Stack name (堆疊名稱)** 中，輸入變數語法，如下所示。這是堆疊名稱，變更集是為此堆疊而建立，其中預設命名空間 `DeployVariables` 已指派給該動作。

      ```
      #{DeployVariables.StackName}
      ```

   1. 在 **Change set name (變更集名稱)** 中，輸入變更集的名稱。

      ```
      my-changeset
      ```

   1. 在 **Parameter Overrides (參數覆寫)** 中，將 `Purpose` 參數從 `testing` 變更為 `production`。

      ```
      {
      "DBClusterName": "MyDBCluster",
      "DBInstanceName": "MyDBInstance",
      "MasterUser": "UserName",
      "MasterPassword": "Password",
      "DBInstanceClass": "db.r4.large",
      "Purpose": "production"}
      ```

   1. 選擇 **Done (完成)** 以儲存動作。

## 步驟 4：新增手動核准動作
<a name="tutorials-cloudformation-action-approval"></a>

在管道中建立手動核准動作。



1. 選擇編輯管道，或繼續在 **Edit (編輯)** 模式中顯示管道。

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

1. 在建立變更集的部署動作之後新增手動核准動作。此動作可讓您在管道執行變更集 CloudFormation 之前，先驗證 中建立的資源變更集。

## 步驟 5：新增 CloudFormation 部署動作以執行變更集
<a name="tutorials-cloudformation-action-deployment"></a>

在管道中建立下一個動作， CloudFormation 允許 在手動核准動作之後執行變更集。



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

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

1. 選擇編輯管道，或繼續在 **Edit (編輯)** 模式中顯示管道。

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

1. 新增部署動作，以執行先前手動動作中核准的變更集：

   1. 在 **Action name (動作名稱)** 中，輸入 **Execute\$1Change\$1Set**。在**動作提供者**中，選擇 **AWS CloudFormation**。

   1. 在 **Input artifact (輸入成品)** 中，選擇 **SourceArtifact**。

   1. 在 **Action mode (動作模式)** 中，選擇 **Execute a change set (執行變更組合)**。

   1. 在 **Stack name (堆疊名稱)** 中，輸入變數語法，如下所示。這是堆疊名稱，變更集是為此堆疊而建立。

      ```
      #{DeployVariables.StackName}
      ```

   1. 在 **Change set name (變更集名稱)** 中，輸入您在上一個動作中建立的變更集名稱。

      ```
      my-changeset
      ```

   1. 選擇 **Done (完成)** 以儲存動作。

   1. 繼續管道執行。

## 步驟 6：新增 CloudFormation 部署動作以刪除堆疊
<a name="tutorials-cloudformation-action-delete"></a>

在管道中建立最終動作， CloudFormation 允許 從輸出檔案中的 變數取得堆疊名稱，並刪除堆疊。



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

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

1. 選擇編輯管道。

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

1. 新增將刪除堆疊的部署動作：

   1. 在 **Action name (動作名稱)** 中，選擇 **DeleteStack**。在 **Deploy provider (部署提供者)** 中，選擇 **CloudFormation**。

   1. 在 **Action mode (動作模式)** 中，選擇 **Delete a stack (刪除堆疊)**。

   1. 在 **Stack name (堆疊名稱)** 中，輸入變數語法，如下所示。這是動作將刪除的堆疊名稱。

   1. 選擇 **Done (完成)** 以儲存動作。

   1. 選擇 **Save (儲存)** 以儲存管道。

   管道會在儲存時執行。