

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

# 逐步解說：建置管線以用於測試和生產堆疊
<a name="continuous-delivery-codepipeline-basic-walkthrough"></a>

試想您提交 CloudFormation 範本的發行程序，然後 CloudFormation 會使用它來自動建置測試堆疊。檢閱測試堆疊後，您可以預覽您的變更將如何修改您的生產堆疊，然後選擇是否要實作。為達成此工作流程，您可以使用 CloudFormation 建置您的測試堆疊、刪除測試堆疊、建立變更集，然後執行變更集。不過，每個動作您都必須手動與 CloudFormation 互動。在此逐步教學中，我們將建置 CodePipeline 管道，它可自動化許多這些動作，協助您以 CloudFormation 堆疊達成持續交付工作流程。

## 先決條件
<a name="w2aac21c11b5"></a>

本演練假設您已使用 CodePipeline 和 CloudFormation，並了解管道、 AWS CloudFormation 範本和堆疊的運作方式。如需有關 CodePipeline 的詳細資訊，請見《AWS CodePipeline 使用者指南》[https://docs.aws.amazon.com/codepipeline/latest/userguide/](https://docs.aws.amazon.com/codepipeline/latest/userguide/)。您也需要在建立管道的相同 中擁有 Amazon S3 AWS 區域 儲存貯體。

**重要**  
範例 WordPress 範本建立 EC2 執行個體，它需要網際網路連線。確認您有允許將流量傳送至網際網路的預設 VPC 和子網路。

## 逐步解說概觀
<a name="w2aac21c11b7"></a>

此逐步解說為堆疊中的範例 WordPress 網站建置一個管道。此管道分為三個階段。每個階段皆必須至少包含一個動作，它是管道在您的成品 (您的輸入) 上執行的任務。階段會組織管道中的動作。在階段處理新的成品之前，CodePipeline 必須完成階段中的所有動作，例如，如果您提交新的輸入以重新執行管道。

在此逐步教學結束時，您將擁有可執行以下工作流程的管道：

1. 管道的第一個階段會從儲存庫其擷取來源成品 (CloudFormation 範本及其組態檔案)。

   您將準備成品，其中包含範例 WordPress 範本，並將它上傳至 S3 儲存貯體。

1. 在第二個階段，管道會建立測試堆疊，然後等待您的核准。

   在您檢閱測試堆疊之後，可選擇繼續使用原始管道或建立並提交另一個成品來進行變更。如果您核准，此階段將會刪除測試堆疊，然後管道將持續至下一個階段。

1. 在第三個階段，管道會針對生產堆疊建立變更集，然後等待您的核准。

   在您初次執行時，不會有生產堆疊。變更集向您顯示 CloudFormation 將建立的所有資源。如果您核准，此階段將執行變更集並建置您的生產堆疊。

**注意**  
CloudFormation 是免費服務。不過，您需要按每個 的目前費率支付堆疊中包含 AWS 的資源費用，例如 EC2 執行個體。如需 AWS 定價的詳細資訊，請參閱 https：//[http://aws.amazon.com](https://aws.amazon.com/) 中每個產品的詳細資訊頁面。

## 步驟 1：編輯成品並將它上傳到 S3 儲存貯體
<a name="w2aac21c11b9"></a>

在您建置管道之前，必須設定來源儲存庫與檔案。CodePipeline 會將這些來源檔案複製到管道的[成品存放區](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-artifacts)，然後使用這些檔案在管道中執行動作，例如建立 CloudFormation 堆疊。

當您使用 Amazon Simple Storage Service (Amazon S3) 作為來源儲存庫時，CodePipeline 要求您將來源檔案進行壓縮，然後再上傳到 S3 儲存貯體。壓縮的檔案為 CodePipeline 成品，它可包含 CloudFormation 範本、範本組態檔案，或兩者兼具。我們提供的成品包含範例 WordPress 範本及兩個範本組態檔案。這兩個組態檔案指定 WordPress 範本的參數值。CodePipeline 在建立 WordPress 堆疊時，將使用這些參數值。其中一個檔案包含測試堆疊的參數值，另一個則包含生產堆疊的參數值。您將必須編輯組態檔案，例如，指定您擁有的現有 EC2 金鑰對名稱。如需成品的詳細資訊，請參閱 [CloudFormation 成品](continuous-delivery-codepipeline-cfn-artifacts.md)。

在您建置成品之後，會將它上傳到 S3 儲存貯體。

**編輯和上傳成品**

1. 下載並開啟範例成品：[https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/wordpress-single-instance.zip](https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/wordpress-single-instance.zip)。

   此成品包含三個檔案：
   + 範例 WordPress 範本：`wordpress-single-instance.yaml`
   + 測試堆疊的範本組態檔案：`test-stack-configuration.json`
   + 生產堆疊的範本組態檔案：`prod-stack-configuration.json`

1. 擷取所有檔案，然後使用任何文字編輯器來修改範本組態檔案。

   開啟組態檔案，查看它們包含對應至 WordPress 範本參數的索引鍵/值組。組態檔案指定參數值，您的管道在建立測試和生產堆疊時，將會使用這些參數值。

   編輯 `test-stack-configuration.json` 檔案以指定測試堆疊的參數值，並指定 `prod-stack-configuration.json` 檔案以指定生產堆疊的參數值。
   + 將 `DBPassword` 值與 `DBRootPassword` 金鑰變更為密碼，您可用它來登入 WordPress 資料庫。如同 WordPress 範本中的定義，參數值必須僅包含英數字元。
   + 將 `KeyName` 金鑰值變更為您將建立管道之區域中現有的 EC2 金鑰對名稱。

1. 將修改過的組態檔新增至原始成品 (`.zip`) 檔案，以取代重複的檔案。

   您現在可以自訂成品，並可將它上傳到 S3 儲存貯體。

1. [將成品上傳到您擁有的 S3 儲存貯體。](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)

   請注意檔案的位置。當您建置管道時，將指定此檔案的位置。

   有關成品和 S3 儲存貯體的說明：
   + 使用位於您要建立管道之相同 AWS 區域中的儲存貯體。
   + CodePipeline 要求儲存貯體[已啟用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html)。
   + 您的來源儲存庫也可以使用不要求在上傳前壓縮檔案的服務，例如 GitHub 或 CodeCommit。
   + 成品可以包含敏感的資訊，例如密碼。限制存取，只有獲得允許使用者可以檢視檔案。當您這麼做時，請確保 CodePipeline 仍然可以存取檔案。例如，如果您將成品上傳至 S3 儲存貯體，則請使用 [S3 儲存貯體政策或使用者政策](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-management.html)來限制存取權。

您現在有一個可讓 CodePipeline 放入您管道的成品。在接下來的步驟中，您將指定成品的位置並建置 WordPress 管道。

## 步驟 2：建立管道堆疊
<a name="w2aac21c11c11"></a>

若要建立 WordPress 管道，您將使用範例 CloudFormation 範本。除了建置管道之外，範本還會為 CodePipeline 和 CloudFormation 設定 AWS Identity and Access Management (IAM) 服務角色、CodePipeline 成品存放區的 S3 儲存貯體，以及管道傳送通知的 Amazon Simple Notification Service (Amazon SNS) 主題，例如有關檢閱的通知。範例範本可讓您輕鬆佈建和設定單一 CloudFormation 堆疊中的這些資源。

如需管道設定的詳細資訊，請參閱 [管道有何功能](#codepipeline-basic-walkthrough-template-details)。

**重要**  
範例 WordPress 範本建立 EC2 執行個體，它需要網際網路連線。確認您的預設 VPC 和子網路允許將流量傳送至網際網路。

**建立管道堆疊**

1. 請至 [https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/basic-pipeline.yml](https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/basic-pipeline.yml) 下載範例範本。並將它儲存在您的電腦。

1. 開啟位在 [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/) 的 CloudFormation​ 主控台。

1. 選擇支援 CodePipeline 和 CloudFormation AWS 的區域。

   如需詳細資訊，請參閱 *AWS 一般參考* 中的 [CodePipeline 端點和配額](https://docs.aws.amazon.com/general/latest/gr/codepipeline.html)以及 [CloudFormation 端點和配額](https://docs.aws.amazon.com/general/latest/gr/cfn.html)。

1. 選擇**建立堆疊**。

1. 在 **Specify template (指定範本) **下方，選擇 **Upload a template file (上傳範本檔案)**，然後選擇您剛剛下載的範本 `basic-pipeline.yml`。

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

1. 在 **Stack Name** (堆疊名稱) 中輸入 `sample-WordPress-pipeline`。

1. 在 **Parameters (參數)** 區段中指定以下參數值，然後選擇 **Next (下一步)**。設定堆疊參數時，如果您維持與 WordPress 範本及其組態檔案相同的名稱，就可以使用預設值。否則，請指定您使用的檔案名稱。  
**PipelineName**  
您的管道名稱，例如 `WordPress-test-pipeline`。  
**S3 儲存貯體**  
您用於儲存成品 (`.zip` 檔案) 的 S3 儲存貯體名稱。  
**SourceS3Key**  
成品的檔案名稱。如果您將成品儲存於資料夾，請將其作為檔案名稱的一部分包含在內，例如 `folder/subfolder/wordpress-single-instance.zip`。  
**電子郵件**  
CodePipeline 傳送管道通知的電子郵件地址，例如 `myemail@example.com`。

1. 在此逐步解說中，您不需要新增標籤或指定進階設定，因此請選擇 **Next (下一步)**。

1. 確認堆疊名稱和範本 URL 正確，然後選擇 **Create stack (建立堆疊)**。

1. 為了確認您知道 CloudFormation 可能會建立 IAM 資源，請勾選該核取方塊。

建立堆疊可能需要幾分鐘 AWS CloudFormation 的時間。若要監控進度，請檢視堆疊事件。如需詳細資訊，請參閱[監控堆疊進度](monitor-stack-progress.md)。

在建立堆疊之後，CodePipeline 將開始您的新管道。若要查看其狀態，請參閱 [CodePipeline 主控台](https://console.aws.amazon.com/codepipeline/)。從管道清單中選擇 **WordPress-test-pipeline**。

### 管道有何功能
<a name="codepipeline-basic-walkthrough-template-details"></a>

本節使用範例 WordPress 管道範本的程式碼片段，說明管道的三個階段。

#### 階段 1：來源
<a name="w2aac21c11c11c15b5"></a>

管道的第一階段是來源階段，您在其中指定原始程式碼的位置。每次您將修訂推送至此位置時，CodePipeline 就會重新執行您的管道。

原始程式碼位於 S3 儲存貯體，並以其檔案名稱識別。您指定這些值作為您建立管道堆疊時的輸入參數值。為了允許在後續階段使用來源成品，程式碼片段指定 `OutputArtifacts` 屬性，其名稱為 `TemplateSource`。為了在之後的階段使用此成品，您指定 `TemplateSource` 作為輸入成品。

```
- Name: S3Source
  Actions:
    - Name: TemplateSource
      ActionTypeId:
        Category: Source
        Owner: AWS
        Provider: S3
        Version: '1'
      Configuration:
        S3Bucket: !Ref 'S3Bucket'
        S3ObjectKey: !Ref 'SourceS3Key'
      OutputArtifacts:
        - Name: TemplateSource
```

#### 階段 2：TestStage
<a name="w2aac21c11c11c15b7"></a>

在 `TestStage` 階段，管道會建立測試堆疊、等待您的核准，然後刪除測試堆疊。

對於 `CreateStack` 動作，管道會使用測試組態檔案和 WordPress 範本來建立測試堆疊。這兩個檔案包含在從來源階段引進的 `TemplateSource` 輸入成品中。程式碼片段使用 `REPLACE_ON_FAILURE` 動作模式。如果堆疊建立失敗，管道將會取代它，因此在重新執行管道之前，您不需要清除或排解堆疊的問題。動作模式對於測試堆疊的快速更新很有用。對於 `RoleArn` 屬性， 值是 範本中其他位置宣告 AWS CloudFormation 的服務角色。

`ApproveTestStack` 動作會暫停管道，並傳送通知給您在建立管道堆疊時指定的電子郵件地址。雖然管道已暫停，您還是可以檢查 WordPress 測試堆疊及其資源。使用 CodePipeline [核准或拒絕](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals-approve-or-reject.html)此動作。`CustomData` 屬性包含您要核准之動作的描述，核准之後管道會將通知新增至電子郵件。

在您核准此動作之後，CodePipeline 會移至 `DeleteTestStack` 動作，然後刪除測試 WordPress 堆疊及其資源。

```
- Name: TestStage
  Actions:
    - Name: CreateStack
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: '1'
      InputArtifacts:
        - Name: TemplateSource
      Configuration:
        ActionMode: REPLACE_ON_FAILURE
        RoleArn: !GetAtt [CFNRole, Arn]
        StackName: !Ref TestStackName
        TemplateConfiguration: !Sub "TemplateSource::${TestStackConfig}"
        TemplatePath: !Sub "TemplateSource::${TemplateFileName}"
      RunOrder: '1'
    - Name: ApproveTestStack
      ActionTypeId:
        Category: Approval
        Owner: AWS
        Provider: Manual
        Version: '1'
      Configuration:
        NotificationArn: !Ref CodePipelineSNSTopic
        CustomData: !Sub 'Do you want to create a change set against the production stack and delete the ${TestStackName} stack?'
      RunOrder: '2'
    - Name: DeleteTestStack
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: '1'
      Configuration:
        ActionMode: DELETE_ONLY
        RoleArn: !GetAtt [CFNRole, Arn]
        StackName: !Ref TestStackName
      RunOrder: '3'
```

#### 階段 3：ProdStage
<a name="w2aac21c11c11c15b9"></a>

管道的 `ProdStage` 階段會針對現有的生產堆疊建立變更集、等待核准，然後執行變更集。

變更集提供在實作之前對生產堆疊 AWS CloudFormation 進行的所有修改的預覽。在您第一個管道執行時，您不會有執行中的生產堆疊。變更集顯示建立測試堆疊時 AWS CloudFormation 執行的動作。若要建立變更集，`CreateChangeSet` 動作將使用 WordPress 範例範本以及來自 `TemplateSource` 輸入成品的生產範本組態。

類似上個階段，`ApproveChangeSet` 動作將暫停管道，並傳送電子郵件通知。雖然管道已暫停，您還是可以檢視變更集以查看生產 WordPress 堆疊的所有建議修改。使用 CodePipeline [核准或拒絕](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals-approve-or-reject.html)此動作以繼續或停止管道。

在您核准此動作後，`ExecuteChangeSet`動作會執行變更集，讓 AWS CloudFormation 執行變更集中所述的所有動作。對於初始執行， 會 AWS CloudFormation 建立 WordPress 生產堆疊。在後續執行時， AWS CloudFormation 將更新堆疊。

```
- Name: ProdStage
  Actions:
    - Name: CreateChangeSet
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: '1'
      InputArtifacts:
        - Name: TemplateSource
      Configuration:
        ActionMode: CHANGE_SET_REPLACE
        RoleArn: !GetAtt [CFNRole, Arn]
        StackName: !Ref ProdStackName
        ChangeSetName: !Ref ChangeSetName
        TemplateConfiguration: !Sub "TemplateSource::${ProdStackConfig}"
        TemplatePath: !Sub "TemplateSource::${TemplateFileName}"
      RunOrder: '1'
    - Name: ApproveChangeSet
      ActionTypeId:
        Category: Approval
        Owner: AWS
        Provider: Manual
        Version: '1'
      Configuration:
        NotificationArn: !Ref CodePipelineSNSTopic
        CustomData: !Sub 'A new change set was created for the ${ProdStackName} stack. Do you want to implement the changes?'
      RunOrder: '2'
    - Name: ExecuteChangeSet
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: '1'
      Configuration:
        ActionMode: CHANGE_SET_EXECUTE
        ChangeSetName: !Ref ChangeSetName
        RoleArn: !GetAtt [CFNRole, Arn]
        StackName: !Ref ProdStackName
      RunOrder: '3'
```

## 步驟 3：檢視 WordPress 堆疊
<a name="w2aac21c11c13"></a>

CodePipeline 通過管道時會使用 CloudFormation 建立測試和生產堆疊。若要查看這些堆疊及其輸出的狀態，請使用 CloudFormation 主控台。

**檢視堆疊**

1. 開啟位在 [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/) 的 CloudFormation​ 主控台。

1. 根據您的管道處於測試或生產階段，選擇 `Test-MyWordPressSite` 或 `Prod-MyWordPressSite` 堆疊。

1. 若要查看您堆疊的狀態，請檢視堆疊[事件](cfn-console-view-stack-data-resources.md)。

如果堆疊處於故障狀態，請檢視狀態原因以找出堆疊錯誤。修正錯誤，然後重新執行管道。如果堆疊處於 `CREATE_COMPLETE` 狀態，請檢視其輸出以取得您 WordPress 網站的 URL。

您已成功使用 CodePipeline 為範例 WordPress 網站建置持續交付工作流程。如果您提交變更到 S3 儲存貯體，CodePipeline 將自動偵測新版本，然後重新執行您的管道。此工作流程可讓您更容易提交和測試變更，然後再變更您的生產網站。

## 步驟 4：清除資源
<a name="w2aac21c11c15"></a>

為避免您為不需要的服務支付費用，請刪除您的資源。

**重要**  
請先刪除測試和生產 WordPress 堆疊，然後才能刪除管道堆疊。管道堆疊包含刪除 WordPress 堆疊時所需要的服務角色。如果您已先刪除管道堆疊，可以將其他服務角色 Amazon Resource Name (ARN) 關聯至 WordPress 堆疊，然後將它們刪除。

**刪除成品存放區中的物件**

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 選擇 S3 儲存貯體，讓 CodePipeline 使用作為您管道的成品存放區。

   儲存貯體的名稱需使用此：`stackname-artifactstorebucket-id`。如果您依照此逐步解說，儲存貯體名稱可能類似於以下範例：`sample-WordPress-pipeline-artifactstorebucket-12345abcd12345`。

1. 刪除成品存放區 S3 儲存貯體中的所有物件。

   當您在下個步驟中刪除管道堆疊時，此儲存貯體必須是空的。否則，CloudFormation 將無法刪除該儲存貯體。

**刪除堆疊**

1. 從 CloudFormation 主控台選擇您要刪除的堆疊。

   如果管道建立的 WordPress 堆疊仍在執行中，請先選擇它們。在預設情況下，堆疊名稱為 `Test-MyWordPressSite` 和 `Prod-MyWordPressSite`。

   如果您已刪除 WordPress 堆疊，請選擇 `sample-WordPress-pipeline` 堆疊。

1. 選擇 **Actions** (動作)，然後選擇 **Delete Stack** (刪除堆疊)。

1. 在確認訊息中，選擇 **Yes, Delete (是，刪除)**。

CloudFormation 刪除堆疊所有的堆疊資源，例如 EC2 執行個體、通知主題、服務角色和管道。

現在您了解如何以 CodePipeline 建置基本 CloudFormation 工作流程，您可以使用範例範本和成品做為起點來建置自己的工作流程。

## 另請參閱
<a name="w2aac21c11c17"></a>

以下相關資源可協助您使用這些參數。
+ 如需有關 CodePipeline 中 CloudFormation 動作參數的詳細資訊，請參閱《AWS CodePipeline 使用者指南》**中的 [CloudFormation 部署動作組態參考](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CloudFormation.html)。
+ 如需動作提供者的範例範本值 (例如 `Owner` 欄位或 `configuration` 欄位)，請參閱 *AWS CodePipeline User Guide* (《 使用者指南》) 中的 [Action structure reference](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference.html) (動作結構參考)。
+ 若要下載 YAML 或 JSON 格式的管道堆疊範本範例，請參閱《AWS CodePipeline 使用者指南》中的[教學課程：使用 CloudFormation建立管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-cloudformation.html)。**