

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

# 教學課程：使用 CodePipeline 部署至 Amazon EC2 執行個體
<a name="tutorials-ec2-deploy"></a>

本教學課程可協助您在 CodePipeline 中建立部署動作，將您的程式碼部署到您在 Amazon EC2 中設定的執行個體。

**注意**  
在主控台中建立管道時，CodePipeline 將使用 S3 成品儲存貯體做為成品。（這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中，請確定 S3 成品儲存貯體由 所擁有 AWS 帳戶 ，安全且可靠。

**注意**  
部署動作僅適用於 V2 `EC2` 類型管道。

## 先決條件
<a name="tutorials-ec2-deploy-prereqs"></a>

您必須先有幾個資源，才能使用此教學來建立 CD 管道。以下是在開始使用前需準備的事項：

**注意**  
所有這些資源都應在相同區域內建立 AWS 。
+ 來源控制儲存庫 （本教學課程使用 GitHub)，您將在其中新增範例`script.sh`檔案。
+ 您必須使用已透過此動作許可更新的現有 CodePipeline 服務角色。若要更新您的服務角色，請參閱 [EC2 部署動作的服務角色政策許可](action-reference-EC2Deploy.md#action-reference-EC2Deploy-permissions-action)。

滿足這些先決條件之後，即可繼續教學並建立 CD 管道。

## 步驟 1：建立 Amazon EC2 Linux 執行個體
<a name="tutorials-ec2-deploy-instances"></a>

在此步驟中，您會建立要在其中部署範例應用程式的 Amazon EC2 執行個體。在此程序中，如果您尚未在要建立資源的區域中建立執行個體角色，請在 IAM 中建立執行個體角色。

**建立執行個體角色**

1. 開啟 IAM 主控台，網址為 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 從主控台儀表板，選擇 **Roles (角色)**。

1. 選擇建**立角色**。

1. 在**選取信任實體類型**下，選取 **AWS 服務**。在**選擇使用案例**下，選取 **EC2**。在 **Select your use case (選取您的使用案例)** 下，選擇 **EC2**。選擇**下一步**。

1. 搜尋並選取名為 的政策**`AmazonSSMManagedEC2InstanceDefaultPolicy`**。

1. 搜尋並選取名為 的政策**`AmazonSSMManagedInstanceCore`**。選擇下**一步：標籤**。

1. 選擇下**一步：檢閱**。輸入角色的名稱 (例如，**EC2InstanceRole**)。
**注意**  
記下您的角色名稱，以用於下一個步驟。您會在建立執行個體時選擇此角色。
**注意**  
您將為此角色新增許可，以允許在管道建立後存取管道的 S3 成品儲存貯體。

   選擇建**立角色**。

**啟動執行個體**

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

1. 在側邊導覽中，選擇**執行個體**，然後從頁面頂端選取**啟動執行個體**。

1. 在**名稱**中，輸入 **MyInstances**。這會將標籤**索引鍵** **Name**和標籤**值** 指派給執行個體**MyInstances**。

1. 在**應用程式和作業系統映像 (Amazon Machine Image)** 下，找到具有 AWS 標誌的 **Amazon Linux** AMI 選項，並確認已選取。（此 AMI 描述為 Amazon Linux 2 AMI (HVM)，並標記為「免費方案合格」。)

1. 在**執行個體類型**下，選擇符合免費方案的`t2.micro`類型做為執行個體的硬體組態。

1. 在**金鑰對 （登入）** 下，選擇金鑰對或建立一個金鑰對。

1. 在**網路設定**下，確定狀態為**啟用**。

1. 展開 **Advanced Details** (進階詳細資訊)。在 **IAM 執行個體描述檔**中，選擇您在先前程序中建立的 IAM 角色 （例如 **EC2InstanceRole**)。
**注意**  
請勿將執行個體角色保留空白，因為這會建立預設角色，而且不會選取您建立的角色。

1. 在**摘要**下，於**執行個體數量**下，輸入 `2`。

1. 選擇**啟動執行個體**。

1. 您可以在 **Instances (執行個體)** 頁面上檢視啟動狀態。當您啟動執行個體時，其初始狀態是 `pending`。在執行個體啟動後，其狀態會變更為 `running`，並得到公有的 DNS 名稱。(如果 **Public DNS (公有 DNS)** 欄未顯示，請選擇 **Show/Hide (顯示/隱藏)** 圖示，然後選擇 **Public DNS (公有 DNS)**。)

## 步驟 2：將成品儲存貯體許可新增至 EC2 執行個體角色
<a name="tutorials-ec2-deploy-role-s3"></a>

您必須更新為執行個體建立的 EC2 執行個體角色，以允許它存取管道的成品儲存貯體。

**注意**  
建立執行個體時，您可以建立或使用現有的 EC2 執行個體角色。若要避免`Access Denied`錯誤，您必須將 S3 儲存貯體許可新增至執行個體角色，才能將執行個體許可授予 CodePipeline 成品儲存貯體。建立預設角色，或使用範圍縮小為管道區域成品儲存貯體的`s3:GetObject`許可來更新現有角色。

1. 在 CodePipeline 主控台中導覽至您的管道。選擇**設定**。檢視現有管道的成品存放區名稱和位置。記下成品儲存貯體 Amazon Resource Name (ARN) 並將其複製。

1. 導覽至 IAM 主控台，然後選擇 **Roles** (角色)。選擇您在本教學課程的步驟 1 中建立的執行個體角色。

1. 在**許可**標籤上，選擇**新增內嵌政策**。

1. 將下列 JSON 新增至政策文件，將 `Resource` 欄位中的值取代為儲存貯體 ARN。

   ```
   {
       "Effect": "Allow",
       "Principal": "*",
       "Action": "s3:GetObject",
       "Resource": "arn:aws:s3:::BucketName"
   }
   ```

1. 選擇**更新**。

## 步驟 3：將指令碼檔案新增至您的儲存庫
<a name="tutorials-ec2-deploy-file"></a>

貼上此範例文字，為部署中的後製指令碼步驟建立 `script.sh` 檔案。

```
echo "Hello World!" 
```

**將 `script.sh` 檔案新增至來源儲存庫**

1. 開啟文字編輯器，然後將上面的檔案複製並貼到新的檔案中。

1. 遞交您的 `script.sh` 檔案並將之推送至來源儲存庫。

   1. 新增檔案。

      ```
      git add .
      ```

   1. 遞交變更。

      ```
      git commit -m "Adding script.sh."
      ```

   1. 推送認可。

      ```
      git push
      ```

   記下儲存庫中的路徑。

   ```
   /MyDemoRepo/test/script.sh
   ```

## 步驟 4：建立管道
<a name="tutorials-ec2-deploy-pipeline"></a>

使用 CodePipeline 精靈建立管道階段並連接來源儲存庫。

**建立管道**

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

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

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

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

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. 在**服務角色**中，選擇**使用現有的服務角色**，然後選擇已更新此動作所需許可的 CodePipeline 服務角色。若要為此動作設定 CodePipeline 服務角色，請參閱 [EC2 部署動作的服務角色政策許可](action-reference-EC2Deploy.md#action-reference-EC2Deploy-permissions-action)。

1. 將 **Advanced settings (進階設定)** 下的設定保留為預設值，然後選擇 **Next (下一步)**。

1. 在**步驟 3：新增來源階段**頁面上，新增來源階段：

   1. 在**來源提供者**中，選擇 **GitHub （透過 GitHub 應用程式）**。

   1. 在**連線**下，選擇現有的連線或建立新的連線。若要建立或管理 GitHub 來源動作的連線，請參閱 [GitHub 連線](connections-github.md)。

   1. 在**儲存庫名稱**中，選擇 GitHub 儲存庫的名稱。

   選擇**下一步**。

1. 在**步驟 4：新增建置階段**頁面上，選擇**略過**。

1. 在**步驟 5：新增部署階段**頁面上，選擇 **EC2**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ec2deploy-action.png)

   1. 針對**目標目錄**，在您要部署的執行個體上輸入目錄，例如 `/home/ec2-user/testhelloworld`。
**注意**  
指定您希望動作在執行個體上使用的部署目錄。動作會自動在執行個體上建立指定的目錄，做為部署的一部分。

   1. 在 **PostScript** 中，輸入指令碼的路徑和檔案名稱，例如 `test/script.sh`。

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

1. 在 **Step 6: Review** (步驟 6：檢閱) 頁面上，檢閱您的管道組態，然後選擇 **Create pipeline** (建立管道) 來建立管道。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ec2deploy-pipeline.png)

1. 管道成功執行後，請選擇**檢視詳細資訊**以檢視動作上的日誌，以檢視受管運算動作輸出。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ec2deploy-logs.png)  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ec2deploy-logs2.png)

## 步驟 5：測試您的管道
<a name="tutorials-ec2-deploy-test"></a>

您的管道應具備執行end-to-end原生 AWS 持續部署所需的一切。現在，將程式碼變更推送至來源儲存庫，以測試其功能。

**測試管道**

1. 對設定的來源儲存庫進行程式碼變更、遞交並推送變更。

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

1. 從清單中選擇管道。

1. 觀看管道階段的管道進度。您的管道應該完成，而且您的動作會在執行個體上部署指令碼。

1. 如需更多故障診斷資訊，請參閱 [EC2 部署動作失敗並顯示錯誤訊息 `No such file`](troubleshooting.md#troubleshooting-ec2-deploy)。