

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

# CodeDeploy 教學課程
<a name="tutorials"></a>

本節包含一些教學課程，可協助您了解如何使用 CodeDeploy。

這些教學課程中的程序提供存放檔案的位置建議 （例如 c：\$1temp) 以及要提供給儲存貯體、子資料夾或檔案的名稱 （例如 amzn-s3-demo-bucket、HelloWorldApp 和 CodeDeployDemo-EC2-Trust.json)，但您不需要使用這些檔案。執行程序時，請務必替代檔案位置和名稱。

**Topics**
+ [教學課程：將 WordPress 部署到 Amazon EC2 執行個體 (Amazon Linux 或 Red Hat Enterprise Linux 和 Linux、macOS 或 Unix)](tutorials-wordpress.md)
+ [教學課程：部署 "hello， world！" 應用程式搭配 CodeDeploy (Windows Server)](tutorials-windows.md)
+ [教學課程：使用 CodeDeploy 將應用程式部署至內部部署執行個體 (Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)
+ [教學課程：使用 CodeDeploy 將應用程式部署至 Auto Scaling 群組](tutorials-auto-scaling-group.md)
+ [教學課程：使用 CodeDeploy 從 GitHub 部署應用程式](tutorials-github.md)
+ [教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)
+ [教學課程：使用驗證測試部署 Amazon ECS 服務](tutorial-ecs-deployment-with-hooks.md)
+ [教學課程：使用 CodeDeploy 和無 AWS 伺服器應用程式模型部署更新的 Lambda 函數](tutorial-lambda-sam.md)

# 教學課程：將 WordPress 部署到 Amazon EC2 執行個體 (Amazon Linux 或 Red Hat Enterprise Linux 和 Linux、macOS 或 Unix)
<a name="tutorials-wordpress"></a>

在本教學課程中，您將以 PHP 和 MySQL 為基礎的開放原始碼部落格工具和內容管理系統 WordPress 部署至執行 Amazon Linux 或 Red Hat Enterprise Linux (RHEL) 的單一 Amazon EC2 執行個體。

不是您想找的內容嗎？
+ 若要練習改為部署到執行 Windows Server 的 Amazon EC2 執行個體，請參閱 [教學課程：部署 "hello， world！" 應用程式搭配 CodeDeploy (Windows Server)](tutorials-windows.md)。
+ 若要練習部署到現場部署執行個體而非 Amazon EC2 執行個體，請參閱 [教學課程：使用 CodeDeploy 將應用程式部署至內部部署執行個體 (Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)。

本教學課程的步驟是從執行 Linux、macOS 或 Unix 的本機開發機器的觀點呈現。雖然您可以在執行 Windows 的本機電腦上完成其中大部分的步驟，但是您必須調整步驟以涵蓋命令，例如 **chmod** 和 **wget**，以及應用程式，例如 SED，還有目錄路徑，例如 `/tmp`。

開始此教學課程之前，您必須先完成 [CodeDeploy 入門](getting-started-codedeploy.md) 中的先決條件。這包括設定使用者、安裝或升級 AWS CLI，以及建立 IAM 執行個體描述檔和服務角色。

**Topics**
+ [步驟 1：啟動和設定 Amazon Linux 或 Red Hat Enterprise Linux Amazon EC2 執行個體](tutorials-wordpress-launch-instance.md)
+ [步驟 2：設定要部署到 Amazon Linux 或 Red Hat Enterprise Linux Amazon EC2 執行個體的來源內容](tutorials-wordpress-configure-content.md)
+ [步驟 3：將 WordPress 應用程式上傳至 Amazon S3](tutorials-wordpress-upload-application.md)
+ [步驟 4：部署您的 WordPress 應用程式](tutorials-wordpress-deploy-application.md)
+ [步驟 5：更新並重新部署 WordPress 應用程式](tutorials-wordpress-update-and-redeploy-application.md)
+ [步驟 6：清除 WordPress 應用程式和相關資源](tutorials-wordpress-clean-up.md)

# 步驟 1：啟動和設定 Amazon Linux 或 Red Hat Enterprise Linux Amazon EC2 執行個體
<a name="tutorials-wordpress-launch-instance"></a>

若要使用 CodeDeploy 部署 WordPress 應用程式，您需要執行 Amazon Linux 或 Red Hat Enterprise Linux (RHEL) 的 Amazon EC2 執行個體。Amazon EC2 執行個體需要新的傳入安全規則，以允許 HTTP 連線。需要此規則是為了成功部署後，可以在瀏覽器中檢視 WordPress 頁面。

請遵循中的說明進行[為 CodeDeploy 建立 Amazon EC2 執行個體](instances-ec2-create.md) 當您取得有關將 Amazon EC2 執行個體標籤指派給執行個體的指示部分時，請務必指定 的標籤索引鍵**Name**和 的標籤值**CodeDeployDemo**。(如果您指定不同的標籤鍵或標籤值，[步驟 4：部署您的 WordPress 應用程式](tutorials-wordpress-deploy-application.md)中的說明可能會產生非預期的結果)。

在您依照指示啟動 Amazon EC2 執行個體後，請返回此頁面並繼續下一節。請勿繼續執行 [使用 CodeDeploy 建立應用程式](applications-create.md)做為下一個步驟。

## 連線至您的 Amazon Linux 或 RHEL Amazon EC2 執行個體
<a name="tutorials-wordpress-launch-instance-connect"></a>

啟動新的 Amazon EC2 執行個體後，請依照這些指示來練習與其連線。

1. 使用 **ssh**命令 （或支援 SSH 的終端機模擬器，例如 [PuTTY](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)) 來連線至您的 Amazon Linux 或 RHEL Amazon EC2 執行個體。您將需要執行個體的公有 DNS 地址，以及啟動 Amazon EC2 執行個體時所使用的金鑰對私有金鑰。如需詳細資訊，請參閱[連線至您的執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-connect-to-instance-linux.html)。

   例如，如果公有 DNS 地址為 **ec2-01-234-567-890.compute-1.amazonaws.com**，且 SSH 存取的 Amazon EC2 執行個體金鑰對名為 **codedeploydemo.pem**，您會輸入：

   ```
   ssh -i /path/to/codedeploydemo.pem ec2-user@ec2-01-234-567-890.compute-1.amazonaws.com
   ```

   `/path/to/codedeploydemo.pem` 將 取代為 `.pem` 檔案的路徑，並將範例 DNS 地址取代為 Amazon Linux 或 RHEL Amazon EC2 執行個體的地址。
**注意**  
如果您收到的錯誤是有關您的金鑰檔案許可過於開放，您需要限制其許可，使其只能存取目前使用者 (您)。例如，在 Linux、macOS 或 Unix 上使用 **chmod**命令，請輸入：

   ```
   chmod 400 /path/to/codedeploydemo.pem
   ```

1. 登入後，您會看到 Amazon EC2 執行個體的 AMI 橫幅。對於 Amazon Linux，看起來應該如下所示：

   ```
          __|  __|_  )
          _|  (     /   Amazon Linux AMI
         ___|\___|___|
   ```

1. 您現在可以登出執行中的 Amazon EC2 執行個體。
**警告**  
請勿停止或終止 Amazon EC2 執行個體。否則，CodeDeploy 將無法部署到其中。

## 新增允許 HTTP 流量至 Amazon Linux 或 RHEL Amazon EC2 執行個體的傳入規則
<a name="tutorials-wordpress-launch-instance-add-inbound-rule"></a>

下一步確認您的 Amazon EC2 執行個體具有開放的 HTTP 連接埠，因此您可以在瀏覽器中查看已部署的 WordPress 應用程式首頁。

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

1. 選擇**執行個體**，然後選擇您的執行個體。

1. 在**描述**索引標籤**的安全群組**下，選擇**檢視傳入規則**。

   您應該會在安全群組中看到規則清單，如下所示：

   ```
   Security Groups associated with i-1234567890abcdef0
    Ports     Protocol     Source     launch-wizard-N
    22        tcp          0.0.0.0/0          ✔
   ```

1.  在**安全群組**下，選擇 Amazon EC2 執行個體的安全群組。其可能被命名為 **launch-wizard-*N***。名稱中的 ***N*** 是一個您的執行個體建立時指派到安全群組的數字。

    選擇 **Inbound (傳入)** 標籤。如果執行個體的安全群組設定正確，您應該會看到具有下列值的規則：
   + **類型**：HTTP
   + **Protocol (通訊協定)**：TCP
   + **Port Range (連接埠範圍)**：80
   + **來源**：0.0.0.0/0

1.  如果您沒有看到具有這些值的規則，請使用將[規則新增至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#adding-security-group-rule)中的程序，將規則新增至新的安全規則。

# 步驟 2：設定要部署到 Amazon Linux 或 Red Hat Enterprise Linux Amazon EC2 執行個體的來源內容
<a name="tutorials-wordpress-configure-content"></a>

現在，您可以設定應用程式的來源內容，以將某個項目部署至執行個體。

**Topics**
+ [取得原始程式碼](#tutorials-wordpress-configure-content-download-code)
+ [建立指令碼以執行您的應用程式](#tutorials-wordpress-configure-content-create-scripts)
+ [新增應用程式規格檔案](#tutorials-wordpress-configure-content-add-appspec-file)

## 取得原始程式碼
<a name="tutorials-wordpress-configure-content-download-code"></a>

在本教學課程中，您將 WordPress 內容發佈平台從開發機器部署到目標 Amazon EC2 執行個體。若要取得 WordPress 來源碼，您可以使用內建命令列呼叫。或者，如果您已於開發電腦上安裝 Git，可以改為使用該項目。

在下列步驟中，假設您已將 WordPress 來源碼的複本下載至開發電腦上的 `/tmp` 目錄。(您可以選擇想要的任何目錄，但請記得將這些步驟中指定的所有 `/tmp` 都替代為您的位置)。

選擇下列兩個選項之一，將 WordPress 來源檔案複製至開發電腦。第一個選項使用內建命令列呼叫。第二個選項使用 Git。

**Topics**
+ [取得 WordPress 來源碼的複本 (內建命令列呼叫)](#tutorials-wordpress-configure-content-download-code-command-line)
+ [取得 WordPress 來源碼的複本 (Git)](#tutorials-wordpress-configure-content-download-code-git)

### 取得 WordPress 來源碼的複本 (內建命令列呼叫)
<a name="tutorials-wordpress-configure-content-download-code-command-line"></a>

1. 呼叫 **wget** 命令，將 WordPress 來源碼複本以 .zip 檔案形式下載至目前目錄：

   ```
   wget https://github.com/WordPress/WordPress/archive/master.zip
   ```

1. 呼叫 **unzip**、**mkdir**、**cp** 和 **rm** 命令，以：
   + 將 `master` .zip 檔案解壓縮至 `/tmp/WordPress_Temp` 目錄 (資料夾)。
   + 將其解壓縮的內容複製至 `/tmp/WordPress` 目標資料夾。
   + 刪除暫時 `/tmp/WordPress_Temp` 資料夾和 `master` 檔案。

   一次執行一個命令：

   ```
   unzip master -d /tmp/WordPress_Temp
   ```

   ```
   mkdir -p /tmp/WordPress
   ```

   ```
   cp -paf /tmp/WordPress_Temp/WordPress-master/* /tmp/WordPress
   ```

   ```
   rm -rf /tmp/WordPress_Temp
   ```

   ```
   rm -f master
   ```

   這可讓您在 `/tmp/WordPress` 資料夾中具有一組的 WordPress 來源碼檔案。

### 取得 WordPress 來源碼的複本 (Git)
<a name="tutorials-wordpress-configure-content-download-code-git"></a>

1. 在開發電腦上，下載並安裝 [Git](http://git-scm.com)。

1. 在 `/tmp/WordPress` 資料夾中，呼叫 **git init** 命令。

1. 呼叫 **git clone** 命令以複製公有 WordPress 儲存庫，讓您專屬的公有 WordPress 儲存庫複本放在 `/tmp/WordPress` 目標資料夾：

   ```
   git clone https://github.com/WordPress/WordPress.git /tmp/WordPress
   ```

   這可讓您在 `/tmp/WordPress` 資料夾中具有一組的 WordPress 來源碼檔案。

## 建立指令碼以執行您的應用程式
<a name="tutorials-wordpress-configure-content-create-scripts"></a>

接著，在 目錄中建立資料夾和指令碼。CodeDeploy 使用這些指令碼在目標 Amazon EC2 執行個體上設定和部署您的應用程式修訂版。您可以使用任何文字編輯器來建立指令碼。

1. 在您的 WordPress 來源碼複本中，建立指令碼目錄：

   ```
   mkdir -p /tmp/WordPress/scripts
   ```

1. 在 `/tmp/WordPress/scripts` 中，建立 `install_dependencies.sh` 檔案。在檔案中新增下列各行。此 `install_dependencies.sh` 指令碼會安裝 Apache、MySQL 和 PHP。它還會新增 PHP 的 MySQL 支援。

   ```
   #!/bin/bash
   sudo amazon-linux-extras install php7.4
   sudo yum install -y httpd mariadb-server php
   ```

1. 在 `/tmp/WordPress/scripts` 中，建立 `start_server.sh` 檔案。在檔案中新增下列各行。此 `start_server.sh` 指令碼會啟動 Apache 和 MySQL。

   ```
   #!/bin/bash
   systemctl start mariadb.service
   systemctl start httpd.service
   systemctl start php-fpm.service
   ```

1. 在 `/tmp/WordPress/scripts` 中，建立 `stop_server.sh` 檔案。在檔案中新增下列各行。此 `stop_server.sh` 指令碼會停止 Apache 和 MySQL。

   ```
   #!/bin/bash
   isExistApp="pgrep httpd"
   if [[ -n $isExistApp ]]; then
   systemctl stop httpd.service
   fi
   isExistApp=pgrep mysqld
   if [[ -n $isExistApp ]]; then
   systemctl stop mariadb.service
   fi
   isExistApp=pgrep php-fpm
   if [[ -n $isExistApp ]]; then
   systemctl stop php-fpm.service
   
   fi
   ```

1. 在 `/tmp/WordPress/scripts` 中，建立 `create_test_db.sh` 檔案。在檔案中新增下列各行。此 `create_test_db.sh` 指令碼使用 MySQL 建立 **test** 資料庫，以供 WordPress 使用。

   ```
   #!/bin/bash
   mysql -uroot <<CREATE_TEST_DB
   CREATE DATABASE IF NOT EXISTS test;
   CREATE_TEST_DB
   ```

1. 最後，在 `/tmp/WordPress/scripts` 中，建立 `change_permissions.sh` 指令碼。這用來在 Apache 中變更資料夾許可。
**重要**  
 此指令碼已更新 `/tmp/WordPress` 資料夾的許可，讓任何人都可以寫入其中。這是必要的，因此 WordPress 可以在[步驟 5：更新並重新部署 WordPress 應用程式](tutorials-wordpress-update-and-redeploy-application.md)期間寫入其資料庫 。在設定好 WordPress 應用程式之後，執行以下命令來更新許可為更安全的設定：  

   ```
   chmod -R 755 /var/www/html/WordPress
   ```

   ```
   #!/bin/bash
   chmod -R 777 /var/www/html/WordPress
   ```

1. 給予所有指令碼可執行的許可。在命令列輸入：

   ```
   chmod +x /tmp/WordPress/scripts/*
   ```

## 新增應用程式規格檔案
<a name="tutorials-wordpress-configure-content-add-appspec-file"></a>

接著，新增應用程式規格檔案 (AppSpec 檔案），這是 CodeDeploy 使用的 [YAML](http://www.yaml.org) 格式檔案，用於：
+ 將應用程式修訂中的來源檔案映射至目標 Amazon EC2 執行個體上的目的地。
+ 指定已部署檔案的自訂許可。
+ 指定要在部署期間於目標 Amazon EC2 執行個體上執行的指令碼。

AppSpec 檔案必須命名為 `appspec.yml`。它必須放置在應用程式原始碼的根目錄中。在此教學課程中，根目錄是 `/tmp/WordPress`。

使用文字編輯器，建立名為 `appspec.yml` 的檔案。在檔案中新增下列各行：

```
version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/WordPress
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/change_permissions.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
    - location: scripts/create_test_db.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root
```

CodeDeploy 使用此 AppSpec 檔案，將開發機器上 `/tmp/WordPress` 資料夾中的所有檔案複製到目標 Amazon EC2 執行個體上的 `/var/www/html/WordPress` 資料夾。在部署期間，CodeDeploy 會在部署生命週期內的指定事件`root`執行指定指令碼，如目標 Amazon EC2 執行個體的 `/var/www/html/WordPress/scripts` 資料夾中的 **BeforeInstall**和 **AfterInstall**。如果任何這些指令碼需要超過 300 秒 (5 分鐘） 才能執行，CodeDeploy 會停止部署並將部署標記為失敗。

如需這些設定的詳細資訊，請參閱[CodeDeploy AppSpec 檔案參考](reference-appspec-file.md)。

**重要**  
此檔案中每個項目之間的空格位置和數目十分重要。如果間距不正確，CodeDeploy 會引發可能難以偵錯的錯誤。如需詳細資訊，請參閱[AppSpec 檔案間距](reference-appspec-file.md#reference-appspec-file-spacing)。

# 步驟 3：將 WordPress 應用程式上傳至 Amazon S3
<a name="tutorials-wordpress-upload-application"></a>

現在，您將準備來源內容並將其上傳至 CodeDeploy 可以從中部署該內容的位置。下列指示說明如何佈建 Amazon S3 儲存貯體、準備儲存貯體的應用程式修訂版檔案、綁定修訂版的檔案，然後將修訂版推送至儲存貯體。

**注意**  
雖然本教學課程未涵蓋，但您可以使用 CodeDeploy 將應用程式從 GitHub 儲存庫部署到執行個體。如需詳細資訊，請參閱[將 CodeDeploy 與 GitHub 整合](integrations-partners-github.md)。

**Topics**
+ [佈建 Amazon S3 儲存貯體](#tutorials-wordpress-upload-application-create-s3-bucket)
+ [準備儲存貯體的應用程式檔案](#tutorials-wordpress-upload-application-prepare-application-files)
+ [將應用程式的檔案綁定到單一封存檔案中，並推送封存檔案](#tutorials-wordpress-upload-application-bundle-and-push-archive)

## 佈建 Amazon S3 儲存貯體
<a name="tutorials-wordpress-upload-application-create-s3-bucket"></a>

在 Amazon S3 中建立儲存容器或*儲存貯*體，或使用現有的儲存貯體。請確定您可以將修訂版上傳至儲存貯體，而且部署中使用的 Amazon EC2 執行個體可以從儲存貯體下載修訂版。

您可以使用 AWS CLI、Amazon S3 主控台或 Amazon S3 APIs 來建立 Amazon S3 儲存貯體。建立儲存貯體之後，請務必授予儲存貯體和帳戶的 AWS 存取許可。

**注意**  
所有 AWS 帳戶的 Amazon S3 儲存貯體名稱必須是唯一的。如果您無法使用 **amzn-s3-demo-bucket**，請嘗試不同的儲存貯體名稱 (例如後接破折號和您的縮寫或其他唯一識別符的 **amzn-s3-demo-bucket**)。然後，請務必將在本教學中看到的所有 **amzn-s3-demo-bucket** 都替代為您的儲存貯體名稱。  
Amazon S3 儲存貯體必須在啟動目標 Amazon EC2 執行個體的相同 AWS 區域中建立。例如，如果您在美國東部 （維吉尼亞北部） 區域建立儲存貯體，則必須在美國東部 （維吉尼亞北部） 區域啟動目標 Amazon EC2 執行個體。

**Topics**
+ [建立 Amazon S3 儲存貯體 (CLI)](#tutorials-wordpress-upload-application-create-s3-bucket-cli)
+ [建立 Amazon S3 儲存貯體 （主控台）](#tutorials-wordpress-upload-application-create-s3-bucket-console)
+ [將許可授予 Amazon S3 儲存貯體和 AWS 帳戶](#tutorials-wordpress-upload-application-create-s3-bucket-grant-permissions)

### 建立 Amazon S3 儲存貯體 (CLI)
<a name="tutorials-wordpress-upload-application-create-s3-bucket-cli"></a>

呼叫 **mb**命令來建立名為 的 Amazon S3 儲存貯體**amzn-s3-demo-bucket**：

```
aws s3 mb s3://amzn-s3-demo-bucket --region region
```

### 建立 Amazon S3 儲存貯體 （主控台）
<a name="tutorials-wordpress-upload-application-create-s3-bucket-console"></a>

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

1. 在 Amazon S3 主控台中，選擇**建立儲存貯**體。

1. 在 **Bucket name (儲存貯體名稱)** 方塊中，輸入儲存貯體的名稱。

1. 在 **Region (區域)** 清單中，選擇目標區域，然後選擇 **Create (建立)**。

### 將許可授予 Amazon S3 儲存貯體和 AWS 帳戶
<a name="tutorials-wordpress-upload-application-create-s3-bucket-grant-permissions"></a>

您必須具有上傳到 Amazon S3 儲存貯體的許可。您可以透過 Amazon S3 儲存貯體政策指定這些許可。例如，在下列 Amazon S3 儲存貯體政策中，使用萬用字元 (\$1) `111122223333` 可讓 AWS 帳戶將檔案上傳至名為 的 Amazon S3 儲存貯體中的任何目錄`amzn-s3-demo-bucket`：

```
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "111122223333"
                ]
            }
        }
    ]
}
```

若要檢視 AWS 您的帳戶 ID，請參閱[尋找 AWS 您的帳戶 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId)。

現在是驗證 Amazon S3 儲存貯體是否允許從每個參與的 Amazon EC2 執行個體下載請求的好時機。您可以透過 Amazon S3 儲存貯體政策指定此項目。例如，在下列 Amazon S3 儲存貯體政策中，使用萬用字元 (\$1) 允許任何具有連接 IAM 執行個體描述檔的 Amazon EC2 執行個體`arn:aws:iam::444455556666:role/CodeDeployDemo`，其中包含 ARN，從名為 的 Amazon S3 儲存貯體中的任何目錄下載檔案`amzn-s3-demo-bucket`：

```
{
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::444455556666:role/CodeDeployDemo"
                ]
            }
        }
    ]
}
```

 如需有關如何產生和連接 Amazon S3 儲存貯體政策的資訊，請參閱[儲存貯體政策範例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)。

如需如何建立和連接 IAM 政策的資訊，請參閱[使用政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/ManagingPolicies.html#AddingPermissions_Console)。

## 準備儲存貯體的應用程式檔案
<a name="tutorials-wordpress-upload-application-prepare-application-files"></a>

請確定 WordPress 應用程式檔案、AppSpec 檔案和指令碼在開發機器上組織如下：

```
/tmp/
  |--WordPress/
      |-- appspec.yml  
      |-- scripts/
      |    |-- change_permissions.sh
      |    |-- create_test_db.sh
      |    |-- install_dependencies.sh
      |    |-- start_server.sh
      |    |-- stop_server.sh
      |-- wp-admin/
      |    |-- (various files...)
      |-- wp-content/
      |    |-- (various files...)
      |-- wp-includes/
      |    |-- (various files...)
      |-- index.php
      |-- license.txt
      |-- readme.html
      |-- (various files ending with .php...)
```

## 將應用程式的檔案綁定到單一封存檔案中，並推送封存檔案
<a name="tutorials-wordpress-upload-application-bundle-and-push-archive"></a>

將 WordPress 應用程式檔案和 AppSpec 檔案綁定到封存檔案 （稱為應用程式*修訂*)。

**注意**  
可能會向您收取下列作業的費用：在儲存貯體中存放物件，以及將應用程式修訂傳入和傳出儲存貯體。如需詳細資訊，請參閱 [Simple Storage Service (Amazon S3) 定價](https://aws.amazon.com/s3/pricing/)。

1. 在開發電腦上，切換至檔案存放所在的資料夾：

   ```
   cd /tmp/WordPress
   ```
**注意**  
如果您未切換至此資料夾，將會在目前的資料夾開始檔案綁定。例如，如果您的目前資料夾是 `/tmp`，而不是 `/tmp/WordPress`，則會開始綁定 `tmp` 資料夾中的檔案和子資料夾，而此資料夾可能不只包含 `WordPress` 子資料夾。

1. 呼叫 **create-application** 命令，向名為 **WordPress\$1App** 的新應用程式註冊：

   ```
   aws deploy create-application --application-name WordPress_App
   ```

1. 呼叫 CodeDeploy [推送](https://docs.aws.amazon.com/cli/latest/reference/deploy/push.html)命令，將檔案綁定在一起、上傳修訂至 Amazon S3，以及向 CodeDeploy 註冊有關上傳修訂的資訊，全部都在一個動作中。

   ```
   aws deploy push \
     --application-name WordPress_App \
     --s3-location s3://amzn-s3-demo-bucket/WordPressApp.zip \
     --ignore-hidden-files
   ```

   此命令會將目前目錄中的檔案 （不含任何隱藏檔案） 封裝至名為 的單一封存檔案**WordPressApp.zip**、上傳修訂至 儲存**amzn-s3-demo-bucket**貯體，以及向 CodeDeploy 註冊有關上傳修訂的資訊。

# 步驟 4：部署您的 WordPress 應用程式
<a name="tutorials-wordpress-deploy-application"></a>

現在您已部署上傳到 Amazon S3 的範例 WordPress 應用程式修訂版。您可以使用 AWS CLI 或 CodeDeploy 主控台來部署修訂並監控部署進度。成功部署應用程式修訂版之後，您要檢查結果。

**Topics**
+ [使用 CodeDeploy 部署您的應用程式修訂版](#tutorials-wordpress-deploy-application-create-deployment)
+ [監控您的部署並進行疑難排解](#tutorials-wordpress-deploy-application-monitor)
+ [驗證您的部署](#tutorials-wordpress-deploy-application-verify-deployment)

## 使用 CodeDeploy 部署您的應用程式修訂版
<a name="tutorials-wordpress-deploy-application-create-deployment"></a>

使用 AWS CLI 或 主控台部署您的應用程式修訂版。

**Topics**
+ [部署應用程式修訂 (CLI)](#tutorials-wordpress-deploy-application-create-deployment-cli)
+ [部署應用程式修訂 (主控台)](#tutorials-wordpress-deploy-application-create-deployment-console)

### 部署應用程式修訂 (CLI)
<a name="tutorials-wordpress-deploy-application-create-deployment-cli"></a>

1. 部署需要部署群組。不過，在您建立部署群組之前，需要服務角色 ARN。服務角色是 IAM 角色，提供服務代表您採取行動的許可。在此情況下，服務角色會授予 CodeDeploy 存取 Amazon EC2 執行個體的許可，以展開 （讀取） 其 Amazon EC2 執行個體標籤。

   您應該已經遵循[建立服務角色 (CLI)](getting-started-create-service-role.md#getting-started-create-service-role-cli) 中的說明，來建立服務角色。若要取得服務角色的 ARN，請參閱[取得服務角色 ARN (CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli)。

1. 現在您已擁有服務角色 ARN，請呼叫 **create-deployment-group**命令，使用名為 的 Amazon EC2 標籤**CodeDeployDemo**和名為 的部署組態**WordPress\$1DepGroup**，建立名為 的部署群組**WordPress\$1App**，與名為 的應用程式相關聯**CodeDeployDefault.OneAtATime**：

   ```
   aws deploy create-deployment-group \
     --application-name WordPress_App \
     --deployment-group-name WordPress_DepGroup \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --ec2-tag-filters Key=Name,Value=CodeDeployDemo,Type=KEY_AND_VALUE \
     --service-role-arn serviceRoleARN
   ```

   
**注意**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 命令支援建立觸發，導致將部署和執行個體中指定事件的相關 Amazon SNS 通知傳送給主題訂閱者。此命令也支援自動轉返部署和設定警示的選項，以在符合 Amazon CloudWatch 警示中的監控閾值時停止部署。本教學課程不包含這些動作的命令。

1. 建立部署之前，部署群組中的執行個體必須安裝 CodeDeploy 代理程式。您可以使用 AWS Systems Manager 與下列命令，從命令列安裝代理程式：

   ```
   aws ssm create-association \
     --name AWS-ConfigureAWSPackage \
     --targets Key=tag:Name,Values=CodeDeployDemo \
     --parameters action=Install,name=AWSCodeDeployAgent \
     --schedule-expression "cron(0 2 ? * SUN *)"
   ```

   此命令會在 Systems Manager State Manager 中建立關聯，以安裝 CodeDeploy 代理程式，然後嘗試在每週日上午 2：00 進行更新。如需 CodeDeploy 代理程式的詳細資訊，請參閱[使用 CodeDeploy 代理程式](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent.html)。如需 Systems Manager 的詳細資訊，請參閱[什麼是 AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 。

1. 現在，請在名為 **amzn-s3-demo-bucket** 的儲存貯體中使用名為 **WordPressApp.zip** 的應用程式修訂，呼叫 **create-deployment** 命令來建立與名為 **WordPress\$1App** 之應用程式、名為 **CodeDeployDefault.OneAtATime** 之部署組態和名為 **WordPress\$1DepGroup** 之部署群組建立關聯的部署：

   ```
   aws deploy create-deployment \
     --application-name WordPress_App \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name WordPress_DepGroup \
     --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=WordPressApp.zip
   ```

### 部署應用程式修訂 (主控台)
<a name="tutorials-wordpress-deploy-application-create-deployment-console"></a>

1. 在使用 CodeDeploy 主控台部署應用程式修訂版之前，您需要服務角色 ARN。服務角色是 IAM 角色，提供服務代表您採取行動的許可。在此情況下，服務角色會授予 CodeDeploy 存取 Amazon EC2 執行個體的許可，以展開 （讀取） 其 Amazon EC2 執行個體標籤。

   您應該已經遵循[建立服務角色 （主控台）](getting-started-create-service-role.md#getting-started-create-service-role-console) 中的說明，來建立服務角色。若要取得服務角色的 ARN，請參閱[取得服務角色 ARN （主控台）](getting-started-create-service-role.md#getting-started-get-service-role-console)。

1. 現在您已擁有 ARN，請使用 CodeDeploy 主控台來部署應用程式修訂版：

   登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

1. 在應用程式清單中，選擇 **WordPress\$1App**。

1. 在 **Deployment groups (部署群組)** 標籤中，選擇 **Create deployment group (建立部署群組)**。

1. 在 **Deployment group name (部署群組名稱)** 中，輸入 **WordPress\$1DepGroup**。

1. 在 **Deployment type (部署類型)** 下，選擇 **In-place deployment (就地部署)**。

1. 在**環境組態**中，選取 **Amazon EC2 執行個體**。

1. 在**具有 的客服人員組態 AWS Systems Manager**中，保留預設值。

1. 在 **Key (金鑰)** 中，輸入 **Name**。

1. 在 **Value (值)** 中輸入 **CodeDeployDemo**。
**注意**  
輸入 後**CodeDeployDemo**，**1** 應該會出現在**相符執行個體**下，以確認 CodeDeploy 找到一個相符的 Amazon EC2 執行個體。

1. 在**部署組態**中，選擇 **CodeDeployDefault.OneAtATime**。

1. 在 **Service role ARN (服務角色 ARN)** 中，選擇服務角色 ARN，然後選擇 **Create deployment group (建立部署群組)**。

1. 選擇 **Create deployment (建立部署)**。

1. 在 **Deployment group (部署群組)** 中選擇 **WordPress\$1DepGroup**。

1. 在**儲存庫類型**旁，選擇**我的應用程式存放在 Amazon S3 中**。在**修訂位置**中，輸入您先前上傳至 Amazon S3 的範例 WordPress 應用程式修訂的位置。取得位置：

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

   1. 在儲存貯體清單中，選擇 **amzn-s3-demo-bucket** （或您上傳應用程式修訂版的儲存貯體名稱）。

   1. 在物件清單中，選擇 **WordPressApp.zip**。

   1. 在 **Overview (概觀)** 標籤上，將 **Link (連結)** 欄位的值複製至剪貼簿。

      這看起來類似下述：

      **https://s3.amazonaws.com/amzn-s3-demo-bucket/WordPressApp.zip**

   1. 返回 CodeDeploy 主控台，並在**修訂位置**貼上**連結**欄位值。

1. 如果說明無法偵測到檔案類型的訊息出現在 **File type (檔案類型)** 清單中，請選擇 **.zip**。

1. (選用) 在 **Deployment description (部署說明)** 方塊中，輸入註解。

1. 展開**部署群組覆寫**，然後從**部署組態**中選擇 **CodeDeployDefault.OneAtATime**。

1. 選擇 **Start deployment (啟動部署)**。新建立部署的相關資訊會顯示在 **Deployments (部署)** 頁面上。

## 監控您的部署並進行疑難排解
<a name="tutorials-wordpress-deploy-application-monitor"></a>

使用 AWS CLI 或 主控台來監控和疑難排解您的部署。

**Topics**
+ [監控部署並進行疑難排解 (CLI)](#tutorials-wordpress-deploy-application-monitor-cli)
+ [監控和故障診斷部署 (主控台)](#tutorials-wordpress-deploy-application-monitor-console)

### 監控部署並進行疑難排解 (CLI)
<a name="tutorials-wordpress-deploy-application-monitor-cli"></a>

1. 針對名為 **WordPress\$1App** 的應用程式和名為 **WordPress\$1DepGroup** 的部署群組呼叫 **list-deployments** 命令，來取得部署 ID：

   ```
   aws deploy list-deployments --application-name WordPress_App --deployment-group-name WordPress_DepGroup --query 'deployments' --output text
   ```

1. 使用部署 ID，呼叫 **get-deployment** 命令：

   ```
   aws deploy get-deployment --deployment-id deploymentID --query 'deploymentInfo.status' --output text
   ```

1. 此命令傳回部署的整體狀態。如果成功，值為 `Succeeded`。

   如果整體狀態為 `Failed`，您可以呼叫 [list-deployment-instances](https://docs.aws.amazon.com/cli/latest/reference/deploy/list-deployment-instances.html) 和 [get-deployment-instance](https://docs.aws.amazon.com/cli/latest/reference/deploy/get-deployment-instance.html) 等命令進行故障診斷。如需其他故障診斷選項，請參閱[分析日誌檔案以調查執行個體的部署失敗](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures)。

### 監控和故障診斷部署 (主控台)
<a name="tutorials-wordpress-deploy-application-monitor-console"></a>

在 CodeDeploy 主控台的**部署**頁面上，您可以在狀態欄中監控部署**的狀態**。

若要取得部署的詳細資訊，特別是在 **Status (狀態)** 欄位中，有任何數值不是 **Succeeded (成功)** 的情況下，則可執行以下動作：

1. 在 **Deployments (部署)** 資料表中，選擇部署的名稱。部署失敗後，會顯示失敗原因的訊息。

1. 在 **Instance activity (執行個體活動)** 中，會顯示更多有關部署的資訊。部署失敗後，您可能可以判斷部署失敗的 Amazon EC2 執行個體和步驟。

1. 您可以使用[使用 CodeDeploy 檢視執行個體詳細資訊](instances-view-details.md)中所述的這類技術，藉此執行其他疑難排解。您也可以分析 Amazon EC2 執行個體上的部署日誌檔案。如需詳細資訊，請參閱[分析日誌檔案以調查執行個體的部署失敗](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures)。

## 驗證您的部署
<a name="tutorials-wordpress-deploy-application-verify-deployment"></a>

在您的部署成功之後，請驗證 WordPress 安裝是否運作中。使用 Amazon EC2 執行個體的公有 DNS 地址，後面接著 `/WordPress`，在 Web 瀏覽器中檢視您的網站。（若要取得公有 DNS 值，請在 Amazon EC2 主控台中選擇 Amazon EC2 執行個體，然後在**描述**索引標籤上尋找**公有 DNS** 的值。)

例如，如果 Amazon EC2 執行個體的公有 DNS 地址為 **ec2-01-234-567-890.compute-1.amazonaws.com**，您可以使用下列 URL：

```
http://ec2-01-234-567-890.compute-1.amazonaws.com/WordPress
```

當您在瀏覽器中檢視網站時，您應該會看到 WordPress 歡迎頁面，類似如下所示：

![\[WordPress 歡迎頁面\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/WordPress-Welcome-Page-013118.png)


 如果您的 Amazon EC2 執行個體沒有將 HTTP 傳入規則新增至其安全群組，則不會顯示 WordPress 歡迎頁面。如果您看到訊息指出遠端伺服器未回應，請確定 Amazon EC2 執行個體的安全群組具有傳入規則。如需詳細資訊，請參閱[新增允許 HTTP 流量至 Amazon Linux 或 RHEL Amazon EC2 執行個體的傳入規則新增允許 HTTP 流量至 Windows Server Amazon EC2 執行個體的傳入規則](tutorials-wordpress-launch-instance.md#tutorials-wordpress-launch-instance-add-inbound-rule)。

# 步驟 5：更新並重新部署 WordPress 應用程式
<a name="tutorials-wordpress-update-and-redeploy-application"></a>

現在您已成功部署應用程式修訂版，請在開發機器上更新 WordPress 程式碼，然後使用 CodeDeploy 重新部署網站。之後，您應該會在 Amazon EC2 執行個體上看到程式碼變更。

**Topics**
+ [設定 WordPress 網站](#tutorials-wordpress-update-and-redeploy-application-configure-and-install)
+ [修改網站](#tutorials-wordpress-update-and-redeploy-application-modify-code)
+ [重新部署網站](#tutorials-wordpress-update-and-redeploy-application-deploy-updates)

## 設定 WordPress 網站
<a name="tutorials-wordpress-update-and-redeploy-application-configure-and-install"></a>

若要查看程式碼變更的效果，請完成設定 WordPress 網站，以便您有一個功能完整的安裝。

1. 將網站的 URL 輸入 Web 瀏覽器中。URL 是 Amazon EC2 執行個體加上`/WordPress`延伸模組的公有 DNS 地址。對於此範例 WordPress 網站 （以及範例 Amazon EC2 執行個體公有 DNS 地址），URL 為 **http://ec2-01-234-567-890.compute-1.amazonaws.com/WordPress**。

1. 如果您尚未設定網站，則會顯示預設的 WordPress 歡迎頁面。選擇 **Let's go\$1 (開始吧！)**。

1. 若要使用預設的 MySQL 資料庫，請在資料庫組態頁面中輸入以下值：
   + **資料庫名稱**：**test**
   + **使用者名稱**：**root**
   + **密碼**：保留空白。
   + **資料庫主機**：**localhost**
   + **資料表字首**：**wp\$1**

   選擇 **Submit (提交)** 以設定資料庫。

1. 繼續進行網站設定。在 **Welcome (歡迎)** 頁面上，填入任意值，然後選擇 **Install WordPress (安裝 WordPress)**。當安裝完成後，您就可以登入您的儀表板。

**重要**  
 在部署 WordPress 應用程式期間，**change\$1permissions.sh** 指令碼已更新 `/tmp/WordPress` 資料夾的許可，以便任何人都可以寫入。現在是時候執行以下命令來限制許可，以便只有擁有者 (您) 可以寫入：  

```
chmod -R 755 /var/www/html/WordPress
```

## 修改網站
<a name="tutorials-wordpress-update-and-redeploy-application-modify-code"></a>

若要修改 WordPress 網站，請移至開發機器上的應用程式資料夾：

```
cd /tmp/WordPress
```

若要修改網站的一些顏色，請在 `wp-content/themes/twentyfifteen/style.css` 檔案中，使用文字編輯器或 **sed** 將 `#fff` 變更為 `#768331`。

在 Linux 或具有 GNU **sed** 的其他系統上，使用：

```
sed -i 's/#fff/#768331/g' wp-content/themes/twentyfifteen/style.css
```

在 macOS、Unix 或具有 BSD **sed** 的其他系統上，使用：

```
sed -i '' 's/#fff/#768331/g' wp-content/themes/twentyfifteen/style.css
```

## 重新部署網站
<a name="tutorials-wordpress-update-and-redeploy-application-deploy-updates"></a>

現在您已修改網站的程式碼，請使用 Amazon S3 和 CodeDeploy 重新部署網站。

將變更綁定並上傳至 Amazon S3，如中所述[將應用程式的檔案綁定到單一封存檔案中，並推送封存檔案](tutorials-wordpress-upload-application.md#tutorials-wordpress-upload-application-bundle-and-push-archive)。(當您遵循這些說明時，請記住您不需要建立應用程式)。如以前一樣將相同的金鑰給予新的修訂 (**WordPressApp.zip**)。將其上傳至您先前建立的相同 Amazon S3 儲存貯體 （例如 **amzn-s3-demo-bucket**)。

使用 AWS CLI、CodeDeploy 主控台或 CodeDeploy APIs重新部署網站。

**Topics**
+ [重新部署網站 (CLI)](#tutorials-wordpress-update-and-redeploy-application-deploy-updates-cli)
+ [重新部署網站 (主控台)](#tutorials-wordpress-update-and-redeploy-application-deploy-updates-console)

### 重新部署網站 (CLI)
<a name="tutorials-wordpress-update-and-redeploy-application-deploy-updates-cli"></a>

呼叫 **create-deployment** 命令來根據新上傳的修訂版建立部署。使用名為 **WordPress\$1App**的應用程式、名為 **CodeDeployDefault.OneAtATime** 的部署組態、名為 **WordPress\$1DepGroup**的部署群組、名為 **WordPressApp.zip** 的修訂版 (在名為 **amzn-s3-demo-bucket**的儲存貯體中)：

```
 aws deploy create-deployment \
  --application-name WordPress_App \
  --deployment-config-name CodeDeployDefault.OneAtATime \
  --deployment-group-name WordPress_DepGroup \  
  --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=WordPressApp.zip
```

您可以檢查部署的狀態，如[監控您的部署並進行疑難排解](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)中所述。

CodeDeploy 重新部署網站之後，請在 Web 瀏覽器中重新瀏覽網站，以確認顏色已變更。(您可能需要重新整理瀏覽器)。如果顏色已經變更，那麼恭喜！您已成功修改並重新部署該網站！

### 重新部署網站 (主控台)
<a name="tutorials-wordpress-update-and-redeploy-application-deploy-updates-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

1. 在應用程式清單中，選擇 **WordPress\$1App**。

1. 在 **Deployment groups (部署群組)** 標籤上，選擇 **WordPress\$1DepGroup**。

1. 選擇 **Create deployment (建立部署)**。

1. 請在 **Create deployment (建立部署)** 頁面上，執行以下操作：

   1. 在 **Deployment group (部署群組)** 中，選擇 **WordPress\$1DepGroup**。

   1. 在**儲存庫類型**區域中，選擇**我的應用程式存放在 Amazon S3 中**，然後將修訂的 Amazon S3 連結複製到**修訂位置**方塊中。尋找連結值：

      1. 在單獨的瀏覽器標籤中：

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

          瀏覽並開啟 **amzn-s3-demo-bucket**，然後選擇您的修訂版本 **WordPressApp.zip**。

      1.  如果在 Amazon S3 主控台中看不到**屬性**窗格，請選擇**屬性**按鈕。

      1.  在**屬性**窗格中，將**連結**欄位的值複製到 CodeDeploy 主控台中的**修訂位置**方塊。

   1. 如果出現無法偵測檔案類型的訊息，則請選擇 **.zip (.zip)**。

   1. 將 **Deployment description (部署說明)** 方塊留白。

   1. 展開**部署群組覆寫**，然後從**部署組態**中選擇 **CodeDeployDefault.OneAtATime**。

   1. 選擇 **Start deployment (啟動部署)**。新建立部署的相關資訊會顯示在 **Deployments (部署)** 頁面上。

   1. 您可以檢查部署的狀態，如[監控您的部署並進行疑難排解](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)中所述。

      CodeDeploy 重新部署網站之後，請在 Web 瀏覽器中重新瀏覽網站，以確認顏色已變更。(您可能需要重新整理瀏覽器)。如果顏色已經變更，那麼恭喜！您已成功修改並重新部署該網站！

# 步驟 6：清除 WordPress 應用程式和相關資源
<a name="tutorials-wordpress-clean-up"></a>

您現在已成功更新 WordPress 程式碼並且已重新部署網站。為了避免本教學中所建立的資源持續發生費用，您應該刪除：
+ 任何 CloudFormation 堆疊 （或終止任何 Amazon EC2 執行個體，如果您在 外部建立這些執行個體 CloudFormation)。
+ 任何 Amazon S3 儲存貯體。
+ CodeDeploy 中的`WordPress_App`應用程式。
+ CodeDeploy 代理程式 AWS Systems Manager 的狀態管理員關聯。

您可以使用 AWS CLI、 CloudFormation、Amazon S3、Amazon EC2 和 CodeDeploy 主控台或 AWS APIs來執行清除。

**Topics**
+ [清除資源 (CLI)](#tutorials-wordpress-clean-up-cli)
+ [清除資源 (主控台)](#tutorials-wordpress-clean-up-console)
+ [後續步驟？](#tutorials-wordpress-clean-up-whats-next)

## 清除資源 (CLI)
<a name="tutorials-wordpress-clean-up-cli"></a>

1. 如果您將我們的 CloudFormation 範本用於本教學課程，請針對名為 的堆疊呼叫 **delete-stack**命令**CodeDeployDemoStack**。這將終止所有隨附的 Amazon EC2 執行個體，並刪除堆疊建立的所有隨附 IAM 角色：

   ```
   aws cloudformation delete-stack --stack-name CodeDeployDemoStack
   ```

1. 若要刪除 Amazon S3 儲存貯體，請針對名為 的儲存貯體使用 **--recursive** 切換來呼叫 **rm**命令**amzn-s3-demo-bucket**。這會刪除儲存貯體以及儲存貯體中的所有物件：

   ```
   aws s3 rm s3://amzn-s3-demo-bucket --recursive --region region
   ```

1. 若要刪除 `WordPress_App` 應用程式，請呼叫 **delete-application** 命令。這也會刪除應用程式的所有相關聯部署群組記錄和部署記錄：

   ```
   aws deploy delete-application --application-name WordPress_App
   ```

1. 若要刪除 Systems Manager 狀態管理員關聯，請呼叫 **delete-association**命令。

   ```
   aws ssm delete-association --assocation-id association-id
   ```

   您可以呼叫 **describe-association**命令來取得 *association-id*。

   ```
   aws ssm describe-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo
   ```

如果您未在本教學課程中使用 CloudFormation 堆疊，請呼叫 **terminate-instances**命令來終止您手動建立的任何 Amazon EC2 執行個體。提供 Amazon EC2 執行個體的 ID 以終止：

```
aws ec2 terminate-instances --instance-ids instanceId
```

## 清除資源 (主控台)
<a name="tutorials-wordpress-clean-up-console"></a>

如果您將我們的 CloudFormation 範本用於本教學課程，請刪除相關聯的 CloudFormation 堆疊。

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

1. 在**篩選條件**方塊中，輸入您先前建立的 CloudFormation 堆疊名稱 （例如，**CodeDeployDemoStack**)。

1. 選取堆疊名稱旁的方塊。在 **Actions (動作)** 選單中，選擇 **Delete Stack (刪除堆疊)**。

   CloudFormation 會刪除堆疊、終止所有隨附的 Amazon EC2 執行個體，以及刪除所有隨附的 IAM 角色。

若要終止您在 CloudFormation 堆疊外部建立的 Amazon EC2 執行個體：

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

1. 在 **INSTANCES (執行個體)** 清單中，選擇 **Instances (執行個體)**。

1. 在搜尋方塊中，輸入您要終止的 Amazon EC2 執行個體名稱 （例如 **CodeDeployDemo**)，然後按 Enter 鍵。

1. 選擇 Amazon EC2 執行個體名稱。

1. 在 **Actions (動作)** 選單中，指向 **Instance State (執行個體狀態)**，然後選擇 **Terminate (終止)**。出現提示時，選擇 **Yes, Terminate (是，終止)**。

為每個執行個體重複這些步驟。

若要刪除 Amazon S3 儲存貯體：

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

1. 在儲存貯體清單中，瀏覽並選擇您先前建立的 Amazon S3 儲存貯體名稱 （例如 **amzn-s3-demo-bucket**)。

1. 您必須先刪除其內容，才能刪除儲存貯體。選擇儲存貯體中的所有檔案，例如 **WordPressApp.zip**。在**操作**功能表中，選擇**刪除**。出現提示要您確認刪除時，選擇 **OK (確定)**。

1. 儲存貯體清空之後，您即可刪除儲存貯體。在儲存貯體清單中，選擇儲存貯體的資料列 (但不是儲存貯體名稱)。選擇 **Delete bucket (刪除儲存貯體)**，然後在出現確認提示時，選擇 **OK (確定)**。

若要從 CodeDeploy 刪除`WordPress_App`應用程式：

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

1. 在應用程式清單中，選擇 **WordPress\$1App**。

1. 在 **Application details (應用程式詳細資訊)** 頁面上，選擇 **Delete application (刪除應用程式)**。

1. 當系統出現提示時，請輸入應用程式的名稱，以確認要執行刪除動作，接著選擇 **Delete (刪除)**。

若要刪除 Systems Manager 狀態管理員關聯：

1. 在 https：//https://console.aws.amazon.com/systems-manager 開啟 AWS Systems Manager 主控台。

1. 在導覽窗格中，選擇 **State Manager (狀態管理員)**。

1. 選擇您建立的關聯，然後選擇 **Delete (刪除)**。

## 後續步驟？
<a name="tutorials-wordpress-clean-up-whats-next"></a>

如果您已到達這裡，恭喜您！您已成功完成 CodeDeploy 部署，然後更新網站的程式碼並重新部署。

# 教學課程：部署 "hello， world！" 應用程式搭配 CodeDeploy (Windows Server)
<a name="tutorials-windows"></a>

在本教學課程中，您將單一網頁部署至執行網際網路資訊服務 (IIS) 做為其 Web 伺服器的單一 Windows Server Amazon EC2 執行個體。此網頁會顯示簡單的「Hello， World！」 訊息。

不是您想找的內容嗎？
+ 若要改為練習部署到 Amazon Linux 或 Red Hat Enterprise Linux (RHEL) Amazon EC2 執行個體，請參閱 [教學課程：將 WordPress 部署到 Amazon EC2 執行個體 (Amazon Linux 或 Red Hat Enterprise Linux 和 Linux、macOS 或 Unix)](tutorials-wordpress.md)。
+ 若要練習改為部署至現場部署執行個體，請參閱[教學課程：使用 CodeDeploy 將應用程式部署至內部部署執行個體 (Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)。

本教學課程的步驟會從 Windows 觀點進行說明。雖然您可以在執行 Linux、macOS 或 Unix 的本機電腦上完成大部分的步驟，但您必須調整涵蓋 Windows 型目錄路徑的步驟，例如 `c:\temp`。此外，如果您想要連線至 Amazon EC2 執行個體，您需要可透過遠端桌面通訊協定 (RDP) 連線至執行 Windows Server 的 Amazon EC2 執行個體的用戶端應用程式。(根據預設，Windows 包含 RDP 連線用戶端應用程式)。

開始本教學課程之前，您必須完成 中的先決條件[CodeDeploy 入門](getting-started-codedeploy.md)，包括設定使用者、安裝或升級 AWS CLI，以及建立 IAM 執行個體描述檔和服務角色。

**Topics**
+ [步驟 1：啟動 Windows Server Amazon EC2 執行個體](tutorials-windows-launch-instance.md)
+ [步驟 2：設定您的來源內容以部署至 Windows Server Amazon EC2 執行個體](tutorials-windows-configure-content.md)
+ [步驟 3：上傳您的「hello， world！」 應用程式至 Amazon S3](tutorials-windows-upload-application.md)
+ [步驟 4：部署您的 Hello World 應用程式](tutorials-windows-deploy-application.md)
+ [步驟 5：更新並重新部署您的「hello， world！」 應用程式](tutorials-windows-update-and-redeploy-application.md)
+ [步驟 6：清除您的 "hello， world！" 應用程式和相關資源](tutorials-windows-clean-up.md)

# 步驟 1：啟動 Windows Server Amazon EC2 執行個體
<a name="tutorials-windows-launch-instance"></a>

若要使用 CodeDeploy 部署 Hello World 應用程式，您需要執行 Windows Server 的 Amazon EC2 執行個體。

請遵循中的說明進行[為 CodeDeploy 建立 Amazon EC2 執行個體](instances-ec2-create.md) 當您準備好將 Amazon EC2 執行個體標籤指派給執行個體時，請務必指定 的標籤索引鍵**Name**和 的標籤值**CodeDeployDemo**。(如果您指定不同的標籤鍵或標籤值，[步驟 4：部署您的 Hello World 應用程式](tutorials-windows-deploy-application.md)中的說明可能會產生非預期的結果)。

啟動 Amazon EC2 執行個體後，請返回此頁面並繼續下一節。請不要繼續進行[使用 CodeDeploy 建立應用程式](applications-create.md)做為下一步。

## 連線至 Amazon EC2 執行個體
<a name="tutorials-windows-launch-instance-connect"></a>

啟動 Amazon EC2 執行個體之後，請依照這些指示來練習與其連線。

**注意**  
在這些說明中，假設您正在執行 Windows 和 Windows 桌面連線用戶端應用程式。如需詳細資訊，請參閱[使用 RDP 連線至 Windows 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html)。您可能需要針對其他作業系統或其他 RDP 連線用戶端應用程式調整這些說明。

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

1. 在導覽窗格的 **Instances (執行個體)** 下方，選擇 **Instances (執行個體)**。

1. 瀏覽並選擇清單中的 Windows Server 執行個體。

1. 選擇**連線**。

1. 選擇 **Get Password (取得密碼)**，然後選擇 **Choose File (選擇檔案)**。

1. 瀏覽並選擇與 Windows Server Amazon EC2 執行個體相關聯的 Amazon EC2 執行個體金鑰對檔案，然後選擇**開啟**。

1. 選擇 **Decrypt Password** (解密密碼)。請記下顯示的密碼。您在步驟 10 會用到。

1. 選擇 **Download Remote Desktop File (下載遠端桌面檔案)**，然後開啟檔案。

1. 即使無法識別遠端連線發佈者的情況下，如果系統依然提示您連線，請繼續。

1. 輸入您於步驟 7 記下的密碼，然後繼續。(如果您的 RDP 連線用戶端應用程式提示您輸入使用者名稱，請輸入 **Administrator**)。

1. 在即使無法驗證遠端電腦身分的情況下，如果系統依然提示您連線，請繼續。

1. 連線之後，即會顯示執行 Windows Server 的 Amazon EC2 執行個體桌面。

1. 您現在可以中斷與 Amazon EC2 執行個體的連線。
**警告**  
請不要停止或終止執行個體。否則，CodeDeploy 無法部署至其中。

## 新增允許 HTTP 流量至 Windows Server Amazon EC2 執行個體的傳入規則
<a name="tutorials-windows-launch-instance-add-inbound-rule"></a>

下一步確認您的 Amazon EC2 執行個體具有開放的 HTTP 連接埠，因此您可以在瀏覽器中查看 Windows Server Amazon EC2 執行個體上部署的網頁。

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

1. 選擇**執行個體**，然後選擇您的執行個體。

1. 在**描述**索引標籤**的安全群組**下，選擇**檢視傳入規則**。

   您應該會在安全群組中看到規則清單，如下所示：

   ```
   Security Groups associated with i-1234567890abcdef0
    Ports     Protocol     Source     launch-wizard-N
    22        tcp          0.0.0.0/0          ✔
   ```

1.  在**安全群組**下，選擇 Amazon EC2 執行個體的安全群組。其可能被命名為 **launch-wizard-*N***。名稱中的 ***N*** 是一個您的執行個體建立時指派到安全群組的數字。

    選擇 **Inbound (傳入)** 標籤。如果執行個體的安全群組設定正確，您應該會看到具有下列值的規則：
   + **類型**：HTTP
   + **Protocol (通訊協定)**：TCP
   + **Port Range (連接埠範圍)**：80
   + **來源**：0.0.0.0/0

1.  如果您沒有看到具有這些值的規則，請使用將[規則新增至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#adding-security-group-rule)中的程序，將規則新增至新的安全規則。

# 步驟 2：設定您的來源內容以部署至 Windows Server Amazon EC2 執行個體
<a name="tutorials-windows-configure-content"></a>

現在是時候設定應用程式的來源內容，讓您可以部署到 Amazon EC2 執行個體。在本教學課程中，您將部署單一網頁至執行 Windows Server 的 Amazon EC2 執行個體，該執行個體將執行網際網路資訊服務 (IIS) 做為其 Web 伺服器。此網頁會顯示簡單的「Hello， World！」 訊息。

**Topics**
+ [建立網頁](#tutorials-windows-configure-content-download-code)
+ [建立指令碼以執行您的應用程式](#tutorials-windows-configure-content-create-scripts)
+ [新增應用程式規格檔案](#tutorials-windows-configure-content-add-appspec-file)

## 建立網頁
<a name="tutorials-windows-configure-content-download-code"></a>

1. 在 `c:\temp` 資料夾中建立名為 `HelloWorldApp` 的子目錄 (子資料夾)，然後切換至該資料夾。

   ```
   mkdir c:\temp\HelloWorldApp
   cd c:\temp\HelloWorldApp
   ```
**注意**  
您不需要使用 `c:\temp` 位置或 `HelloWorldApp` 子資料夾名稱。如果您使用不同的位置或子資料夾名稱，請務必在本教學中予以使用。

1. 使用文字編輯器，在資料夾內建立檔案。將檔案命名為 `index.html`。

   ```
   notepad index.html
   ```

1. 將下列 HTML 程式碼新增至檔案，然後儲存檔案。

   ```
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
   <html>
   <head>
     <title>Hello, World!</title>
     <style>
       body {
         color: #ffffff;
         background-color: #0188cc;
         font-family: Arial, sans-serif;  
         font-size:14px;
       }
     </style>
   </head>
   <body>
     <div align="center"><h1>Hello, World!</h1></div>
     <div align="center"><h2>You have successfully deployed an application using CodeDeploy</h2></div>
     <div align="center">
       <p>What to do next? Take a look through the <a href="https://aws.amazon.com/codedeploy">CodeDeploy Documentation</a>.</p>
     </div>
   </body>
   </html>
   ```

## 建立指令碼以執行您的應用程式
<a name="tutorials-windows-configure-content-create-scripts"></a>

接著，您將建立 CodeDeploy 用來在目標 Amazon EC2 執行個體上設定 Web 伺服器的指令碼。

1. 在 `index.html` 檔案儲存所在的相同子資料夾中，使用文字編輯器來建立另一個檔案。將檔案命名為 `before-install.bat`。

   ```
   notepad before-install.bat
   ```

1. 將下列批次指令碼程式碼新增至檔案，然後儲存檔案。

   ```
   REM Install Internet Information Server (IIS).
   c:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe -Command Import-Module -Name ServerManager
   c:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe -Command Install-WindowsFeature Web-Server
   ```

## 新增應用程式規格檔案
<a name="tutorials-windows-configure-content-add-appspec-file"></a>

接下來，除了網頁和批次指令碼檔案之外，您還會新增應用程式規格檔案 (AppSpec 檔案）。AppSpec 檔案是 CodeDeploy [http://www.yaml.org](http://www.yaml.org)用來：
+ 將應用程式修訂中的來源檔案，映射至執行個體上的目標。
+ 指定要在部署期間於執行個體上執行的指令碼。

AppSpec 檔案必須命名為 `appspec.yml`。它必須放置在應用程式來源碼的根資料夾中。

1. 在 `index.html` 和 `before-install.bat` 檔案儲存所在的相同子資料夾中，使用文字編輯器來建立另一個檔案。將檔案命名為 `appspec.yml`。

   ```
   notepad appspec.yml
   ```

1. 將下列 YAML 程式碼新增至檔案，然後儲存檔案。

   ```
   version: 0.0
   os: windows
   files:
     - source: \index.html
       destination: c:\inetpub\wwwroot
   hooks:
     BeforeInstall:
       - location: \before-install.bat
         timeout: 900
   ```

CodeDeploy 將使用此 AppSpec 檔案，將應用程式原始碼根資料夾中`index.html`的檔案複製到目標 Amazon EC2 執行個體上的 `c:\inetpub\wwwroot` 資料夾。在部署期間，CodeDeploy 會在**BeforeInstall**部署生命週期事件期間，在目標 Amazon EC2 執行個體上執行`before-install.bat`批次指令碼。如果此指令碼需要超過 900 秒 (15 分鐘） 才能執行，CodeDeploy 會停止部署，並將 Amazon EC2 執行個體的部署標記為失敗。

如需這些設定的詳細資訊，請參閱[CodeDeploy AppSpec 檔案參考](reference-appspec-file.md)。

**重要**  
此檔案中每個項目之間的空格位置和數目十分重要。如果間距不正確，CodeDeploy 將引發可能難以偵錯的錯誤。如需詳細資訊，請參閱[AppSpec 檔案間距](reference-appspec-file.md#reference-appspec-file-spacing)。

# 步驟 3：上傳您的「hello， world！」 應用程式至 Amazon S3
<a name="tutorials-windows-upload-application"></a>

現在，您將準備來源內容並將其上傳至 CodeDeploy 可以從中部署該內容的位置。下列指示說明如何佈建 Amazon S3 儲存貯體、準備儲存貯體的應用程式修訂版檔案、綁定修訂版的檔案，然後將修訂版推送至儲存貯體。

**注意**  
雖然本教學課程未涵蓋，但您可以使用 CodeDeploy 將應用程式從 GitHub 儲存庫部署到執行個體。如需詳細資訊，請參閱[將 CodeDeploy 與 GitHub 整合](integrations-partners-github.md)。

**Topics**
+ [佈建 Amazon S3 儲存貯體](#tutorials-windows-upload-application-create-s3-bucket)
+ [準備儲存貯體的應用程式檔案](#tutorials-windows-upload-application-prepare-application-files)
+ [將應用程式的檔案綁定到單一封存檔案中，並推送封存檔案](#tutorials-windows-upload-application-bundle-and-push-archive)

## 佈建 Amazon S3 儲存貯體
<a name="tutorials-windows-upload-application-create-s3-bucket"></a>

在 Amazon S3 中建立儲存容器或*儲存貯*體，或使用現有的儲存貯體。請確定您可以將修訂版上傳至儲存貯體，而且部署中使用的 Amazon EC2 執行個體可以從儲存貯體下載修訂版。

您可以使用 AWS CLI、Amazon S3 主控台或 Amazon S3 APIs 來建立 Amazon S3 儲存貯體。建立儲存貯體之後，請務必將存取許可授予儲存貯體和 CodeDeploy 使用者。

**注意**  
所有 AWS 帳戶的 Amazon S3 儲存貯體名稱必須是唯一的。如果您無法使用 **amzn-s3-demo-bucket**，請嘗試不同的儲存貯體名稱 (例如後接破折號和您的縮寫或其他唯一識別符的 **amzn-s3-demo-bucket**)。然後，請務必將在本教學中看到的所有 **amzn-s3-demo-bucket** 都替代為您的儲存貯體名稱。  
Amazon S3 儲存貯體必須在啟動目標 Amazon EC2 執行個體的相同 AWS 區域中建立。例如，如果您在美國東部 （維吉尼亞北部） 區域建立儲存貯體，則必須在美國東部 （維吉尼亞北部） 區域啟動目標 Amazon EC2 執行個體。

**Topics**
+ [建立 Amazon S3 儲存貯體 (CLI)](#tutorials-windows-upload-application-create-s3-bucket-cli)
+ [建立 Amazon S3 儲存貯體 （主控台）](#tutorials-windows-upload-application-create-s3-bucket-console)
+ [將許可授予 Amazon S3 儲存貯體和 AWS 您的帳戶](#tutorials-windows-upload-application-create-s3-bucket-grant-permission)

### 建立 Amazon S3 儲存貯體 (CLI)
<a name="tutorials-windows-upload-application-create-s3-bucket-cli"></a>

呼叫 **mb**命令來建立名為 的 Amazon S3 儲存貯體**amzn-s3-demo-bucket**：

```
aws s3 mb s3://amzn-s3-demo-bucket --region region
```

### 建立 Amazon S3 儲存貯體 （主控台）
<a name="tutorials-windows-upload-application-create-s3-bucket-console"></a>

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

1. 在 Amazon S3 主控台中，選擇**建立儲存貯**體。

1. 在 **Bucket name (儲存貯體名稱)** 方塊中，輸入儲存貯體的名稱。

1. 在 **Region (區域)** 清單中，選擇目標區域，然後選擇 **Create (建立)**。

### 將許可授予 Amazon S3 儲存貯體和 AWS 您的帳戶
<a name="tutorials-windows-upload-application-create-s3-bucket-grant-permission"></a>

您必須具有上傳到 Amazon S3 儲存貯體的許可。您可以透過 Amazon S3 儲存貯體政策指定這些許可。例如，在下列 Amazon S3 儲存貯體政策中，使用萬用字元 (\$1) `111122223333` 可讓 AWS 帳戶將檔案上傳至名為 的 Amazon S3 儲存貯體中的任何目錄`amzn-s3-demo-bucket`：

```
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "111122223333"
                ]
            }
        }
    ]
}
```

若要檢視 AWS 您的帳戶 ID，請參閱[尋找 AWS 您的帳戶 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId)。

現在是驗證 Amazon S3 儲存貯體是否允許從每個參與的 Amazon EC2 執行個體下載請求的好時機。您可以透過 Amazon S3 儲存貯體政策指定此項目。例如，在下列 Amazon S3 儲存貯體政策中，使用萬用字元 (\$1) 允許任何具有連接 IAM 執行個體描述檔的 Amazon EC2 執行個體`arn:aws:iam::444455556666:role/CodeDeployDemo`，其中包含 ARN，從名為 的 Amazon S3 儲存貯體中的任何目錄下載檔案`amzn-s3-demo-bucket`：

```
{
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::444455556666:role/CodeDeployDemo"
                ]
            }
        }
    ]
}
```

如需有關如何產生和連接 Amazon S3 儲存貯體政策的資訊，請參閱[儲存貯體政策範例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)。

您在 中建立的 CodeDeploy 管理使用者[步驟 1：設定](getting-started-setting-up.md)也必須具有將修訂上傳至 Amazon S3 儲存貯體的許可。其中一種指定方式是透過您新增至使用者許可集或 IAM 角色 （您允許使用者擔任） 的 IAM 政策。下列 IAM 政策允許使用者在名為 的 Amazon S3 儲存貯體中的任何位置上傳修訂`amzn-s3-demo-bucket`：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	   
  "Statement":[
    {
      "Effect":"Allow",
      "Action":["s3:PutObject"],
      "Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"
    }
  ]
}
```

------

如需如何建立 IAM 政策的資訊，請參閱《[IAM 使用者指南》中的建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。 **如需將政策新增至許可集的資訊，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[建立許可集](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)。

## 準備儲存貯體的應用程式檔案
<a name="tutorials-windows-upload-application-prepare-application-files"></a>

請確定網頁、AppSpec 檔案和指令碼在您的開發機器上組織如下：

```
c:\
  |-- temp\
        |--HelloWorldApp\
             |-- appspec.yml
             |-- before-install.bat
             |-- index.html
```

## 將應用程式的檔案綁定到單一封存檔案中，並推送封存檔案
<a name="tutorials-windows-upload-application-bundle-and-push-archive"></a>

將檔案綁定到封存檔案 (稱為應用程式「修訂版本」**)。

**注意**  
可能會向您收取下列作業的費用：在儲存貯體中存放物件，以及將應用程式修訂傳入和傳出儲存貯體。如需詳細資訊，請參閱 [Simple Storage Service (Amazon S3) 定價](https://aws.amazon.com/s3/pricing/)。

1. 在開發電腦上，切換至檔案存放所在的資料夾：

   ```
   cd c:\temp\HelloWorldApp
   ```
**注意**  
如果您未切換至此資料夾，將會在目前的資料夾開始檔案綁定。例如，如果您的目前資料夾是 `c:\temp`，而不是 `c:\temp\HelloWorldApp`，將會開始綁定 `c:\temp` 資料夾中的檔案和子資料夾，而此資料夾可能不只包含 `HelloWorldApp` 子資料夾。

1. 呼叫 **create-application**命令，向 CodeDeploy **HelloWorld\$1App** 註冊名為 的新應用程式：

   ```
   aws deploy create-application --application-name HelloWorld_App
   ```

1. 呼叫 CodeDeploy [推送](https://docs.aws.amazon.com/cli/latest/reference/deploy/push.html)命令，將檔案綁定在一起、上傳修訂至 Amazon S3，以及向 CodeDeploy 註冊有關上傳修訂的資訊，全部都在一個動作中。

   ```
   aws deploy push --application-name HelloWorld_App --s3-location s3://amzn-s3-demo-bucket/HelloWorld_App.zip --ignore-hidden-files
   ```

   此命令會將目前目錄中的檔案 （不含任何隱藏檔案） 封裝至名為 的單一封存檔案`HelloWorld_App.zip`、上傳修訂至 儲存**amzn-s3-demo-bucket**貯體，以及向 CodeDeploy 註冊有關上傳修訂的資訊。

# 步驟 4：部署您的 Hello World 應用程式
<a name="tutorials-windows-deploy-application"></a>

現在您已部署上傳到 Amazon S3 的範例 Hello World 應用程式修訂版。您可以使用 AWS CLI 或 CodeDeploy 主控台來部署修訂並監控部署進度。成功部署應用程式修訂版之後，您要檢查結果。

**Topics**
+ [使用 CodeDeploy 部署您的應用程式修訂版](#tutorials-windows-deploy-application-create-deployment)
+ [監控您的部署並進行疑難排解](#tutorials-windows-deploy-application-monitor)
+ [驗證您的部署](#tutorials-windows-deploy-application-verify)

## 使用 CodeDeploy 部署您的應用程式修訂版
<a name="tutorials-windows-deploy-application-create-deployment"></a>

 您可以使用 CLI 或主控台部署您的應用程式。

**Topics**
+ [部署應用程式修訂 (CLI)](#tutorials-windows-deploy-application-create-deployment-cli)
+ [部署應用程式修訂 (主控台)](#tutorials-windows-deploy-application-create-deployment-console)

### 部署應用程式修訂 (CLI)
<a name="tutorials-windows-deploy-application-create-deployment-cli"></a>

1. 首先，部署需要部署群組。不過，在您建立部署群組之前，需要服務角色 ARN。服務角色是 IAM 角色，提供服務代表您採取行動的許可。在此情況下，服務角色會授予 CodeDeploy 存取 Amazon EC2 執行個體的許可，以展開 （讀取） 其 Amazon EC2 執行個體標籤。

   您應該已經遵循[建立服務角色 (CLI)](getting-started-create-service-role.md#getting-started-create-service-role-cli) 中的說明，來建立服務角色。若要取得服務角色的 ARN，請參閱[取得服務角色 ARN (CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli)。

1. 現在您已擁有 ARN，請呼叫 **create-deployment-group**命令來建立名為 的部署群組**HelloWorld\$1DepGroup**，此群組與名為 的應用程式相關聯**HelloWorld\$1App**，並使用名為 的 Amazon EC2 執行個體標籤**CodeDeployDemo**和名為 的部署組態**CodeDeployDefault.OneAtATime**，以及服務角色 ARN：

   ```
   aws deploy create-deployment-group --application-name HelloWorld_App --deployment-group-name HelloWorld_DepGroup --deployment-config-name CodeDeployDefault.OneAtATime --ec2-tag-filters Key=Name,Value=CodeDeployDemo,Type=KEY_AND_VALUE --service-role-arn serviceRoleARN
   ```
**注意**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 命令支援建立觸發，導致將部署和執行個體中指定事件的相關 Amazon SNS 通知傳送給主題訂閱者。命令也支援自動轉返部署和設定警示的選項，以在符合 Amazon CloudWatch 警示中的監控閾值時停止部署。本教學課程不包含這些動作的命令。

1. 建立部署之前，部署群組中的執行個體必須安裝 CodeDeploy 代理程式。您可以使用 AWS Systems Manager 與下列命令，從命令列安裝代理程式：

   ```
   aws ssm create-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo --parameters action=Install,name=AWSCodeDeployAgent --schedule-expression "cron(0 2 ? * SUN *)" 
   ```

   此命令會在 Systems Manager State Manager 中建立關聯，以安裝 CodeDeploy 代理程式，然後嘗試在每週日上午 2：00 進行更新。如需 CodeDeploy 代理程式的詳細資訊，請參閱[使用 CodeDeploy 代理程式](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent.html)。如需 Systems Manager 的詳細資訊，請參閱[什麼是 AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 。

1. 現在，請在名為 **amzn-s3-demo-bucket** 的儲存貯體中使用名為 **HelloWorld\$1App.zip** 的應用程式修訂，呼叫 **create-deployment** 命令來建立與名為 **HelloWorld\$1App** 之應用程式、名為 **CodeDeployDefault.OneAtATime** 之部署組態和名為 **HelloWorld\$1DepGroup** 之部署群組建立關聯的部署：

   ```
   aws deploy create-deployment --application-name HelloWorld_App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name HelloWorld_DepGroup --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=HelloWorld_App.zip
   ```

### 部署應用程式修訂 (主控台)
<a name="tutorials-windows-deploy-application-create-deployment-console"></a>

1. 在使用 CodeDeploy 主控台部署應用程式修訂版之前，您需要服務角色 ARN。服務角色是 IAM 角色，提供服務代表您採取行動的許可。在此情況下，服務角色會授予 CodeDeploy 存取 Amazon EC2 執行個體的許可，以展開 （讀取） 其 Amazon EC2 執行個體標籤。

   您應該已經遵循[建立服務角色 （主控台）](getting-started-create-service-role.md#getting-started-create-service-role-console) 中的說明，來建立服務角色。若要取得服務角色的 ARN，請參閱[取得服務角色 ARN （主控台）](getting-started-create-service-role.md#getting-started-get-service-role-console)。

1. 現在您已擁有 ARN，您可以使用 CodeDeploy 主控台來部署應用程式修訂版。

   登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

1. 選擇 **HelloWorld\$1App**。

1. 在 **Deployment groups (部署群組)** 標籤中，選擇 **Create deployment group (建立部署群組)**。

1. 在 **Deployment group name (部署群組名稱)** 中，輸入 **HelloWorld\$1DepGroup**。

1. 在 **Service Role (服務角色)** 中，選擇服務角色的名稱。

1. 在 **Deployment type (部署類型)** 中，選擇 **In-place (就地)**。

1. 在**環境組態**中，選取 **Amazon EC2 執行個體**。

1. 在**具有 的客服人員組態 AWS Systems Manager**中，保留預設值。

1. 在 **Key (金鑰)** 中，輸入 **Name**。

1. 在 **Value (值)** 中輸入 **CodeDeployDemo**。

1. 在**部署組態**中，選擇 **CodeDeployDefault.OneAtATime**。

1. 在 **Load Balancer (負載平衡器)** 中，清除 **Enable load balancing (啟用負載平衡)**。

1. 選擇 **Create deployment group (建立部署群組)**。

1. 選擇 **Create deployment (建立部署)**。

1. 在 **Deployment group (部署群組)** 中，選擇 **HelloWorld\$1DepGroup**

1. 在**修訂類型**中，選擇**我的應用程式存放在 Amazon S3** 中，然後在**修訂位置**中輸入您先前上傳至 Amazon S3 的範例 Hello World 應用程式修訂的位置。取得位置：

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

   1. 在儲存貯體清單中，選擇 **amzn-s3-demo-bucket** （或您上傳應用程式修訂版的儲存貯體名稱）。

   1. 在物件清單中，選擇 **HelloWorld\$1App.zip**。

   1. 在 **Overview (概觀) **標籤上，選擇 **Copy path (複製路徑)**。

   1. 返回 CodeDeploy 主控台，並在**修訂位置**中貼上**連結**欄位值。

1. 針對 **Revision file type (修訂檔案類型)**，選擇 **.zip**。

1. (選用) 在 **Deployment description (部署描述)** 中輸入註解。

1. 選擇 **Create deployment (建立部署)**。新建立部署的相關資訊會顯示在 **Deployments (部署)** 頁面上。

## 監控您的部署並進行疑難排解
<a name="tutorials-windows-deploy-application-monitor"></a>

使用 AWS CLI 或 主控台來監控和疑難排解您的部署。

**Topics**
+ [監控部署並進行疑難排解 (CLI)](#tutorials-windows-deploy-application-monitor-cli)
+ [監控和故障診斷部署 (主控台)](#tutorials-windows-deploy-application-monitor-console)

### 監控部署並進行疑難排解 (CLI)
<a name="tutorials-windows-deploy-application-monitor-cli"></a>

1. 針對名為 **HelloWorld\$1App** 的應用程式和名為 **HelloWorld\$1DepGroup** 的部署群組呼叫 **list-deployments** 命令，來取得部署 ID：

   ```
   aws deploy list-deployments --application-name HelloWorld_App --deployment-group-name HelloWorld_DepGroup --query "deployments" --output text
   ```

1. 使用部署 ID，呼叫 **get-deployment** 命令：

   ```
   aws deploy get-deployment --deployment-id deploymentID --query "deploymentInfo.status" --output text
   ```

1. 此命令傳回部署的整體狀態。如果成功，值為 `Succeeded`。

   如果整體狀態為 `Failed`，您可以呼叫 [list-deployment-instances](https://docs.aws.amazon.com/cli/latest/reference/deploy/list-deployment-instances.html) 和 [get-deployment-instance](https://docs.aws.amazon.com/cli/latest/reference/deploy/get-deployment-instance.html) 等命令進行故障診斷。如需其他故障診斷選項，請參閱[分析日誌檔案以調查執行個體的部署失敗](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures)。

### 監控和故障診斷部署 (主控台)
<a name="tutorials-windows-deploy-application-monitor-console"></a>

在 CodeDeploy 主控台的**部署**頁面上，您可以在狀態欄中監控部署**的狀態**。

若要取得部署的詳細資訊，特別是在 **Status (狀態)** 欄位中，有任何數值不是 **Succeeded (成功)** 的情況下，則可執行以下動作：

1. 在 **Deployments (部署)** 資料表中，選擇部署 ID。在部署失敗之後，說明失敗原因的訊息會顯示在部署的詳細資訊頁面中。

1. 。 隨即顯示部署執行個體的詳細資訊。部署失敗後，您可能可以判斷部署失敗的 Amazon EC2 執行個體和步驟。

1. 您可以使用[使用 CodeDeploy 檢視執行個體詳細資訊](instances-view-details.md)中所述的這類技術，藉此執行其他疑難排解。您也可以分析 Amazon EC2 執行個體上的部署日誌檔案。如需詳細資訊，請參閱[分析日誌檔案以調查執行個體的部署失敗](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures)。

## 驗證您的部署
<a name="tutorials-windows-deploy-application-verify"></a>

在您的部署成功之後，請驗證安裝運作中。使用 Amazon EC2 執行個體的公有 DNS 地址，在 Web 瀏覽器中檢視網頁。（若要取得公有 DNS 值，請在 Amazon EC2 主控台中選擇 Amazon EC2 執行個體，然後在**描述**索引標籤上尋找**公有 DNS** 中的值。)

例如，如果 Amazon EC2 執行個體的公有 DNS 地址為 **ec2-01-234-567-890.compute-1.amazonaws.com**，您可以使用下列 URL：

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

如果成功，您應該會看到 Hello World 網頁。

# 步驟 5：更新並重新部署您的「hello， world！」 應用程式
<a name="tutorials-windows-update-and-redeploy-application"></a>

現在您已成功部署應用程式修訂版，請在開發機器上更新網頁的程式碼，然後使用 CodeDeploy 重新部署網站。重新部署後，您應該能夠查看 Amazon EC2 執行個體上的變更。

**Topics**
+ [修改網頁](#tutorials-windows-update-and-redeploy-application-modify-code)
+ [重新部署網站](#tutorials-windows-update-and-redeploy-application-deploy-updates)

## 修改網頁
<a name="tutorials-windows-update-and-redeploy-application-modify-code"></a>

1. 移至 `c:\temp\HelloWorldApp` 子資料夾，然後使用文字編輯器修改 `index.html` 檔案：

   ```
   cd c:\temp\HelloWorldApp
   notepad index.html
   ```

1. 修訂 `index.html` 檔案的內容，變更網頁的背景顏色和一些文字，然後儲存檔案。

   ```
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
   <html>
   <head>
     <title>Hello Again, World!</title>
     <style>
       body {
         color: #ffffff;
         background-color: #66cc00;
         font-family: Arial, sans-serif;  
         font-size:14px;
       }
     </style>
   </head>
   <body>
     <div align="center"><h1>Hello Again, World!</h1></div>
     <div align="center"><h2>You have successfully deployed a revision of an application using CodeDeploy</h2></div>
     <div align="center">
       <p>What to do next? Take a look through the <a href="https://aws.amazon.com/codedeploy">CodeDeploy Documentation</a>.</p>
     </div>
   </body>
   </html>
   ```

## 重新部署網站
<a name="tutorials-windows-update-and-redeploy-application-deploy-updates"></a>

現在您已修改程式碼，請使用 Amazon S3 和 CodeDeploy 重新部署網頁。

綁定變更並將其上傳至 Amazon S3，如 中所述[將應用程式的檔案綁定到單一封存檔案中，並推送封存檔案](tutorials-windows-upload-application.md#tutorials-windows-upload-application-bundle-and-push-archive)。(當您遵循這些說明時，不需要建立新的應用程式)。如以前一樣將相同的金鑰給予修訂 (**HelloWorld\$1App.zip**)。將其上傳至您先前建立的相同 Amazon S3 儲存貯體 （例如 **amzn-s3-demo-bucket**)。

使用 AWS CLI 或 CodeDeploy 主控台重新部署網站。

**Topics**
+ [重新部署網站 (CLI)](#tutorials-windows-update-and-redeploy-application-deploy-updates-cli)
+ [重新部署網站 (主控台)](#tutorials-windows-update-and-redeploy-application-deploy-updates-console)

### 重新部署網站 (CLI)
<a name="tutorials-windows-update-and-redeploy-application-deploy-updates-cli"></a>

再次於名為 **amzn-s3-demo-bucket** 的儲存貯體中使用名為 **HelloWorld\$1App** 的應用程式、名為 **CodeDeployDefault.OneAtATime** 的部署組態、名為 **HelloWorld\$1DepGroup** 的部署群組和名為 **HelloWorld\$1App.zip** 的修訂，根據上傳的修訂以呼叫 **create-deployment** 命令來建立部署：

```
 aws deploy create-deployment --application-name HelloWorld_App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name HelloWorld_DepGroup --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=HelloWorld_App.zip
```

您可以檢查新部署的狀態，如[監控您的部署並進行疑難排解](tutorials-windows-deploy-application.md#tutorials-windows-deploy-application-monitor)中所述。

當 CodeDeploy 重新部署網站時，請在 Web 瀏覽器中重新瀏覽網站，以確認網頁上的背景顏色和文字已變更。(您可能需要重新整理瀏覽器)。如果背景顏色和文字已變更，恭喜您！您已修改並重新部署該網站！

### 重新部署網站 (主控台)
<a name="tutorials-windows-update-and-redeploy-application-deploy-updates-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格上，選擇 **Applications (應用程式)**。

1. 在 **Applications (應用程式)** 清單中，選擇 **HelloWorld\$1App**。

1. 在 **Deployments (部署)** 標籤中，選擇 **Create deployment (建立部署)**。

   1. 在 **Deployment group (部署群組)** 清單中，選擇 **HelloWorld\$1DepGroup**。

   1.  在**修訂位置**中，輸入修訂的 Amazon S3 連結。

      尋找連結值：

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

         瀏覽並開啟 **amzn-s3-demo-bucket**，然後在 Amazon S3 主控台中選擇您的修訂**HelloWorld\$1App.zip**版本 。

      1. 如果在 Amazon S3 主控台中看不到**屬性**窗格，請選擇**屬性**按鈕。

      1. 在 **Properties (屬性)** 窗格中，複製 **Link (連結)** 欄位的值。

      1. 返回 CodeDeploy 主控台，然後將連結貼到**修訂位置**。

   1. 在 **Revision file type (修訂檔案類型)** 中，如果顯示的訊息指出偵測不到檔案類型，請選擇 **.zip**。

   1. 將 **Deployment description (部署描述)** 空白。

   1. 展開**部署群組覆寫** 在**部署組態**清單中，選擇 **CodeDeployDefault.OneAtATime**，然後選擇**建立部署**。

      接著，您便能檢查部署的狀態，如[監控您的部署並進行疑難排解](tutorials-windows-deploy-application.md#tutorials-windows-deploy-application-monitor)中所述。

      當 CodeDeploy 重新部署網站時，請在 Web 瀏覽器中重新瀏覽網站，以確認網頁上的背景顏色和文字已變更。(您可能需要重新整理瀏覽器)。如果背景顏色和文字已變更，恭喜您！您已修改並重新部署該網站！

# 步驟 6：清除您的 "hello， world！" 應用程式和相關資源
<a name="tutorials-windows-clean-up"></a>

您現在已成功更新「Hello， World！」 程式碼並重新部署網站。為了避免完成本教學課程所建立的資源持續發生費用，您應該刪除：
+ 任何 CloudFormation 堆疊 （或終止任何 Amazon EC2 執行個體，如果您在 外部建立這些執行個體 CloudFormation)。
+ 任何 Amazon S3 儲存貯體。
+ CodeDeploy 中的`HelloWorld_App`應用程式。
+ CodeDeploy 代理程式 AWS Systems Manager 的狀態管理員關聯。

您可以使用 AWS CLI、 CloudFormation、Amazon S3、Amazon EC2 和 CodeDeploy 主控台或 AWS APIs來執行清除。

**Topics**
+ [若要使用清除資源(CLI)](#tutorials-windows-clean-up-cli)
+ [清除資源 (主控台)](#tutorials-windows-clean-up-console)
+ [後續步驟？](#tutorials-windows-clean-up-whats-next)

## 若要使用清除資源(CLI)
<a name="tutorials-windows-clean-up-cli"></a>

1. 如果您將 CloudFormation 堆疊用於本教學課程，請針對名為 的堆疊呼叫 **delete-stack**命令來刪除堆疊**CodeDeployDemoStack**。這會終止所有隨附的 Amazon EC2 執行個體，並刪除所有最初由堆疊建立的隨附 IAM 角色。

   ```
   aws cloudformation delete-stack --stack-name CodeDeployDemoStack
   ```

1. 若要刪除 Amazon S3 儲存貯體，請針對名為 的儲存貯體使用 **--recursive** 切換來呼叫 **rm**命令**amzn-s3-demo-bucket**。這會刪除儲存貯體以及儲存貯體中的所有物件。

   ```
   aws s3 rm s3://amzn-s3-demo-bucket --recursive --region region
   ```

1. 若要從 CodeDeploy 刪除`HelloWorld_App`應用程式，請呼叫 **delete-application**命令。這會刪除應用程式的所有相關聯部署群組記錄和部署記錄。

   ```
   aws deploy delete-application --application-name HelloWorld_App
   ```

1. 若要刪除 Systems Manager 狀態管理員關聯，請呼叫 **delete-association**命令。

   ```
   aws ssm delete-association --assocation-id association-id
   ```

   您可以呼叫 **describe-association**命令來取得 *association-id*。

   ```
   aws ssm describe-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo
   ```

1. 如果您未在本教學課程中使用 CloudFormation 堆疊，請呼叫 **terminate-instances**命令來終止您手動建立的 Amazon EC2 執行個體。提供要終止的 Amazon EC2 執行個體 ID。

   ```
   aws ec2 terminate-instances --instance-ids instanceId
   ```

## 清除資源 (主控台)
<a name="tutorials-windows-clean-up-console"></a>

如果您將我們的 CloudFormation 範本用於本教學課程，請刪除相關聯的 CloudFormation 堆疊。

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

1. 在搜尋方塊中，輸入 CloudFormation 堆疊名稱 （例如，**CodeDeployDemoStack**)。

1. 選取堆疊名稱旁的方塊。

1. 在 **Actions (動作)** 選單中，選擇 **Delete Stack (刪除堆疊)**。這會刪除堆疊、終止所有隨附的 Amazon EC2 執行個體，以及刪除所有隨附的 IAM 角色。

若要終止您在 CloudFormation 堆疊外部建立的 Amazon EC2 執行個體：

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

1. 在 **Instances (執行個體)** 區域中，選擇 **Instances (執行個體)**。

1. 在搜尋方塊中，輸入您要終止的 Amazon EC2 執行個體名稱，然後按 **Enter** 鍵。

1. 選擇 Amazon EC2 執行個體。

1. 選擇 **Actions (動作)**，指向 **Instance State (執行個體狀態)**，然後選擇 **Terminate (終止)**。出現提示時，選擇 **Yes, Terminate (是，終止)**。針對任何其他 Amazon EC2 執行個體重複這些步驟。

若要刪除 Amazon S3 儲存貯體：

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

1. 在儲存貯體清單中，瀏覽並選擇 Amazon S3 儲存貯體的名稱 （例如 **amzn-s3-demo-bucket**)。

1. 您必須先刪除其內容，才能刪除儲存貯體。選擇儲存貯體中的所有檔案，例如 **HelloWorld\$1App.zip**。在**操作**功能表中，選擇**刪除**。出現提示要您確認刪除時，選擇 **OK (確定)**。

1. 儲存貯體清空之後，您即可刪除儲存貯體。在儲存貯體清單中，選擇儲存貯體的資料列 (但不是儲存貯體名稱)。選擇 **Delete bucket (刪除儲存貯體)**，然後在出現確認提示時，選擇 **OK (確定)**。

若要從 CodeDeploy 刪除`HelloWorld_App`應用程式：

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

   

1. 選擇 **`HelloWorld_App`**。

1. 選擇**刪除應用程式**。

1. 當出現提示時，輸入 **Delete**，然後選擇 **Delete (刪除)**。

若要刪除 Systems Manager 狀態管理員關聯：

1. 在 https：//https://console.aws.amazon.com/systems-manager 開啟 AWS Systems Manager 主控台。

1. 在導覽窗格中，選擇 **State Manager (狀態管理員)**。

1. 選擇您建立的關聯，然後選擇 **Delete (刪除)**。

## 後續步驟？
<a name="tutorials-windows-clean-up-whats-next"></a>

如果您已抵達這裡，表示您已成功使用 CodeDeploy 完成部署。恭喜您！

# 教學課程：使用 CodeDeploy 將應用程式部署至內部部署執行個體 (Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux)
<a name="tutorials-on-premises-instance"></a>

本教學課程透過引導您將範例應用程式修訂部署至單一現場部署執行個體，也就是執行 Amazon EC2 Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux (RHEL) 的實體裝置，協助您獲得 CodeDeploy 的使用體驗。如需現場部署執行個體及其如何使用 CodeDeploy 的相關資訊，請參閱 [使用 CodeDeploy 的內部部署執行個體](instances-on-premises.md)。

不是您想找的內容嗎？
+ 若要練習部署到執行 Amazon Linux 或 RHEL 的 Amazon EC2 執行個體，請參閱 [教學課程：將 WordPress 部署到 Amazon EC2 執行個體 (Amazon Linux 或 Red Hat Enterprise Linux 和 Linux、macOS 或 Unix)](tutorials-wordpress.md)。
+ 若要練習部署到執行 Windows Server 的 Amazon EC2 執行個體，請參閱 [教學課程：部署 "hello， world！" 應用程式搭配 CodeDeploy (Windows Server)](tutorials-windows.md)。

**Topics**
+ [先決條件](tutorials-on-premises-instance-prerequisites.md)
+ [步驟 1：設定現場部署執行個體](tutorials-on-premises-instance-1-configure-instance.md)
+ [步驟 2：建立範例應用程式修訂](tutorials-on-premises-instance-2-create-sample-revision.md)
+ [步驟 3：將應用程式修訂版綁定並上傳至 Amazon S3](tutorials-on-premises-instance-3-bundle-sample-revision.md)
+ [步驟 4：部署您的應用程式修訂版](tutorials-on-premises-instance-4-deploy-sample-revision.md)
+ [步驟 5：驗證您的部署](tutorials-on-premises-instance-5-verify-deployment.md)
+ [步驟 6：清除資源](tutorials-on-premises-instance-6-clean-up-resources.md)

# 先決條件
<a name="tutorials-on-premises-instance-prerequisites"></a>

開始本教學課程之前，您必須完成 中的先決條件[CodeDeploy 入門](getting-started-codedeploy.md)，其中包括設定使用者、安裝或升級 AWS CLI，以及建立服務角色。您不需要如先決條件所述建立 IAM 執行個體描述檔。內部部署執行個體不使用 IAM 執行個體描述檔。

您將設定為現場部署執行個體的實體裝置，必須執行 [CodeDeploy 代理程式支援的作業系統](codedeploy-agent.md#codedeploy-agent-supported-operating-systems) 中所列的其中一個作業系統。

# 步驟 1：設定現場部署執行個體
<a name="tutorials-on-premises-instance-1-configure-instance"></a>

您必須先進行設定，之後才能部署到現場部署執行個體。請遵循[使用 CodeDeploy 的內部部署執行個體](instances-on-premises.md)中的指示，然後返回此頁面。

## 安裝 CodeDeploy 代理程式
<a name="tutorials-on-premises-instance-1-configure-instance-agent"></a>

設定現場部署執行個體之後，請遵循[安裝 CodeDeploy 代理](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html)程式中的現場部署執行個體步驟，並返回此頁面。

# 步驟 2：建立範例應用程式修訂
<a name="tutorials-on-premises-instance-2-create-sample-revision"></a>

在此步驟中，您將建立範例應用程式修訂版，以部署到您的內部部署執行個體。

由於很難得知您的組織在現場部署執行個體上已安裝或允許安裝哪些軟體和功能，我們在此提供的範例應用程式修訂版只會使用批次指令碼 （適用於 Windows Server) 或 shell 指令碼 （適用於 Ubuntu Server 和 RHEL) 將文字檔案寫入現場部署執行個體上的位置。每個 CodeDeploy 部署生命週期事件都會寫入一個檔案，包括 **Install**、**AfterInstall**、**ApplicationStart** 和 **ValidateService**。在 **BeforeInstall** 部署生命週期事件期間，先前部署此範例時所編寫的指令碼會移除舊檔案，並在您的現場部署執行個體上建立一個寫入新檔案的位置。

**注意**  
這個範例應用程式修訂版可能無法進行部署，若以下任何一項為真：  
在現場部署執行個體上啟動 CodeDeploy 代理程式的使用者沒有執行指令碼的許可。
使用者沒有在指令碼中列出的位置中建立或刪除資料夾的許可。
使用者沒有在指令碼中列出的位置建立文字檔案的許可。

**注意**  
如果您已設定 Windows Server 執行個體並想要部署不同的範例，建議您在[教學課程：部署 "hello， world！" 應用程式搭配 CodeDeploy (Windows Server)](tutorials-windows.md)教學課程中使用 [步驟 2：設定您的來源內容以部署至 Windows Server Amazon EC2 執行個體](tutorials-windows-configure-content.md)中的執行個體。  
如果您已設定 RHEL 執行個體並想要部署不同的範例，建議您在[教學課程：將 WordPress 部署到 Amazon EC2 執行個體 (Amazon Linux 或 Red Hat Enterprise Linux 和 Linux、macOS 或 Unix)](tutorials-wordpress.md)教學課程中使用 [步驟 2：設定要部署到 Amazon Linux 或 Red Hat Enterprise Linux Amazon EC2 執行個體的來源內容](tutorials-wordpress-configure-content.md)中的範例。  
目前，沒有 Ubuntu Server 的替代範例。

1. 請在您的開發機器上，建立一個名為 `CodeDeployDemo-OnPrem` 的子目錄 (子資料夾)，將儲存範例應用程式修訂版的檔案，然後切換到子資料夾。在此範例中，假設您將使用 `c:\temp` 資料夾做為 Windows Server 的根資料夾，或將 `/tmp` 資料夾做為 Ubuntu Server 和 RHEL 的根資料夾。如果您使用不同資料夾，請務必在此教學課程中都替換為這個。

   針對 Windows：

   ```
   mkdir c:\temp\CodeDeployDemo-OnPrem
   cd c:\temp\CodeDeployDemo-OnPrem
   ```

   針對 Linux、macOS 或 Unix：

   ```
   mkdir /tmp/CodeDeployDemo-OnPrem
   cd /tmp/CodeDeployDemo-OnPrem
   ```

1. 在 `CodeDeployDemo-OnPrem` 子資料夾的根目錄中，使用純文字編輯器建立兩個分別名為 `appspec.yml` 和 `install.txt` 的檔案：

   `appspec.yml` 適用於 Windows Server 的 ：

   ```
   version: 0.0
   os: windows
   files:
     - source: .\install.txt
       destination: c:\temp\CodeDeployExample
   hooks:
     BeforeInstall:
       - location: .\scripts\before-install.bat
         timeout: 900
     AfterInstall:
       - location: .\scripts\after-install.bat     
         timeout: 900
     ApplicationStart:
       - location: .\scripts\application-start.bat  
         timeout: 900
     ValidateService:
       - location: .\scripts\validate-service.bat    
         timeout: 900
   ```

   `appspec.yml` 適用於 Ubuntu Server 和 RHEL：

   ```
   version: 0.0
   os: linux
   files:
     - source: ./install.txt
       destination: /tmp/CodeDeployExample
   hooks:
     BeforeInstall:
       - location: ./scripts/before-install.sh
         timeout: 900
     AfterInstall:
       - location: ./scripts/after-install.sh
         timeout: 900
     ApplicationStart:
       - location: ./scripts/application-start.sh
         timeout: 900
     ValidateService:
       - location: ./scripts/validate-service.sh
         timeout: 900
   ```

   如需關於 AppSpec 檔案的詳細資訊，請參閱[將應用程式規格檔案新增至 CodeDeploy 的修訂版](application-revisions-appspec-file.md)和[CodeDeploy AppSpec 檔案參考](reference-appspec-file.md)。

   `install.txt`:

   ```
   The Install deployment lifecycle event successfully completed.
   ```

1. 在 `CodeDeployDemo-OnPrem` 子資料夾的根目錄下，建立 `scripts` 子資料夾，然後切換到該資料夾：

   針對 Windows：

   ```
   mkdir c:\temp\CodeDeployDemo-OnPrem\scripts
   cd c:\temp\CodeDeployDemo-OnPrem\scripts
   ```

   針對 Linux、macOS 或 Unix：

   ```
   mkdir -p /tmp/CodeDeployDemo-OnPrem/scripts
   cd /tmp/CodeDeployDemo-OnPrem/scripts
   ```

1. 在`scripts`子資料夾的根目錄中，使用文字編輯器為 `validate-service.bat` Windows Server 建立四個名為 `before-install.bat`、`application-start.bat`、 和 `after-install.bat`的檔案，或`validate-service.sh`為 Ubuntu Server 和 RHEL 建立四個名為 `application-start.sh`、、 和 `before-install.sh` `after-install.sh`的檔案：

   對於 Windows Server：

   `before-install.bat`:

   ```
   set FOLDER=%HOMEDRIVE%\temp\CodeDeployExample
   
   if exist %FOLDER% (
     rd /s /q "%FOLDER%"
   )
   
   mkdir %FOLDER%
   ```

   `after-install.bat`:

   ```
   cd %HOMEDRIVE%\temp\CodeDeployExample
   
   echo The AfterInstall deployment lifecycle event successfully completed. > after-install.txt
   ```

   `application-start.bat`:

   ```
   cd %HOMEDRIVE%\temp\CodeDeployExample
   
   echo The ApplicationStart deployment lifecycle event successfully completed. > application-start.txt
   ```

   `validate-service.bat`:

   ```
   cd %HOMEDRIVE%\temp\CodeDeployExample
   
   echo The ValidateService deployment lifecycle event successfully completed. > validate-service.txt
   ```

   對於 Ubuntu Server 和 RHEL：

   `before-install.sh`:

   ```
   #!/bin/bash
   export FOLDER=/tmp/CodeDeployExample
   
   if [ -d $FOLDER ]
   then
    rm -rf $FOLDER
   fi
   
   mkdir -p $FOLDER
   ```

   `after-install.sh`:

   ```
   #!/bin/bash
   cd /tmp/CodeDeployExample
   
   echo "The AfterInstall deployment lifecycle event successfully completed." > after-install.txt
   ```

   `application-start.sh`:

   ```
   #!/bin/bash
   cd /tmp/CodeDeployExample
   
   echo "The ApplicationStart deployment lifecycle event successfully completed." > application-start.txt
   ```

   `validate-service.sh`:

   ```
   #!/bin/bash
   cd /tmp/CodeDeployExample
   
   echo "The ValidateService deployment lifecycle event successfully completed." > validate-service.txt
   
   unset FOLDER
   ```

1. 僅針對 Ubuntu Server 和 RHEL，請確定四個 shell 指令碼具有執行許可：

   ```
   chmod +x ./scripts/*
   ```

# 步驟 3：將應用程式修訂版綁定並上傳至 Amazon S3
<a name="tutorials-on-premises-instance-3-bundle-sample-revision"></a>

您必須先綁定檔案，然後將檔案綁定上傳到 Amazon S3 儲存貯體，才能部署應用程式修訂版。請遵循[使用 CodeDeploy 建立應用程式](applications-create.md)和[將 CodeDeploy 的修訂推送至 Amazon S3 （僅限 EC2/內部部署部署）](application-revisions-push.md)中的說明進行。(雖然您可以給予應用程式和部署群組任何名稱，我們建議您對於應用程式名稱使用 `CodeDeploy-OnPrem-App`，對於部署群組名稱使用 `CodeDeploy-OnPrem-DG`)。在您完成這些指示後，返回此頁面。

**注意**  
或者，您可以上傳檔案套件到 GitHub 儲存庫並從該處部署套件 如需詳細資訊，請參閱[將 CodeDeploy 與 GitHub 整合](integrations-partners-github.md)。

# 步驟 4：部署您的應用程式修訂版
<a name="tutorials-on-premises-instance-4-deploy-sample-revision"></a>

將應用程式修訂版上傳至 Amazon S3 儲存貯體後，請嘗試將其部署到您的現場部署執行個體。請遵循[使用 CodeDeploy 建立部署](deployments-create.md)中的指示，然後返回此頁面。

# 步驟 5：驗證您的部署
<a name="tutorials-on-premises-instance-5-verify-deployment"></a>

若要驗證部署是否成功，請按照 [檢視 CodeDeploy 部署詳細資訊](deployments-view-details.md) 中的指示，然後返回此頁面。

如果部署成功，您會在 `c:\temp\CodeDeployExample` 資料夾 （適用於 Windows Server) 或 `/tmp/CodeDeployExample`（適用於 Ubuntu Server 和 RHEL) 中找到四個文字檔案。

如果部署失敗，請按照 [使用 CodeDeploy 檢視執行個體詳細資訊](instances-view-details.md) 和 [對執行個體問題進行故障診斷](troubleshooting-ec2-instances.md)中的故障排除步驟進行。進行任何必要的修正，重新綁定並上傳您的應用程式修訂版，然後再試一次部署。

# 步驟 6：清除資源
<a name="tutorials-on-premises-instance-6-clean-up-resources"></a>

為了避免您在本教學課程中建立的資源持續產生費用，如果您不再使用 Amazon S3 儲存貯體，請將其刪除。您也可以清除相關聯的資源，例如 CodeDeploy 中的應用程式和部署群組記錄，以及現場部署執行個體。

您可以使用 CodeDeploy 和 Amazon S3 主控台和 的 AWS CLI 或組合 AWS CLI 來清理資源。

## 清除資源 (CLI)
<a name="tutorials-on-premises-instance-6-clean-up-resources-cli"></a>

**刪除 Amazon S3 儲存貯體**
+ 針對儲存貯體呼叫 [rm](https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html) 命令以及`--recursive`切換 （例如，`amzn-s3-demo-bucket`)。這會刪除儲存貯體以及儲存貯體中的所有物件。

  ```
  aws s3 rm s3://your-bucket-name --recursive --region region
  ```

**在 CodeDeploy 中刪除應用程式和部署群組記錄**
+ 針對應用程式呼叫 [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 命令 （例如 `CodeDeploy-OnPrem-App`)。部署和部署群組的記錄將會刪除。

  ```
  aws deploy delete-application --application-name your-application-name
  ```<a name="tutorials-on-premises-instance-6-clean-up-resources-deregister-cli"></a>

**取消註冊現場部署執行個體並刪除 IAM 使用者**
+ 針對現場部署執行個體和區域呼叫[取消註冊](https://docs.aws.amazon.com/cli/latest/reference/deploy/deregister.html)命令：

  ```
  aws deploy deregister --instance-name your-instance-name --delete-iam-user --region your-region
  ```
**注意**  
如果您不想刪除與此內部部署執行個體相關聯的 IAM 使用者，請改用 `--no-delete-iam-user`選項。

**解除安裝 CodeDeploy 代理程式，並從現場部署執行個體移除組態檔案**
+ 從現場部署執行個體中，呼叫[解除安裝](https://docs.aws.amazon.com/cli/latest/reference/deploy/uninstall.html)命令：

  ```
  aws deploy uninstall
  ```

您現在已經完成所有步驟，以清除用於此教學課程的資源。

## 清除資源 （主控台）
<a name="tutorials-on-premises-instance-6-clean-up-resources-console"></a>

**刪除 Amazon S3 儲存貯體**

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

1. 選擇您要刪除的儲存貯體旁的圖示 (例如 `amzn-s3-demo-bucket`)，但不選擇儲存貯體本身。

1. 選擇**動作**，然後選擇**刪除**。

1. 當提示刪除儲存貯體時，請選擇 **OK (確定)**。

**在 CodeDeploy 中刪除應用程式和部署群組記錄**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，選擇 **Applications (應用程式)**。

1. 選擇您要刪除的應用程式名稱 (例如，`CodeDeploy-OnPrem-App`)，然後選擇 **Delete application (刪除應用程式)**。

1. 當系統出現提示時，請輸入應用程式的名稱，以確認要執行刪除動作，接著選擇 **Delete (刪除)**。

您無法使用 AWS CodeDeploy 主控台取消註冊現場部署執行個體，或解除安裝 CodeDeploy 代理程式。請遵循中的說明進行[取消註冊現場部署執行個體並刪除 IAM 使用者](#tutorials-on-premises-instance-6-clean-up-resources-deregister-cli)

# 教學課程：使用 CodeDeploy 將應用程式部署至 Auto Scaling 群組
<a name="tutorials-auto-scaling-group"></a>

在本教學課程中，您將使用 CodeDeploy 將應用程式修訂版部署至 Auto Scaling 群組。Amazon EC2 Auto Scaling 會使用預先定義的條件啟動 Amazon EC2 執行個體，然後在不再需要這些執行個體時將其終止。Amazon EC2 Auto Scaling 可以協助 CodeDeploy 擴展，方法是確保它始終有正確數量的 Amazon EC2 執行個體，可用於處理部署的負載。如需 Amazon EC2 Auto Scaling 與 CodeDeploy 整合的相關資訊，請參閱 [將 CodeDeploy 與 Amazon EC2 Auto Scaling 整合](integrations-aws-auto-scaling.md)。

**Topics**
+ [先決條件](tutorials-auto-scaling-group-prerequisites.md)
+ [步驟 1：建立和設定 Auto Scaling 群組](tutorials-auto-scaling-group-create-auto-scaling-group.md)
+ [步驟 2：將應用程式部署至 Auto Scaling 群組](tutorials-auto-scaling-group-create-deployment.md)
+ [步驟 3：檢查您的結果](tutorials-auto-scaling-group-verify.md)
+ [步驟 4：增加 Auto Scaling 群組中的 Amazon EC2 執行個體數量](tutorials-auto-scaling-group-scale-up.md)
+ [步驟 5：再次檢查您的結果](tutorials-auto-scaling-group-reverify.md)
+ [步驟 6：清除](tutorials-auto-scaling-group-clean-up.md)

# 先決條件
<a name="tutorials-auto-scaling-group-prerequisites"></a>

在本教學課程中遵循的步驟：
+ 完成 中的所有步驟[CodeDeploy 入門](getting-started-codedeploy.md)，包括設定 和設定 AWS CLI ，以及建立 IAM 執行個體描述檔 (**CodeDeployDemo-EC2-Instance-Profile**) 和服務角色 ()**CodeDeployDemo**。*服務角色*是一種特殊的 IAM 角色類型，可提供服務代表您採取行動的許可。
+ 如果您使用啟動範本建立 Auto Scaling 群組，則必須新增下列許可：
  +  `ec2:RunInstances` 
  +  `ec2:CreateTags` 
  +  `iam:PassRole` 

  如需詳細資訊，請參閱《Amazon EC2 Auto Scaling 使用者指南》中的 [步驟 2：建立服務角色](getting-started-create-service-role.md)、建立 Auto Scaling 群組的啟動範本，以及[啟動範本支援](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-launch-template-permissions.html)。 [ Auto Scaling ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html) *Amazon EC2 Auto Scaling * 
+  建立並使用與 Ubuntu Server 執行個體和 CodeDeploy 相容的修訂版。對於您的修訂，您可以執行下列操作之一：
  + 在 [教學課程：使用 CodeDeploy 將應用程式部署至內部部署執行個體 (Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md) 教學課程中建立和使用 [步驟 2：建立範例應用程式修訂](tutorials-on-premises-instance-2-create-sample-revision.md) 中的範例修訂。
  + 若要自行建立修訂版，請參閱 [使用 CodeDeploy 的應用程式修訂](application-revisions.md)。
+ **CodeDeployDemo-AS-SG** 使用下列**傳入規則**建立名為 的安全群組：
  + 類型：HTTP
  + 來源：隨處

  這是檢視您的應用程式並驗證部署成功的必要項目。如需如何建立安全群組的資訊，請參閱《*Amazon EC2 使用者指南*》中的[建立安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#creating-security-group)。

 

# 步驟 1：建立和設定 Auto Scaling 群組
<a name="tutorials-auto-scaling-group-create-auto-scaling-group"></a>

在此步驟中，您將建立包含單一 Amazon Linux、RHEL 或 Windows Server Amazon EC2 執行個體的 Auto Scaling 群組。在後續步驟中，您將指示 Amazon EC2 Auto Scaling 再新增一個 Amazon EC2 執行個體，而 CodeDeploy 會將您的修訂部署到該執行個體。

**Topics**
+ [建立和設定 Auto Scaling 群組 (CLI)](#tutorials-auto-scaling-group-create-auto-scaling-group-cli)
+ [建立和設定 Auto Scaling 群組 （主控台）](#tutorials-auto-scaling-group-create-auto-scaling-group-console)

## 建立和設定 Auto Scaling 群組 (CLI)
<a name="tutorials-auto-scaling-group-create-auto-scaling-group-cli"></a>

1. 呼叫 **create-launch-template**命令來建立 Amazon EC2 啟動範本。

   呼叫此命令之前，您需要適用於此教學課程之 AMI 的 ID，其由預留位置 *image-id* 代表。您也需要 Amazon EC2 執行個體金鑰對的名稱，才能存取以預留位置*金鑰名稱*表示的 Amazon EC2 執行個體。

   若要取得適用於此教學課程的 AMI 的 ID：

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

   1. 在導覽窗格中，在 **Instances (執行個體)** 下，選擇 **Instances (執行個體)**，然後選擇 **Launch Instance (啟動執行個體)**。

   1. 在**選擇 Amazon Machine Image** 頁面的 **Quick Start** 索引標籤上，記下 **Amazon Linux 2 AMI**、**Red Hat Enterprise Linux 7.1**、**Ubuntu Server 14.04 LTS** 或 **Microsoft Windows Server 2012 R2 **旁的 AMI ID。
**注意**  
如果您有與 CodeDeploy 相容的自訂 AMI 版本，請在此處選擇它，而不是瀏覽 **Quick Start** 索引標籤。如需搭配 CodeDeploy 和 Amazon EC2 Auto Scaling 使用自訂 AMI 的詳細資訊，請參閱 [搭配 CodeDeploy 和 Amazon EC2 Auto Scaling 使用自訂 AMI](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-custom-ami)。

   對於 Amazon EC2 執行個體金鑰對，請使用 Amazon EC2 執行個體金鑰對的名稱。

   呼叫 **create-launch-template** 命令。

   在本機 Linux、macOS 或 Unix 機器上：

   ```
   aws ec2 create-launch-template \
     --launch-template-name CodeDeployDemo-AS-Launch-Template \
     --launch-template-data file://config.json
   ```

   `config.json` 檔案的內容：

   ```
   { 
     "InstanceType":"t1.micro",
     "ImageId":"image-id",
     "IamInstanceProfile":{
       "Name":"CodeDeployDemo-EC2-Instance-Profile"
     },
     "KeyName":"key-name"
   }
   ```

   在本機 Windows 電腦上：

   ```
   aws ec2 create-launch-template --launch-template-name CodeDeployDemo-AS-Launch-Template --launch-template-data file://config.json
   ```

   `config.json` 檔案的內容：

   ```
   { 
     "InstanceType":"t1.micro",
     "ImageId":"image-id",
     "IamInstanceProfile":{
       "Name":"CodeDeployDemo-EC2-Instance-Profile"
     },
     "KeyName":"key-name"
   }
   ```

   這些命令以及 `config.json` 檔案，為您的 Auto Scaling 群組建立名為 CodeDeployDemo-AS-Launch-Template 的 Amazon EC2 啟動範本，這些範本將根據 t1.micro Amazon EC2 執行個體類型在後續步驟中建立。根據您對 `ImageId`、 `IamInstanceProfile`和 的輸入`KeyName`，啟動範本也會指定 AMI ID、與啟動時要傳遞給執行個體之 IAM 角色相關聯的執行個體描述檔名稱，以及連線至執行個體時要使用的 Amazon EC2 金鑰對。

1.  呼叫 **create-auto-scaling-group**命令來建立 Auto Scaling 群組。在 的區域[和端點](https://docs.aws.amazon.com/general/latest/gr/rande.html#codedeploy_region)中列出的其中一個區域中，您將需要其中一個可用區域的名稱*AWS 一般參考*，以預留位置*可用區域*表示。
**注意**  
若要檢視區域中的可用區域的清單，請呼叫：  

   ```
   aws ec2 describe-availability-zones --region region-name
   ```
例如，若要檢視美國西部 （奧勒岡） 區域的可用區域清單，請呼叫：  

   ```
   aws ec2 describe-availability-zones --region us-west-2
   ```
有關區域名稱識別碼的清單，請參閱 [依區域顯示的資源套件儲存貯體名稱](resource-kit.md#resource-kit-bucket-names)。

   在本機 Linux、macOS 或 Unix 機器上：

   ```
   aws autoscaling create-auto-scaling-group \
     --auto-scaling-group-name CodeDeployDemo-AS-Group \
     --launch-template CodeDeployDemo-AS-Launch-Template,Version='$Latest' \
     --min-size 1 \
     --max-size 1 \
     --desired-capacity 1 \
     --availability-zones availability-zone \
     --tags Key=Name,Value=CodeDeployDemo,PropagateAtLaunch=true
   ```

   在本機 Windows 電腦上：

   ```
   aws autoscaling create-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --launch-template LaunchTemplateName=CodeDeployDemo-AS-Launch-Template,Version="$Latest" --min-size 1 --max-size 1 --desired-capacity 1 --availability-zones availability-zone --tags Key=Name,Value=CodeDeployDemo,PropagateAtLaunch=true
   ```

   這些命令**CodeDeployDemo-AS-Group**會根據名為 的 Amazon EC2 啟動範本，建立名為 的 Auto Scaling 群組**CodeDeployDemo-AS-Launch-Template**。此 Auto Scaling 群組只有一個 Amazon EC2 執行個體，而且是在指定的可用區域中建立的。此 Auto Scaling 群組中的每個執行個體都會有標籤 `Name=CodeDeployDemo`。稍後安裝 CodeDeploy 代理程式時將使用 標籤。

1. 針對 **CodeDeployDemo-AS-Group** 呼叫 **describe-auto-scaling-groups** 命令：

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].[HealthStatus, LifecycleState]" --output text
   ```

   在傳回值顯示 `Healthy`​ 和 `InService` 之前不要繼續。

1.  Auto Scaling 群組中的執行個體必須安裝 CodeDeploy 代理程式，才能用於 CodeDeploy 部署。使用建立 Auto Scaling 群組時新增的 AWS Systems Manager 標籤，從 呼叫 **create-association**命令來安裝 CodeDeploy 代理程式。

   ```
   aws ssm create-association \
     --name AWS-ConfigureAWSPackage \
     --targets Key=tag:Name,Values=CodeDeployDemo \
      --parameters action=Install, name=AWSCodeDeployAgent \
     --schedule-expression "cron(0 2 ? * SUN *)"
   ```

   此命令會在 Systems Manager State Manager 中建立關聯，在 Auto Scaling 群組中的所有執行個體上安裝 CodeDeploy 代理程式，然後嘗試在每週日上午 2：00 進行更新。如需 CodeDeploy 代理程式的詳細資訊，請參閱[使用 CodeDeploy 代理程式](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent.html)。如需 Systems Manager 的詳細資訊，請參閱[什麼是 AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)。

## 建立和設定 Auto Scaling 群組 （主控台）
<a name="tutorials-auto-scaling-group-create-auto-scaling-group-console"></a>

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

1. 在全域導覽列中，確定*AWS 一般參考*已選取 區域[和 端點](https://docs.aws.amazon.com/general/latest/gr/rande.html#codedeploy_region)中列出的其中一個區域。Amazon EC2 Auto Scaling 資源會繫結至您指定的區域，而 CodeDeploy 僅支援特定區域。

1. 在導覽列的**執行個體**下，選擇**啟動範本**。

1. 選擇 **Create launch template** (建立啟動範本)。

1. 在**啟動範本名稱和描述**對話方塊中，針對**啟動範本名稱**，輸入 **CodeDeployDemo-AS-Launch-Template**。保留其他欄位的預設值。

1. 在 **Amazon Machine Image (AMI)** 對話方塊中，按一下 **AMI** 下的下拉式清單，選擇可搭配本教學課程使用的 AMI：

   1. 在 **AMI** 下拉式清單的 **Quick Start** 索引標籤上，選擇下列其中一項：**Amazon Linux 2 AMI**、**Red Hat Enterprise Linux 7.1**、**Ubuntu Server 14.04 LTS** 或 **Microsoft Windows Server 2012 R2**。
**注意**  
如果您有與 CodeDeploy 相容的自訂 AMI 版本，請在此處選擇它，而不是瀏覽 **Quick Start** 索引標籤。如需搭配 CodeDeploy 和 Amazon EC2 Auto Scaling 使用自訂 AMI 的詳細資訊，請參閱 [搭配 CodeDeploy 和 Amazon EC2 Auto Scaling 使用自訂 AMI](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-custom-ami)。

1. 在**執行個體類型**中，選取下拉式清單，然後選擇 **t1.micro。**您可以使用搜尋列更快找到它。

1. 在**金鑰對 （登入）** 對話方塊中，選取**選擇現有的金鑰對**。在**選取金鑰對**下拉式清單中，選擇您在先前步驟中建立或使用的 Amazon EC2 執行個體金鑰對。

1. 在**網路設定**對話方塊中，選擇**虛擬公有雲端 (VPC)**。

   在**安全群組**下拉式清單中，選擇您在[教學課程的先決條件區段](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-auto-scaling-group-prerequisites.html)中建立的安全群組 (**CodeDeployDemo-AS-SG**)。

1. 展開**進階詳細資訊**對話方塊。在 **IAM 執行個體描述**檔下拉式清單中，選取您先前在 IAM **執行個體描述檔下建立的 IAM** 角色 (**CodeDeployDemo-EC2-Instance-Profile**)。

   保留其餘預設值。

1. 選擇 **Create launch template** (建立啟動範本)。

1. 在**後續步驟**對話方塊中，選擇**建立 Auto Scaling 群組**。

1. 在**選擇啟動範本或組態**頁面上，針對 **Auto Scaling 群組名稱**，輸入 **CodeDeployDemo-AS-Group**。

1. 在**啟動範本**對話方塊中，您的啟動範本 (**CodeDeployDemo-AS-Launch-Template**) 應該填入，如果沒有，請從下拉式選單中選取它。保留預設值，然後選擇**下一步**。

1. 在**選擇執行個體啟動選項頁面****的網路**區段中，針對 **VPC** 選擇預設 VPC。然後，針對**可用區域和子網路**，選擇預設子網路。如果您無法選擇預設值，則必須建立 VPC。如需詳細資訊，請參閱 [Amazon VPC 入門](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html)。

1. 在 **Instance type requirements** (執行個體類型需求) 區段中，請使用預設設定來簡化此步驟。(請勿覆寫啟動範本。) 在本教程中，您將使用啟動範本中指定的執行個體類型，並且僅啟動隨需執行個體。

1. 選擇 **Next** (下一頁) 前往 **Configure advanced options** (設定進階選項) 頁面。

1. 保留預設值，然後選擇**下一步**。

1. 在**設定群組大小和擴展政策**頁面上，將預設**群組大小**值保留為 1。選擇**下一步**。

1. 略過設定通知的步驟，然後選擇**下一步**。

1. 在**新增標籤**頁面上，新增稍後安裝 CodeDeploy 代理程式時要使用的標籤。選擇 **Add tag (新增標籤)**。

   1. 在 **Key (金鑰)** 中，輸入 **Name**。

   1. 在 **Value (值)** 中輸入 **CodeDeployDemo**。

   選擇**下一步**。

1. 在檢閱頁面上**檢閱** Auto Scaling 群組資訊，然後選擇**建立 Auto Scaling 群組**。

1. 在導覽列中，選取 **Auto Scaling 群組**，選擇 **CodeDeployDemo-AS-Group**，然後選擇**執行個體管理**索引標籤。在**生命週期**欄中顯示 **InService** 的值，且**運作狀態**欄中顯示 **Healthy** 的值之前，請勿繼續。

1. 依照安裝 CodeDeploy 代理程式和使用`Name=CodeDeployDemo`執行個體標籤中的步驟[安裝 CodeDeploy 代理程式](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html)。

# 步驟 2：將應用程式部署至 Auto Scaling 群組
<a name="tutorials-auto-scaling-group-create-deployment"></a>

在此步驟中，您將部署修訂版至 Auto Scaling 群組中的單一 Amazon EC2 執行個體。

**Topics**
+ [建立部署 (CLI)](#tutorials-auto-scaling-group-create-deployment-cli)
+ [建立部署 (主控台)](#tutorials-auto-scaling-group-create-deployment-console)

## 建立部署 (CLI)
<a name="tutorials-auto-scaling-group-create-deployment-cli"></a>

1. 呼叫 **create-application** 命令以建立名為 **SimpleDemoApp** 的應用程式：

   ```
   aws deploy create-application --application-name SimpleDemoApp
   ```

1. 您應該已經遵循以下[步驟 2：建立 CodeDeploy 的服務角色](getting-started-create-service-role.md)的說明建立服務角色。服務角色將授予 CodeDeploy 存取 Amazon EC2 執行個體的許可，以展開 （讀取） 其標籤。您需要服務角色 ARN。若要取得服務角色 ARN，請遵循 [取得服務角色 ARN (CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli) 中的指示。

1. 現在您已擁有服務角色 ARN，請呼叫 **create-deployment-group**命令來建立名為 的部署群組**SimpleDemoDG**，此群組與名為 的應用程式相關聯**SimpleDemoApp**，並使用名為 的 Auto Scaling 群組**CodeDeployDemo-AS-Group**和名為 的部署組態**CodeDeployDefault.OneAtATime**，搭配指定的服務角色 ARN。
**注意**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 命令支援建立觸發，導致將部署和執行個體中指定事件的相關 Amazon SNS 通知傳送給主題訂閱者。命令也支援自動轉返部署和設定警示的選項，以在符合 Amazon CloudWatch 警示中的監控閾值時停止部署。本教學課程不包含這些動作的命令。

   在本機 Linux、macOS 或 Unix 機器上：

   ```
   aws deploy create-deployment-group \
     --application-name SimpleDemoApp \
     --auto-scaling-groups CodeDeployDemo-AS-Group \
     --deployment-group-name SimpleDemoDG \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --service-role-arn service-role-arn
   ```

   在本機 Windows 電腦上：

   ```
   aws deploy create-deployment-group --application-name SimpleDemoApp --auto-scaling-groups CodeDeployDemo-AS-Group --deployment-group-name SimpleDemoDG --deployment-config-name CodeDeployDefault.OneAtATime --service-role-arn service-role-arn
   ```

1. ​使用指定位置的修訂版，呼叫 **create-deployment** 命令以建立與名為 **SimpleDemoApp** 的應用程式關聯的部署、名為 **CodeDeployDefault.OneAtATime** 的部署組態、名為 **SimpleDemoDG** 的部署群組。

   **對於 Amazon Linux 和 RHEL Amazon EC2 執行個體，從本機 Linux、macOS 或 Unix 機器呼叫**

    

   ```
   aws deploy create-deployment \
     --application-name SimpleDemoApp \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name SimpleDemoDG \
     --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Linux.zip
   ```

   *bucket-name* 是 Amazon S3 儲存貯體的名稱，其中包含您區域的 CodeDeploy 資源套件檔案。例如，對於美國東部 （俄亥俄） 區域，將 *bucket-name* 取代為 `aws-codedeploy-us-east-2`。如需儲存貯體名稱的清單，請參閱 [依區域顯示的資源套件儲存貯體名稱](resource-kit.md#resource-kit-bucket-names)。

   **對於 Amazon Linux 和 RHEL Amazon EC2 執行個體，從本機 Windows 機器呼叫**

    

   ```
   aws deploy create-deployment --application-name SimpleDemoApp --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name SimpleDemoDG --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Linux.zip
   ```

   *bucket-name* 是 Amazon S3 儲存貯體的名稱，其中包含您所在區域的 CodeDeploy 資源套件檔案。例如，對於美國東部 （俄亥俄） 區域，將 *bucket-name* 取代為 `aws-codedeploy-us-east-2`。如需儲存貯體名稱的清單，請參閱 [依區域顯示的資源套件儲存貯體名稱](resource-kit.md#resource-kit-bucket-names)。

   **對於 Windows Server Amazon EC2 執行個體，從本機 Linux、macOS 或 Unix 機器呼叫**

    

   ```
   aws deploy create-deployment \
     --application-name SimpleDemoApp \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name SimpleDemoDG \
     --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Windows.zip
   ```

   *bucket-name* 是 Amazon S3 儲存貯體的名稱，其中包含您所在區域的 CodeDeploy 資源套件檔案。例如，對於美國東部 （俄亥俄） 區域，將 *bucket-name* 取代為 `aws-codedeploy-us-east-2`。如需儲存貯體名稱的清單，請參閱 [依區域顯示的資源套件儲存貯體名稱](resource-kit.md#resource-kit-bucket-names)。

   **對於 Windows Server Amazon EC2 執行個體，從本機 Windows 機器呼叫**

   ```
   aws deploy create-deployment --application-name SimpleDemoApp --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name SimpleDemoDG --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Windows.zip
   ```

   *bucket-name* 是 Amazon S3 儲存貯體的名稱，其中包含您所在區域的 CodeDeploy 資源套件檔案。例如，對於美國東部 （俄亥俄） 區域，將 *bucket-name* 取代為 `aws-codedeploy-us-east-2`。如需儲存貯體名稱的清單，請參閱 [依區域顯示的資源套件儲存貯體名稱](resource-kit.md#resource-kit-bucket-names)。
**注意**  
目前，CodeDeploy 不提供範例修訂以部署至 Ubuntu Server Amazon EC2 執行個體。若要自行建立修訂版，請參閱[使用 CodeDeploy 的應用程式修訂](application-revisions.md)

1. 呼叫 **get-deployment** 命令，確保部署成功。

   呼叫此命令之前，您需要部署的 ID，其應該已由呼叫傳回 **create-deployment** 命令。 如果您需要再次取得部署 ID，請針對名為 **SimpleDemoApp** 的應用程式與名為 **SimpleDemoDG** 的部署群組 呼叫 **list-deployments** 命令。

   ```
   aws deploy list-deployments --application-name SimpleDemoApp --deployment-group-name SimpleDemoDG --query "deployments" --output text
   ```

   現在，利用部署 ID 呼叫 **get-deployment** 命令。

   ```
   aws deploy get-deployment --deployment-id deployment-id --query "deploymentInfo.status" --output text
   ```

   在傳回的值為 `Succeeded` 之前不要繼續。

## 建立部署 (主控台)
<a name="tutorials-auto-scaling-group-create-deployment-console"></a>

1. 您應該已經遵循以下[步驟 2：建立 CodeDeploy 的服務角色](getting-started-create-service-role.md)的說明建立服務角色。服務角色將授予 CodeDeploy 存取執行個體以展開 （讀取） 其標籤的許可。在您使用 CodeDeploy 主控台部署應用程式修訂版之前，您將需要服務角色 ARN。若要取得服務角色 ARN，請遵循 [取得服務角色 ARN （主控台）](getting-started-create-service-role.md#getting-started-get-service-role-console) 中的指示。

1. 現在您已擁有服務角色 ARN，您可以使用 CodeDeploy 主控台來部署應用程式修訂版。

   登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

1. 選擇**建立應用程式**。

1. 選擇 **Custom application (自訂應用程式)**。

1. 在 **Application name (應用程式名稱)** 中，輸入 **SimpleDemoApp**。

1. 在 **Compute Platform (運算平台)** 中，選擇 **EC2/On-premises (EC2/現場部署)**。

1. 選擇**建立應用程式**。

1. 在 **Deployment groups (部署群組)** 標籤中，選擇 **Create deployment group (建立部署群組)**。

1. 在 **Deployment group name (部署群組名稱)** 中，輸入 **SimpleDemoDG**。

1. 在 **Service Role (服務角色)** 中，選擇您服務角色的名稱。

1. 在 **Deployment type (部署類型)** 中，選擇 **In-place (就地)**。

1. 在**環境組態**中，選取 **Auto Scaling 群組**，然後選擇 **CodeDeployDemo-AS-Group**。

1. 在**部署組態**中，選擇 **CodeDeployDefault.OneAtATime**。

1. 清除 **Enable load balancing (啟用負載平衡)**。

1. 選擇 **Create deployment group (建立部署群組)**。

1. 在部署群組標籤中，選擇 **Create deployment (建立部署)**。

1. 在**修訂類型**中，選擇**我的應用程式存放在 Amazon S3 中**。

1. 在 **Revision location (修訂版位置)**，輸入作業系統和區域的範例應用程式的位置。

   **對於 Amazon Linux 和 RHEL Amazon EC2 執行個體**  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/tutorials-auto-scaling-group-create-deployment.html)

   **對於 Windows Server Amazon EC2 執行個體**  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/tutorials-auto-scaling-group-create-deployment.html)

    **對於 Ubuntu Server Amazon EC2 執行個體**

   輸入儲存在 Amazon S3 中的自訂應用程式修訂版位置。

1. 將 **Deployment description (部署描述)** 空白。

1. 展開 **Advanced (進階)**。

1. 選擇 **Create deployment (建立部署)**。
**注意**  
如果狀態出現 **Failed (失敗)**，而非 **Succeeded (成功)**，則可嘗試[監控您的部署並進行疑難排解](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)中的某些技術 (使用 **SimpleDemoApp** 應用程式名稱，以及 **SimpleDemoDG** 部署群組名稱)。

# 步驟 3：檢查您的結果
<a name="tutorials-auto-scaling-group-verify"></a>

在此步驟中，您將檢查 CodeDeploy 是否已在 Auto Scaling 群組中的單一 Amazon EC2 執行個體上安裝**SimpleDemoApp**修訂版。

**Topics**
+ [檢查結果 (CLI)](#tutorials-auto-scaling-group-verify-cli)
+ [檢查結果 (主控台)](#tutorials-auto-scaling-group-verify-console)

## 檢查結果 (CLI)
<a name="tutorials-auto-scaling-group-verify-cli"></a>

首先，您將需要 Amazon EC2 執行個體的公有 DNS。

使用 來呼叫 **describe-instances**命令 AWS CLI ，以取得 Auto Scaling 群組中 Amazon EC2 執行個體的公有 DNS。

呼叫此命令之前，您將需要 Amazon EC2 執行個體的 ID。若要取得 ID，可如您之前的做法針對 **CodeDeployDemo-AS-Group** 呼叫 **describe-auto-scaling-groups** 命令：

```
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].InstanceId" --output text
```

現在呼叫 **describe-instances** 命令。

```
aws ec2 describe-instances --instance-id instance-id --query "Reservations[0].Instances[0].PublicDnsName" --output text
```

傳回的值是 Amazon EC2 執行個體的公有 DNS。

使用 Web 瀏覽器，使用如下所示的 URL，顯示部署至該 Amazon EC2 執行個體的 SimpleDemoApp 修訂版：

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

如果您看到恭喜頁面，表示您已成功使用 CodeDeploy 將修訂部署到 Auto Scaling 群組中的單一 Amazon EC2 執行個體！

接著，您將新增 Amazon EC2 執行個體至 Auto Scaling 群組。Amazon EC2 Auto Scaling 新增 Amazon EC2 執行個體後，CodeDeploy 會將您的修訂部署到新的執行個體。

## 檢查結果 (主控台)
<a name="tutorials-auto-scaling-group-verify-console"></a>

首先，您將需要 Amazon EC2 執行個體的公有 DNS。

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

在 Amazon EC2 導覽窗格的 **Auto Scaling** 下，選擇 **Auto Scaling 群組**，然後選擇**CodeDeployDemo-AS-Group**項目。

在**執行個體**索引標籤上，選擇清單中的 Amazon EC2 執行個體 ID。

 在 **Instances (執行個體)** 頁面上，於**Description (描述)** 標籤上，記下 **Public DNS (公開 DNS)** 值。​ 其看起來如下所示：**ec2-01-234-567-890.compute-1.amazonaws.com**

使用 Web 瀏覽器，使用如下所示的 URL，顯示部署至該 Amazon EC2 執行個體的 SimpleDemoApp 修訂版：

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

如果您看到恭喜頁面，表示您已成功使用 CodeDeploy 將修訂部署到 Auto Scaling 群組中的單一 Amazon EC2 執行個體！

接著，您將 Amazon EC2 執行個體新增至 Auto Scaling 群組。Amazon EC2 Auto Scaling 新增 Amazon EC2 執行個體後，CodeDeploy 會將您的修訂部署到新的 Amazon EC2 執行個體。

# 步驟 4：增加 Auto Scaling 群組中的 Amazon EC2 執行個體數量
<a name="tutorials-auto-scaling-group-scale-up"></a>

在此步驟中，您會指示 Auto Scaling 群組建立額外的 Amazon EC2 執行個體。Amazon EC2 Auto Scaling 建立執行個體後，CodeDeploy 會將您的修訂部署到該執行個體。

**Topics**
+ [擴展 Auto Scaling 群組 (CLI) 中的 Amazon EC2 執行個體數量](#tutorials-auto-scaling-group-scale-up-cli)
+ [擴展部署群組中的 Amazon EC2 執行個體數量 （主控台）](#tutorials-auto-scaling-group-scale-up-console)

## 擴展 Auto Scaling 群組 (CLI) 中的 Amazon EC2 執行個體數量
<a name="tutorials-auto-scaling-group-scale-up-cli"></a>

1. 呼叫 **update-auto-scaling-group**命令，將名為 的 Auto Scaling 群組中的 Amazon EC2 執行個體**CodeDeployDemo-AS-Group**從 1 增加到 2。

   在本機 Linux、macOS 或 Unix 機器上：

   ```
   aws autoscaling update-auto-scaling-group \
     --auto-scaling-group-name CodeDeployDemo-AS-Group \
     --min-size 2 \
     --max-size 2 \
     --desired-capacity 2
   ```

   在本機 Windows 電腦上：

   ```
   aws autoscaling update-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --min-size 2 --max-size 2 --desired-capacity 2
   ```

1. 確定 Auto Scaling 群組現在有兩個 Amazon EC2 執行個體。針對 **CodeDeployDemo-AS-Group** 呼叫 **describe-auto-scaling-groups** 命令：

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].[HealthStatus, LifecycleState]" --output text
   ```

   在兩個傳回值顯示 `Healthy`​ 和 `InService` 之前不要繼續。

## 擴展部署群組中的 Amazon EC2 執行個體數量 （主控台）
<a name="tutorials-auto-scaling-group-scale-up-console"></a>

1. 在 Amazon EC2 導覽列的 **Auto Scaling** 下，選擇 **Auto Scaling 群組**，然後選擇 **CodeDeployDemo-AS-Group**。

1. 選擇**動作**，然後選擇**編輯**。

1. 在 **Details (詳細資訊)** 標籤，在 **Desired (所需)**、**Min (最小)** 和 **Max (最大)** 方塊中，輸入 **2**，然後選擇 **Save (儲存)**。

1. 選擇**執行個體**標籤。新的 Amazon EC2 執行個體應該會出現在清單中。(如果執行個體沒有顯示，您也許需要選擇 **Refresh (重新整理)** 按鈕數次)。在**生命週期**欄中顯示 **InService** 的值，且**運作狀態**欄中顯示 **Healthy** 的值之前，請勿繼續。

# 步驟 5：再次檢查您的結果
<a name="tutorials-auto-scaling-group-reverify"></a>

在此步驟中，您將檢查 CodeDeploy 是否在 Auto Scaling 群組中的新執行個體上安裝 SimpleDemoApp 修訂版。

**Topics**
+ [檢查自動部署結果 (CLI)](#tutorials-auto-scaling-group-reverify-cli)
+ [檢查自動部署結果 (主控台)](#tutorials-auto-scaling-group-reverify-console)

## 檢查自動部署結果 (CLI)
<a name="tutorials-auto-scaling-group-reverify-cli"></a>

1. 在呼叫 **get-deployment** 命令之前，您將需要自動部署的 ID。取得 ID 後，針對名為 **SimpleDemoApp** 的應用程式及名為 **SimpleDemoDG** 的部署群組呼叫 **list-deployments** 命令。

   ```
   aws deploy list-deployments --application-name SimpleDemoApp --deployment-group-name SimpleDemoDG --query "deployments" --output text
   ```

   應該會有兩個部署 ID。使用您還沒有用於呼叫 **get-deployment** 的命令：

   ```
   aws deploy get-deployment --deployment-id deployment-id --query "deploymentInfo.[status, creator]" --output text
   ```

   除了部署狀態之外，您應該會在命令輸出`autoScaling`中看到 (`autoScaling` 表示 Amazon EC2 Auto Scaling 已建立部署。) 

   直到部署狀態顯示 `Succeeded` 之前，請勿繼續。

1. 呼叫 **describe-instances**命令之前，您將需要新 Amazon EC2 執行個體的 ID。若要取得此 ID，請再次針對 **CodeDeployDemo-AS-Group** 呼叫 **describe-auto-scaling-groups** 命令。

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].InstanceId" --output text
   ```

   現在呼叫 **describe-instances** 命令：

   ```
   aws ec2 describe-instances --instance-id instance-id --query "Reservations[0].Instances[0].PublicDnsName" --output text
   ```

   在**describe-instances**命令的輸出中，記下新 Amazon EC2 執行個體的公有 DNS。

1. 使用 Web 瀏覽器，使用如下所示的 URL，顯示部署至該 Amazon EC2 執行個體的`SimpleDemoApp`修訂：

   ```
   http://ec2-01-234-567-890.compute-1.amazonaws.com
   ```

   如果出現恭喜頁面，表示您已使用 CodeDeploy 將修訂部署到 Auto Scaling 群組中向上擴展的 Amazon EC2 執行個體！

## 檢查自動部署結果 (主控台)
<a name="tutorials-auto-scaling-group-reverify-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**部署**。

   

1. 選擇 Amazon EC2 Auto Scaling 建立之部署的部署 ID。

   .

1.  此 **Deployment (部署)** 頁面會顯示有關部署的資訊。一般而言，您會自行建立部署，但 Amazon EC2 Auto Scaling 會代表您建立部署，將您的修訂部署到新的 Amazon EC2 執行個體。

1. 在頁面頂端顯示 **Succeeded (成功)** 後，在執行個體上驗證結果。首先，您需要取得執行個體的公有 DNS：

1. 在 Amazon EC2 導覽窗格的 **Auto Scaling** 下，選擇 **Auto Scaling 群組**，然後選擇**CodeDeployDemo-AS-Group**項目。

1. 在**執行個體**索引標籤上，選擇新 Amazon EC2 執行個體的 ID。

1.  在 **Instances (執行個體)** 頁面上，於**Description (描述)** 標籤上，記下 **Public DNS (公開 DNS)** 值。​ 其看起來如下所示：**ec2-01-234-567-890.compute-1.amazonaws.com**

使用如下的 URL，顯示部署到執行個體的 `SimpleDemoApp` 修訂版：

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

如果出現恭喜頁面，表示您已使用 CodeDeploy 將修訂部署到 Auto Scaling 群組中向上擴展的 Amazon EC2 執行個體！

# 步驟 6：清除
<a name="tutorials-auto-scaling-group-clean-up"></a>

在此步驟中，您將刪除 Auto Scaling 群組，以避免您在本教學課程中使用的資源持續產生費用。或者，您可以刪除 Auto Scaling 組態和 CodeDeploy 部署元件記錄。

**Topics**
+ [清除資源 (CLI)](#tutorials-auto-scaling-group-clean-up-cli)
+ [清除資源 (主控台)](#tutorials-auto-scaling-group-clean-up-console)

## 清除資源 (CLI)
<a name="tutorials-auto-scaling-group-clean-up-cli"></a>

1. 透過對 呼叫 **delete-auto-scaling-group**命令來刪除 Auto Scaling 群組**CodeDeployDemo-AS-Group**。這也會終止 Amazon EC2 執行個體。

   ```
   aws autoscaling delete-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --force-delete
   ```

1. 或者，針對名為 的啟動組態呼叫 **delete-launch-template**命令，以刪除 Auto Scaling 啟動範本**CodeDeployDemo-AS-Launch-Template**：

   ```
   aws ec2 delete-launch-template --launch-template-name CodeDeployDemo-AS-Launch-Template
   ```

1. 或者，針對名為 的應用程式呼叫 **delete-application**命令，從 CodeDeploy 刪除應用程式**SimpleDemoApp**。這將刪除所有相關聯的部署、部署群組及修訂記錄。

   ```
   aws deploy delete-application --application-name SimpleDemoApp
   ```

1. 若要刪除 Systems Manager State Manager 關聯，請呼叫 **delete-association**命令。

   ```
   aws ssm delete-association --assocation-id association-id
   ```

   您可以呼叫 **describe-association**命令來取得 *association-id*。

   ```
   aws ssm describe-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo
   ```

## 清除資源 (主控台)
<a name="tutorials-auto-scaling-group-clean-up-console"></a>

若要刪除也會終止 Amazon EC2 執行個體的 Auto Scaling 群組：

1. 

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

1. 在 Amazon EC2 導覽窗格的 **Auto Scaling** 下，選擇 **Auto Scaling 群組**，然後選擇**CodeDeployDemo-AS-Group**項目。

1. 依序選擇 **Actions (動作)**、**Delete (刪除)** 和 **Yes, Delete (是，刪除)**。

（選用） 若要刪除啟動範本：

1.  在導覽列的 **Auto Scaling** 下，選擇**啟動組態**，然後選擇 **CodeDeployDemo-AS-Launch-Template**。

1. 依序選擇 **Actions (執行)**、**Delete launch configuration (刪除啟動組態)** 和 **Yes, Delete (是，刪除)**。

1. 或者，從 CodeDeploy 刪除應用程式。這將刪除所有相關聯的部署、部署群組及修訂記錄。在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

   在導覽窗格中，展開**部署**，然後選擇**應用程式**。

   

1. 在應用程式清單中，選擇 **SimpleDemoApp**。

1. 在 **Application details (應用程式詳細資訊)** 頁面上，選擇 **Delete application (刪除應用程式)**。

1. 當出現提示時，輸入 **Delete**，然後選擇 **Delete (刪除)**。

若要刪除 Systems Manager 狀態管理員關聯：

1. 在 https：//https://console.aws.amazon.com/systems-manager 開啟 AWS Systems Manager 主控台。

1. 在導覽窗格中，選擇 **State Manager (狀態管理員)**。

1. 選擇您建立的關聯，然後選擇 **Delete (刪除)**。

# 教學課程：使用 CodeDeploy 從 GitHub 部署應用程式
<a name="tutorials-github"></a>

在本教學課程中，您會使用 CodeDeploy 將範例應用程式修訂從 GitHub 部署到執行 Amazon Linux 的單一 Amazon EC2 執行個體、單一 Red Hat Enterprise Linux (RHEL) 執行個體或單一 Windows Server 執行個體。如需 GitHub 與 CodeDeploy 整合的相關資訊，請參閱 [將 CodeDeploy 與 GitHub 整合](integrations-partners-github.md)。

**注意**  
您也可以使用 CodeDeploy 將應用程式修訂版從 GitHub 部署到 Ubuntu Server 執行個體。您可以使用 [步驟 2：建立範例應用程式修訂](tutorials-on-premises-instance-2-create-sample-revision.md)中所述的範例修訂版[教學課程：使用 CodeDeploy 將應用程式部署至內部部署執行個體 (Windows Server、Ubuntu Server 或 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)，也可以建立與 Ubuntu Server 執行個體和 CodeDeploy 相容的修訂版。若要建立您自己的修訂版，請參閱[規劃 CodeDeploy 的修訂](application-revisions-plan.md)和[將應用程式規格檔案新增至 CodeDeploy 的修訂版](application-revisions-appspec-file.md)

**Topics**
+ [先決條件](tutorials-github-prerequisites.md)
+ [步驟 1：設定 GitHub 帳戶](tutorials-github-create-github-account.md)
+ [步驟 2：建立 GitHub 儲存庫](tutorials-github-create-github-repository.md)
+ [步驟 3：上傳範例應用程式到您的 GitHub 儲存庫](tutorials-github-upload-sample-revision.md)
+ [步驟 4：佈建執行個體](tutorials-github-provision-instance.md)
+ [步驟 5：建立應用程式和部署群組](tutorials-github-create-application.md)
+ [步驟 6：將應用程式部署至執行個體](tutorials-github-deploy-application.md)
+ [步驟 7：監控和驗證部署](tutorials-github-verify.md)
+ [步驟 8：清理](tutorials-github-clean-up.md)

# 先決條件
<a name="tutorials-github-prerequisites"></a>

在開始本教學課程之前，執行以下作業：
+ 在您的本機電腦上安裝 Git。若要安裝 Git，請參閱 [Git 下載](http://git-scm.com/downloads)。
+ 完成 [CodeDeploy 入門](getting-started-codedeploy.md) 中的步驟，包含安裝及設定 AWS CLI。如果您想要使用 AWS CLI 從 GitHub 部署修訂到執行個體，這尤其重要。

# 步驟 1：設定 GitHub 帳戶
<a name="tutorials-github-create-github-account"></a>

您將需要 GitHub 帳戶來建立要存放修訂版的 GitHub 儲存庫。如果您已經有一個 GitHub 帳戶，請跳到[步驟 2：建立 GitHub 儲存庫](tutorials-github-create-github-repository.md)。

1. 移至 [https://github.com/join](https://github.com)。

1. 輸入使用者名稱、您的電子郵件地址，以及一個密碼。

1. 選擇 **Sign up for GitHub (註冊 GitHub)**，然後依照說明操作。

# 步驟 2：建立 GitHub 儲存庫
<a name="tutorials-github-create-github-repository"></a>

您將需要 GitHub 儲存庫來存放修訂版。

如果您已經有 GitHub 儲存庫，在這整個教學課程中請務必用它的名稱取代 **CodeDeployGitHubDemo**，然後請直接跳到[步驟 3：上傳範例應用程式到您的 GitHub 儲存庫](tutorials-github-upload-sample-revision.md)。

1. 在 [GitHub 首頁](https://github.com/dashboard)上，執行以下其中一項操作：
   + 在 **Your repositories (您的儲存庫)**，選擇 **New repository (新的儲存庫)**。
   + 在瀏覽列上，選擇 **Create new (新建)** (**\$1**)，然後選擇 **New repository (新的存放庫)**。

1. 在 **Create a new repository (建立新的存放庫)** 網頁中，執行下列動作：
   + 在 **Repository name (儲存庫名稱)** 方塊中，輸入 **CodeDeployGitHubDemo**。
   + 選取 **Public (公有)**。
**注意**  
選取預設的 **Public (公有)** 選項，表示任何人都可以查看這個儲存庫。您可以選取 **Private (私有)** 選項，以限制誰可以查看和遞交到儲存庫。
   + 清除 **Initialize this repository with a README (以 README 初始化這個儲存庫)** 核取方塊。您將在下一個階段手動建立一個 `README.md` 檔案。
   + 選擇**建立儲存庫**。

1. 依照您的本機指示輸入命令列，以建立儲存庫。
**注意**  
如果您已經在 GitHub 上啟用雙因素驗證，如果系統提示輸入密碼，請確認您輸入個人存取權杖代替 GitHub 登入密碼。如需詳細資訊，請參閱[提供您的 2FA 驗證碼](https://help.github.com/articles/providing-your-2fa-authentication-code/)。

**在本機 Linux、macOS 或 Unix 機器上：**

1. 從終端機執行以下命令，一次一個，其中 *user-name* 是您的 GitHub 使用者名稱：

   ```
   mkdir /tmp/CodeDeployGitHubDemo
   ```

   ```
   cd /tmp/CodeDeployGitHubDemo
   ```

   ```
   touch README.md
   ```

   ```
   git init
   ```

   ```
   git add README.md
   ```

   ```
   git commit -m "My first commit"
   ```

   ```
   git remote add origin https://github.com/user-name/CodeDeployGitHubDemo.git
   ```

   ```
   git push -u origin master
   ```

1. 在 `/tmp/CodeDeployGitHubDemo` 位置使終端機保持開啟。

**在本機 Windows 電腦上：**

1. 從命令提示字元以管理員身分執行執行下列命令，一次一個：

   ```
   mkdir c:\temp\CodeDeployGitHubDemo
   ```

   ```
   cd c:\temp\CodeDeployGitHubDemo
   ```

   ```
   notepad README.md
   ```

1. 在記事本中，儲存 `README.md` 檔案。關閉記事本。執行以下命令、一次一個，其中 *user-name* 是您的 GitHub 使用者名稱：

   ```
   git init
   ```

   ```
   git add README.md
   ```

   ```
   git commit -m "My first commit"
   ```

   ```
   git remote add origin https://github.com/user-name/CodeDeployGitHubDemo.git
   ```

   ```
   git push -u origin master
   ```

1. 在 `c:\temp\CodeDeployGitHubDemo`位置中使命令提示字元保持開啟。

# 步驟 3：上傳範例應用程式到您的 GitHub 儲存庫
<a name="tutorials-github-upload-sample-revision"></a>

在此步驟中，您將從公有 Amazon S3 儲存貯體將範例修訂複製到 GitHub 儲存庫。(為了簡化，對於此教學課程提供的範例修訂版是單一網頁)。

**注意**  
如果您使用其中一個修訂版，而不是我們的範例修訂版，您的修訂版必須：  
遵循 [規劃 CodeDeploy 的修訂](application-revisions-plan.md) 和 [將應用程式規格檔案新增至 CodeDeploy 的修訂版](application-revisions-appspec-file.md) 中的方針​。
使用對應的執行個體類型。
可從 GitHub 儀表板存取。
如果您的修訂版符合這些要求，請直接跳到[步驟 5：建立應用程式和部署群組](tutorials-github-create-application.md)。  
如果您要部署到 Ubuntu Server 執行個體，則需要將與 Ubuntu Server 執行個體和 CodeDeploy 相容的修訂版上傳至 GitHub 儲存庫。如需詳細資訊，請參閱[規劃 CodeDeploy 的修訂](application-revisions-plan.md)及[將應用程式規格檔案新增至 CodeDeploy 的修訂版](application-revisions-appspec-file.md)。

**Topics**
+ [從本機 Linux、macOS 或 Unix 機器推送範例修訂](#tutorials-github-upload-sample-revision-unixes)
+ [從本機 Windows 電腦推送範例修訂版](#tutorials-github-upload-sample-revision-windows)

## 從本機 Linux、macOS 或 Unix 機器推送範例修訂
<a name="tutorials-github-upload-sample-revision-unixes"></a>

您的終端機仍然開啟，例如 `/tmp/CodeDeployGitHubDemo` 位置，請一次執行以下一個命令：

**注意**  
如果您打算部署到 Windows Server 執行個體，請在 命令`SampleApp_Linux.zip`中`SampleApp_Windows.zip`取代 。

```
(Amazon S3 copy command)
```

```
unzip SampleApp_Linux.zip
```

```
rm SampleApp_Linux.zip
```

 

```
git add .
```

```
git commit -m "Added sample app"
```

```
git push
```

其中 *(Amazon S3 複製命令）* 是下列其中一項：
+ `aws s3 cp s3://aws-codedeploy-us-east-2/samples/latest/SampleApp_Linux.zip . --region us-east-2` 適用於美國東部 （俄亥俄） 區域
+ `aws s3 cp s3://aws-codedeploy-us-east-1/samples/latest/SampleApp_Linux.zip . --region us-east-1` 適用於美國東部 （維吉尼亞北部） 區域
+ `aws s3 cp s3://aws-codedeploy-us-west-1/samples/latest/SampleApp_Linux.zip . --region us-west-1`，表示美國西部 (加利佛尼亞北部) 區域
+ `aws s3 cp s3://aws-codedeploy-us-west-2/samples/latest/SampleApp_Linux.zip . --region us-west-2` 適用於美國西部 （奧勒岡） 區域
+ `aws s3 cp s3://aws-codedeploy-ca-central-1/samples/latest/SampleApp_Linux.zip . --region ca-central-1` 適用於加拿大 （中部） 區域
+ `aws s3 cp s3://aws-codedeploy-eu-west-1/samples/latest/SampleApp_Linux.zip . --region eu-west-1` 適用於歐洲 （愛爾蘭） 區域 
+ `aws s3 cp s3://aws-codedeploy-eu-west-2/samples/latest/SampleApp_Linux.zip . --region eu-west-2` 適用於歐洲 （倫敦） 區域 
+ `aws s3 cp s3://aws-codedeploy-eu-west-3/samples/latest/SampleApp_Linux.zip . --region eu-west-3` 適用於歐洲 （巴黎） 區域 
+ `aws s3 cp s3://aws-codedeploy-eu-central-1/samples/latest/SampleApp_Linux.zip . --region eu-central-1` 適用於歐洲 （法蘭克福） 區域
+ `aws s3 cp s3://aws-codedeploy-il-central-1/samples/latest/SampleApp_Linux.zip . --region il-central-1` 適用於以色列 （特拉維夫） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-east-1/samples/latest/SampleApp_Linux.zip . --region ap-east-1` 適用於亞太區域 （香港） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1` 適用於亞太區域 （東京） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-northeast-2/samples/latest/SampleApp_Linux.zip . --region ap-northeast-2` 適用於亞太區域 （首爾） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-southeast-1/samples/latest/SampleApp_Linux.zip . --region ap-southeast-1` 適用於亞太區域 （新加坡） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-southeast-2/samples/latest/SampleApp_Linux.zip . --region ap-southeast-2` 適用於亞太區域 （雪梨） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-southeast-4/samples/latest/SampleApp_Linux.zip . --region ap-southeast-4` 適用於亞太區域 （墨爾本） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-south-1/samples/latest/SampleApp_Linux.zip . --region ap-south-1` 適用於亞太區域 （孟買） 區域
+ `aws s3 cp s3://aws-codedeploy-sa-east-1/samples/latest/SampleApp_Linux.zip . --region sa-east-1` 適用於南美洲 （聖保羅） 區域

## 從本機 Windows 電腦推送範例修訂版
<a name="tutorials-github-upload-sample-revision-windows"></a>

 您的命令提示字元仍然開啟，例如 `c:\temp\CodeDeployGitHubDemo` 位置，請一次執行以下一個命令：

**注意**  
如果您打算部署到 Amazon Linux 或 RHEL 執行個體，請在 命令`SampleApp_Windows.zip`中`SampleApp_Linux.zip`取代 。

```
(Amazon S3 copy command)
```

直接解壓縮 ZIP 檔案的 `the` 內容到本機目錄 (例如 `c:\temp\CodeDeployGitHubDemo`)，而不是到新的子目錄。

```
git add .
```

```
git commit -m "Added sample app"
```

```
git push
```

其中 *(Amazon S3 複製命令）* 是下列其中一項：
+ `aws s3 cp s3://aws-codedeploy-us-east-2/samples/latest/SampleApp_Windows.zip . --region us-east-2` 適用於美國東部 （俄亥俄） 區域
+ `aws s3 cp s3://aws-codedeploy-us-east-1/samples/latest/SampleApp_Windows.zip . --region us-east-1` 適用於美國東部 （維吉尼亞北部） 區域
+ `aws s3 cp s3://aws-codedeploy-us-west-1/samples/latest/SampleApp_Windows.zip . --region us-west-1`，表示美國西部 (加利佛尼亞北部) 區域
+ `aws s3 cp s3://aws-codedeploy-us-west-2/samples/latest/SampleApp_Windows.zip . --region us-west-2` 適用於美國西部 （奧勒岡） 區域
+ `aws s3 cp s3://aws-codedeploy-ca-central-1/samples/latest/SampleApp_Windows.zip . --region ca-central-1` 適用於加拿大 （中部） 區域
+ `aws s3 cp s3://aws-codedeploy-eu-west-1/samples/latest/SampleApp_Windows.zip . --region eu-west-1` 適用於歐洲 （愛爾蘭） 區域
+ `aws s3 cp s3://aws-codedeploy-eu-west-2/samples/latest/SampleApp_Windows.zip . --region eu-west-2` 適用於歐洲 （倫敦） 區域
+ `aws s3 cp s3://aws-codedeploy-eu-west-3/samples/latest/SampleApp_Windows.zip . --region eu-west-3` 適用於歐洲 （巴黎） 區域
+ `aws s3 cp s3://aws-codedeploy-eu-central-1/samples/latest/SampleApp_Windows.zip . --region eu-central-1` 適用於歐洲 （法蘭克福） 區域
+ `aws s3 cp s3://aws-codedeploy-il-central-1/samples/latest/SampleApp_Windows.zip . --region il-central-1` 適用於以色列 （特拉維夫） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-east-1/samples/latest/SampleApp_Windows.zip . --region ap-east-1` 適用於亞太區域 （香港） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Windows.zip . --region ap-northeast-1` 適用於亞太區域 （東京） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-northeast-2/samples/latest/SampleApp_Windows.zip . --region ap-northeast-2` 適用於亞太區域 （首爾） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-southeast-1/samples/latest/SampleApp_Windows.zip . --region ap-southeast-1` 適用於亞太區域 （新加坡） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-southeast-2/samples/latest/SampleApp_Windows.zip . --region ap-southeast-2` 適用於亞太區域 （雪梨） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-southeast-4/samples/latest/SampleApp_Windows.zip . --region ap-southeast-4` 適用於亞太區域 （墨爾本） 區域
+ `aws s3 cp s3://aws-codedeploy-ap-south-1/samples/latest/SampleApp_Windows.zip . --region ap-south-1` 適用於亞太區域 （孟買） 區域
+ `aws s3 cp s3://aws-codedeploy-sa-east-1/samples/latest/SampleApp_Windows.zip . --region sa-east-1` 適用於南美洲 （聖保羅） 區域

若要將您自己的修訂推送至 Ubuntu Server 執行個體，請將您的修訂複製到本機儲存庫，然後呼叫下列命令：

```
git add .
git commit -m "Added Ubuntu app"
git push
```

# 步驟 4：佈建執行個體
<a name="tutorials-github-provision-instance"></a>

在此步驟中，您會建立或設定將部署範本應用程式的執行個體。您可以部署到執行 CodeDeploy 支援的其中一個作業系統的 Amazon EC2 執行個體或內部部署執行個體。如需相關資訊，請參閱[CodeDeploy 代理程式支援的作業系統](codedeploy-agent.md#codedeploy-agent-supported-operating-systems)。（如果您已將執行個體設定為在 CodeDeploy 部署中使用，請跳至下一個步驟。)

**佈建執行個體**

1. 遵循 中的指示[啟動 Amazon EC2 執行個體 （主控台）](instances-ec2-create.md#instances-ec2-create-console)來佈建執行個體。

1. 啟動執行個體時，請記得在**新增標籤頁面上指定標籤**。如需如何指定標籤的詳細資訊，請參閱 [啟動 Amazon EC2 執行個體 （主控台）](instances-ec2-create.md#instances-ec2-create-console)。

**驗證 CodeDeploy 代理程式是否在執行個體上執行**
+ 遵循 中的指示[驗證 CodeDeploy 代理程式是否正在執行](codedeploy-agent-operations-verify.md)來驗證代理程式是否正在執行。

成功佈建執行個體並確認 CodeDeploy 代理程式正在執行後，請前往下一個步驟。

# 步驟 5：建立應用程式和部署群組
<a name="tutorials-github-create-application"></a>

在此步驟中，您將使用 CodeDeploy 主控台或 AWS CLI 來建立應用程式和部署群組，以用於從 GitHub 儲存庫部署範例修訂版。



## 建立應用程式和部署群組 (主控台)
<a name="tutorials-github-create-application-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

   

1. 選擇 **Create application (建立應用程式)**，然後選取 **Custom application (自訂應用程式)**。

1. 在 **Application name (應用程式名稱)** 中，輸入 **CodeDeployGitHubDemo-App**。

1. 在 **Compute Platform (運算平台)** 中，選擇 **EC2/On-premises (EC2/ 現場部署)**。

1. 選擇**建立應用程式**。

1. 在 **Deployment groups (部署群組)** 標籤中，選擇 **Create deployment group (建立部署群組)**。

1. 在 **Deployment group name (部署群組名稱)** 中，輸入 **CodeDeployGitHubDemo-DepGrp**。

1. 在**服務角色**中，選擇您在為 CodeDeploy [建立服務角色中建立的 CodeDeploy 服務角色](getting-started-create-service-role.md)名稱。

1. 在 **Deployment type (部署類型)** 中，選擇 **In-place (就地)**。

1. 在**環境組態**中，根據您使用的執行個體類型，選擇 **Amazon EC2 執行個體**或**內部部署執行個體**。對於 **Key (金鑰)** 和 **Value (數值)**，輸入套用到您的執行個體的標籤金鑰和數值，做為 [步驟 4：佈建執行個體](tutorials-github-provision-instance.md) 的一部分。

1. 在 **Deployment configuration (部署組態)** 中，選擇 **CodeDeployDefault.AllatOnce**。

1. 在 **Load Balancer (負載平衡器)** 中，清除 **Enable load balancing (啟用負載平衡)**。

1. 展開 **Advanced (進階)**。

1. 在 **Alarms (警示)** 中，選取 **Ignore alarm configuration (忽略警示組態)**。

1. 選擇 **Create deployment group (建立部署群組)**，然後繼續進行下一個步驟。

## 建立應用程式和部署群組 (CLI)
<a name="tutorials-github-create-application-cli"></a>

1. 呼叫 **create-application**命令，在名為 的 CodeDeploy 中建立應用程式`CodeDeployGitHubDemo-App`：

   ```
   aws deploy create-application --application-name CodeDeployGitHubDemo-App
   ```

1. 呼叫 **create-deployment-group** 命令，建立名為 `CodeDeployGitHubDemo-DepGrp` 的部署群組。
   + 如果您要部署到 Amazon EC2 執行個體，*ec2-tag-key* 是套用到 Amazon EC2 執行個體的 Amazon EC2 執行個體標籤金鑰，做為 的一部分[步驟 4：佈建執行個體](tutorials-github-provision-instance.md)。
   + 如果您要部署到 Amazon EC2 執行個體，*ec2-tag-value* 是套用至 Amazon EC2 執行個體的 Amazon EC2 執行個體標籤值，做為 的一部分[步驟 4：佈建執行個體](tutorials-github-provision-instance.md)。
   + 如果您是部署到現場部署執行個體，*on-premises-tag-key* 會是套用到您的現場部署執行個體的現場部署執行個體標籤金鑰，做為 [步驟 4：佈建執行個體](tutorials-github-provision-instance.md) 的一部分。
   + 如果您是部署到現場部署執行個體，*on-premises-tag-value* 會是套用到您的現場部署執行個體的現場部署執行個體標籤數值，做為 [步驟 4：佈建執行個體](tutorials-github-provision-instance.md) 的一部分。
   + *service-role-arn* 是您在[為 CodeDeploy 建立服務角色中建立之服務角色的服務角色](getting-started-create-service-role.md) ARN。(若要尋找服務角色 ARN，請按照[取得服務角色 ARN (CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli)中的指示)。

   ```
   aws deploy create-deployment-group --application-name CodeDeployGitHubDemo-App --ec2-tag-filters Key=ec2-tag-key,Type=KEY_AND_VALUE,Value=ec2-tag-value --on-premises-tag-filters Key=on-premises-tag-key,Type=KEY_AND_VALUE,Value=on-premises-tag-value --deployment-group-name CodeDeployGitHubDemo-DepGrp --service-role-arn service-role-arn
   ```
**注意**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 命令支援建立觸發，導致將部署和執行個體中指定事件的相關 Amazon SNS 通知傳送給主題訂閱者。此命令也支援自動轉返部署和設定警示的選項，以在符合 Amazon CloudWatch 警示中的監控閾值時停止部署。本教學課程不包含這些動作的命令。

# 步驟 6：將應用程式部署至執行個體
<a name="tutorials-github-deploy-application"></a>

在此步驟中，您可以使用 CodeDeploy 主控台或 AWS CLI ，將範例修訂從 GitHub 儲存庫部署到您的執行個體。



## 部署修訂版本 (主控台)
<a name="tutorials-github-deploy-application-console"></a>

1. 在 **Deployment group details (部署群組詳細資訊)** 頁面上，選擇 **Create deployment (建立部署)**。

1. 在 **Deployment group (部署群組)** 中，選擇 **`CodeDeployGitHubDemo-DepGrp`**。

1. 在 **Revision type (修訂版類型)** 中，選擇 **GitHub**。

1. 在 **Connect to GitHub (連線至 GitHub)** 中，執行下列其中一項：
   + 若要為 CodeDeploy 應用程式建立 GitHub 帳戶的連線，請在單獨的 Web 瀏覽器索引標籤中登出 GitHub。在 **GitHub account (GitHub 帳戶)** 中，輸入名稱來識別此連線，然後選擇 **Connect to GitHub (連線至 GitHub)**。網頁會提示您為名為 的應用程式授權 CodeDeploy 與 GitHub 互動`CodeDeployGitHubDemo-App`。繼續步驟 5。
   + 若要使用您已建立的連線，請在 **GitHub account (GitHub 帳戶)** 中選取其名稱，然後選擇 **Connect to GitHub (連線至 GitHub)**。繼續步驟 7。
   + 若要建立連結到一個不一樣的 GitHub 帳戶，請在網路瀏覽器分頁中登出 GitHub。選擇 **Connect to a different GitHub account (連接到不同的 GitHub 帳戶)**，然後選擇 **Connect to GitHub (連接到 GitHub)**。繼續步驟 5。

1. 按照 **Sign in (登入)** 頁面上的指示，登入 GitHub 帳戶。

1. 在 **授權應用程式** 頁面上，請選擇 **授權應用程式**。

1. 在 CodeDeploy **Create 部署**頁面的**儲存庫名稱**中，輸入您用來登入的 GitHub 使用者名稱，後面接著正斜線 (`/`)，後面接著您推送應用程式修訂的儲存庫名稱 （例如，***my-github-user-name*/CodeDeployGitHubDemo**)。

   如果您不確定要輸入的值，或者您若想要指定不同的儲存庫：

   1. 在獨立的網路瀏覽器分頁中連結到您的 [GitHub 儀表板](https://github.com/dashboard)。

   1. 在 **Your repositories (您的儲存庫)** 中，將滑鼠指標移至目標儲存庫名稱上。出現工具提示顯示 GitHub 使用者或組織名稱之後接斜線 (`/`)，再接儲存庫名稱。輸入這個值到 **Repository name (儲存庫名稱)**。
**注意**  
如果目標儲存庫名稱沒有顯示在 **Your repositories (您的儲存庫)** 中，請使用 **Search GitHub (搜尋 GitHub)** 方塊，尋找目標儲存庫名稱以及 GitHub 使用者或組織名稱。

1. 在 **Commit ID (遞交 ID)** 方塊中，輸入與推送應用程式修訂版到 GitHub 相關的遞交 ID。

   如果您不確定要輸入的值：

   1. 在獨立的網路瀏覽器分頁中連結到您的 [GitHub 儀表板](https://github.com/dashboard)。

   1. 在**儲存庫**中，選擇 **CodeDeployGitHubDemo**。

   1. 在遞交清單中，尋找並複製與推送應用程式修訂版到 GitHub 相關的遞交 ID。此 ID 通常長度為 40 個字元，並且由字母和數字所組成。(請勿使用較短版本的遞交 ID，其通常是較長版本的前 10 個字元)。

   1. 將遞交 ID 貼至 **Commit ID (遞交 ID)** 方塊中。

1. 選擇 **Deploy (部署)**，並繼續下一個步驟。

## 若要部署修訂版 (CLI)
<a name="tutorials-github-deploy-application-cli"></a>

在您可以呼叫與 GitHub 互動的任何 AWS CLI 命令 （例如 **create-deployment**命令，接下來會呼叫） 之前，您必須授予 CodeDeploy 許可，以使用您的 GitHub 使用者帳戶來與`CodeDeployGitHubDemo-App`應用程式的 GitHub 互動。目前，您必須使用 CodeDeploy 主控台來執行此操作。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

   

1. 選擇 **CodeDeployGitHubDemo-App**。

1. 在 **Deployments (部署)** 標籤上，選擇 **Create deployment (建立部署)**。
**注意**  
您將無法建立新的部署。這是目前授予 CodeDeploy 許可來代表 GitHub 使用者帳戶與 GitHub 互動的唯一方法。

1. 從**部署群組**中，選擇 **CodeDeployGitHubDemo-DepGrp**。

1. 在 **Revision type (修訂版類型)** 中，選擇 **GitHub**。

1. 在 **Connect to GitHub (連線至 GitHub)** 中，執行下列其中一項：
   + 若要為 CodeDeploy 應用程式建立 GitHub 帳戶的連線，請在單獨的 Web 瀏覽器索引標籤中登出 GitHub。在 **GitHub account (GitHub 帳戶)** 中，輸入名稱來識別此連線，然後選擇 **Connect to GitHub (連線至 GitHub)**。網頁會提示您針對名為 的應用程式，授權 CodeDeploy 與 GitHub 互動`CodeDeployGitHubDemo-App`。繼續步驟 8。
   + 若要使用您已建立的連線，請在 **GitHub account (GitHub 帳戶)** 中選取其名稱，然後選擇 **Connect to GitHub (連線至 GitHub)**。繼續步驟 10。
   + 若要建立連結到一個不一樣的 GitHub 帳戶，請在網路瀏覽器分頁中登出 GitHub。選擇 **Connect to a different GitHub account (連接到不同的 GitHub 帳戶)**，然後選擇 **Connect to GitHub (連接到 GitHub)**。繼續步驟 8。

1. 按照 **Sign in (登入)** 頁面上的指示，使用您的 GitHub 使用者名稱或電子郵件和密碼登入。

1. 在 **授權應用程式** 頁面上，請選擇 **授權應用程式**。

1. 在 CodeDeploy **建立部署**頁面上，選擇**取消**。

1. 呼叫 **create-deployment** 命令從 GitHub 儲存庫的修訂版部署到執行個體，其中：
   + *repository* 是您的 GitHub 帳戶名稱，後面是正斜線 (`/`)，接著是您的儲存庫 (`CodeDeployGitHubDemo`) 的名稱，例如 `MyGitHubUserName/CodeDeployGitHubDemo`。

     如果您不確定要使用的值，或者您若想要指定不同的儲存庫：

     1. 在獨立的網路瀏覽器分頁中連結到您的 [GitHub 儀表板](https://github.com/dashboard)。

     1. 在 **Your repositories (您的儲存庫)** 中，將滑鼠指標移至目標儲存庫名稱上。出現工具提示顯示 GitHub 使用者或組織名稱之後接斜線 (`/`)，再接儲存庫名稱。這是要使用的值。
**注意**  
如果目標儲存庫名稱沒有出現在 **Your repositories (您的儲存庫)** 中，請使用 **Search GitHub (搜尋 GitHub)** 方塊，尋找目標儲存庫名稱以及對應的 GitHub 使用者或組織名稱。
   + *commit-id* 是與您推送至儲存庫 (例如 `f835159a...528eb76f`) 的應用程式修訂版的版本相關的遞交。

     如果您不確定要使用的值：

     1. 在獨立的網路瀏覽器分頁中連結到您的 [GitHub 儀表板](https://github.com/dashboard)。

     1. 在**儲存庫**中，選擇 **CodeDeployGitHubDemo**。

     1. 在遞交清單中，尋找與推送應用程式修訂版到 GitHub 相關的遞交 ID。此 ID 通常長度為 40 個字元，並且由字母和數字所組成。(請勿使用較短版本的遞交 ID，其通常是較長版本的前 10 個字元)。使用此值。

   如果您在本機 Linux、macOS 或 Unix 機器上工作：

   ```
   aws deploy create-deployment \
     --application-name CodeDeployGitHubDemo-App \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name CodeDeployGitHubDemo-DepGrp \
     --description "My GitHub deployment demo" \
     --github-location repository=repository,commitId=commit-id
   ```

   如果您正在使用本機 Windows 電腦：

   ```
   aws deploy create-deployment --application-name CodeDeployGitHubDemo-App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name CodeDeployGitHubDemo-DepGrp --description "My GitHub deployment demo" --github-location repository=repository,commitId=commit-id
   ```

# 步驟 7：監控和驗證部署
<a name="tutorials-github-verify"></a>

在此步驟中，您將使用 CodeDeploy 主控台或 AWS CLI 來驗證部署是否成功。您將使用 Web 瀏覽器中查看部署到您建立或設定執行個體的網頁。

**注意**  
如果您要部署到 Ubuntu Server 執行個體，請使用您自己的測試策略來判斷部署的修訂版在執行個體上是否如預期運作，然後前往下一個步驟。

**監控和驗證部署 (主控台)**

1. 在導覽窗格中，展開**部署**，然後選擇**部署**。

   

1. 在部署清單中，尋找應用程式****值為 **CodeDeployGitHubDemo-App** 和**部署群組**值為 **CodeDeployGitHubDemo-DepGrp** 的資料列。如果 **Succeeded (成功)** 或 **Failed (失敗)** 未出現在 **Status (狀態)** 欄中，請定期選擇 **Refresh (重新整理)** 按鈕。

1. 如果 **Failed (失敗)** 出現在 **Status (狀態)** 欄中，請按照 [檢視執行個體詳細資訊 （主控台）](instances-view-details.md#instances-view-details-console) 中的指示，排除部署問題。

1. 如果 **Succeeded (成功)** 出現在 **Status (狀態)** 欄中，您現在可以透過 Web 瀏覽器驗證部署。我們的範例修訂版將單一網頁部署到執行個體。如果您要部署到 Amazon EC2 執行個體，請在 Web 瀏覽器中，前往執行個體`http://public-dns`的 （例如 `http://ec2-01-234-567-890.compute-1.amazonaws.com`)。

1. 如果您可以看到網頁，那麼恭喜！您現在已成功使用 AWS CodeDeploy 從 GitHub 部署修訂，您可以提前跳到 [步驟 8：清理](tutorials-github-clean-up.md)。

**若要監控和驗證部署 (CLI)**

1. 呼叫 **list-deployments** 命令以取得名為 `CodeDeployGitHubDemo-App` 之應用程式的部署 ID 以及名為 `CodeDeployGitHubDemo-DepGrp` 的部署群組。

   ```
   aws deploy list-deployments --application-name CodeDeployGitHubDemo-App --deployment-group-name CodeDeployGitHubDemo-DepGrp --query "deployments" --output text
   ```

1. 呼叫 **get-deployment** 命令，提供從 **list-deployments** 命令輸出的部署 ID：

   ```
   aws deploy get-deployment --deployment-id deployment-id --query "deploymentInfo.[status, creator]" --output text
   ```

1. 如果傳回 **Failed (失敗)** ，請按照 [檢視執行個體詳細資訊 （主控台）](instances-view-details.md#instances-view-details-console) 中的指示來排除部署問題。

1. 如果傳回 **Succeeded (成功)**，您現在可以嘗試透過 Web 瀏覽器驗證部署。我們的範例修訂版是部署到執行個體的單一網頁。如果您要部署到 Amazon EC2 執行個體，您可以在 Web 瀏覽器中檢視此頁面，方法是前往 `http://public-dns` Amazon EC2 執行個體的 （例如 `http://ec2-01-234-567-890.compute-1.amazonaws.com`)。

1. 如果您可以看到網頁，那麼恭喜！您已成功使用 AWS CodeDeploy 從 GitHub 儲存庫進行部署。

# 步驟 8：清理
<a name="tutorials-github-clean-up"></a>

若要避免您在本教學課程中使用的資源進一步收費，您必須終止 Amazon EC2 執行個體及其相關聯的資源。或者，您可以刪除與此教學課程相關聯的 CodeDeploy 部署元件記錄。如果您使用 GitHub 儲存庫只適用於此教學課程，則您現在可以將其刪除。

## 刪除 CloudFormation 堆疊 （如果您使用 CloudFormation 範本建立 Amazon EC2 執行個體）
<a name="tutorials-github-clean-up-cloudformation-template"></a>

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

1. 在 **Stacks (堆疊)** 欄中，選擇開頭為 `CodeDeploySampleStack` 的堆疊。

1. 選擇 **刪除**。

1. 出現提示時，選擇 **Delete stack (刪除堆疊)**。Amazon EC2 執行個體和相關聯的 IAM 執行個體描述檔和服務角色會遭到刪除。

## 若要手動取消註冊和清除內部部署執行個體 (如果您佈建的是內部部署執行個體)
<a name="tutorials-github-clean-up-on-premises-instance"></a>

1. 使用 AWS CLI 對此處以 *your-instance-name* 表示的內部部署執行個體和*您所在區域的*關聯區域呼叫[取消註冊](https://docs.aws.amazon.com/cli/latest/reference/deploy/deregister.html)命令：

   ```
   aws deploy deregister --instance-name your-instance-name --no-delete-iam-user --region your-region
   ```

1. 從現場部署執行個體中，呼叫[解除安裝](https://docs.aws.amazon.com/cli/latest/reference/deploy/uninstall.html)命令：

   ```
   aws deploy uninstall
   ```

## 手動終止 Amazon EC2 執行個體 （如果您手動啟動 Amazon EC2 執行個體）
<a name="tutorials-github-clean-up-ec2-instance"></a>

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

1. 在導覽窗格的 **Instances (執行個體)** 下方，選擇 **Instances (執行個體)**。

1. 選取您要終止的 Amazon EC2 執行個體旁的方塊。在 **Actions (動作)** 選單中，指向 **Instance State (執行個體狀態)**，然後選擇 **Terminate (終止)**。

1. 出現提示時，選擇 **Yes, Terminate (是，終止)**。

## 刪除 CodeDeploy 部署元件記錄
<a name="tutorials-github-clean-up-codedeploy-records"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) 開啟 CodeDeploy 主控台。
**注意**  
使用您在 中設定的相同使用者登入[CodeDeploy 入門](getting-started-codedeploy.md)。

1. 在導覽窗格中，展開**部署**，然後選擇**應用程式**。

   

1. 選擇 **CodeDeployGitHubDemo-App**。

1. 選擇**刪除應用程式**。

1. 當出現提示時，輸入 **Delete**，然後選擇 **Delete (刪除)**。

## 刪除 GitHub 儲存庫
<a name="tutorials-github-clean-up-github-repository"></a>

請參閱 GitHub 中的[刪除儲存庫](https://help.github.com/articles/deleting-a-repository/)說明。 [GitHub ](https://help.github.com)

# 教學課程：將應用程式部署至 Amazon ECS
<a name="tutorial-ecs-deployment"></a>

 在本教學課程中，您將了解如何使用 CodeDeploy 將應用程式部署至 Amazon ECS。您從已建立並部署到 Amazon ECS 的應用程式開始。第一步是加上新標籤修改應用程式的任務定義檔案，以更新您的應用程式。接著，您可以使用 CodeDeploy 部署更新。在部署期間，CodeDeploy 會將您的更新安裝到新的替換任務集。然後，它會將生產流量從位於其原始任務集中的 Amazon ECS 應用程式的原始版本轉移到替代任務集中的更新版本。

 在 Amazon ECS 部署期間，CodeDeploy 會使用負載平衡器，其設定有兩個目標群組和一個生產流量接聽程式。下圖顯示部署開始之前，負載平衡器、生產接聽程式、目標群組和 Amazon ECS 應用程式之間的關聯。本教學課程會使用 Application Load Balancer。您也可以使用 Network Load Balancer。

![\[Application Load Balancer 或 Network Load Balancer、一個生產接聽程式、兩個目標群組、一個任務集和一個 Amazon ECS 服務。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-1.png)


 成功部署後，生產流量接聽程式會將流量轉送至新的替換任務集，並終止原始任務集。下圖顯示您的資源在成功部署後如何相關。如需詳細資訊，請參閱[Amazon ECS 部署期間會發生什麼情況](deployment-steps-ecs.md#deployment-steps-what-happens)。

![\[Application Load Balancer 或 Network Load Balancer、一個生產接聽程式、兩個目標群組和一個替代任務集。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-5.png)


如需如何使用 AWS CLI 將應用程式部署到 Amazon ECS 的詳細資訊，請參閱[教學課程：使用藍/綠部署建立服務](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html)。如需有關如何使用 CodePipeline 透過 CodeDeploy 偵測和自動部署變更至 Amazon ECS 服務的資訊，請參閱[教學課程：使用 Amazon ECR 來源和 ECS-to-CodeDeploy 部署建立管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html)。

完成本教學課程後，您可以使用您建立的 CodeDeploy 應用程式和部署群組，在 中新增部署驗證測試[教學課程：使用驗證測試部署 Amazon ECS 服務](tutorial-ecs-deployment-with-hooks.md)。

**Topics**
+ [先決條件](tutorial-ecs-prereqs.md)
+ [步驟 1：更新您的 Amazon ECS 應用程式](tutorial-ecs-update-the-ecs-application.md)
+ [步驟 2：建立 AppSpec 檔案](tutorial-ecs-create-appspec-file.md)
+ [步驟 3：使用 CodeDeploy 主控台部署您的應用程式](tutorial-ecs-deployment-deploy.md)
+ [步驟 4：清理](tutorial-ecs-clean-up.md)

# 先決條件
<a name="tutorial-ecs-prereqs"></a>

若要完成此教學課程，您必須先：
+  完成 [CodeDeploy 入門](getting-started-codedeploy.md)中的步驟 2 和 3。
+  建立已設定兩個目標群組和一個接聽程式的 Application Load Balancer。如需有關使用主控台建立負載平衡器的資訊，請參閱[設定 CodeDeploy Amazon ECS 部署的負載平衡器、目標群組和接聽程式](deployment-groups-create-load-balancer-for-ecs.md)。如需有關使用 建立負載平衡器的資訊 AWS CLI，請參閱《*Amazon Elastic Container Service 使用者指南*》中的[步驟 1：建立 Application Load Balancer](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html#create-blue-green-loadbalancer)。當您建立負載平衡器時，請為此教學課程記下以下事項：
  +  負載平衡器的名稱。
  +  目標群組的名稱。
  +  負載平衡器接聽程式所使用的連接埠。
+  建立 Amazon ECS 叢集和服務。如需詳細資訊，請參閱《*Amazon Elastic Container Service 使用者指南*》中的[教學課程：使用藍/綠部署建立](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html)服務中的步驟 2、3 和 4。請為此教學課程記下以下事項：
  +  Amazon ECS 叢集的名稱。
  +  Amazon ECS 服務所使用的任務定義的 ARN。
  +  Amazon ECS 服務所使用的容器名稱。
+  為您的 AppSpec 檔案建立 Amazon S3 儲存貯體。

# 步驟 1：更新您的 Amazon ECS 應用程式
<a name="tutorial-ecs-update-the-ecs-application"></a>

 在本節中，您可以使用其任務定義的新修訂來更新 Amazon ECS 應用程式。更新後的修訂會新增金鑰和標籤對。在 中[步驟 3：使用 CodeDeploy 主控台部署您的應用程式](tutorial-ecs-deployment-deploy.md)，您可以部署更新版本的 Amazon ECS 應用程式。

**更新您的任務定義**

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

1.  在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1. 選擇 Amazon ECS 服務使用的任務定義。

1. 選擇任務定義修訂版，然後選擇**建立新修訂版**、**建立新修訂版**。

1.  針對本教學課程，稍微更新任務定義，只新增一個標籤。在頁面底部標籤下****，輸入新的索引鍵和值對來建立新的標籤。

1.  選擇**建立**。

   任務定義的修訂編號會遞增 1。

1.  選擇 **JSON** 標籤。請記下以下項目，因為您在下一個步驟中需要此資訊。
   +  `taskDefinitionArn` 的值。格式為 `arn:aws:ecs:aws-region:account-id:task-definition/task-definition-family:task-definition-revision`。這是已更新之任務定義的 ARN。
   +  在 `containerDefinitions` 元素中，`name` 的值。這是容器的名稱。
   +  在 `portMappings` 元素中，`containerPort` 的值。這是容器的連接埠。

# 步驟 2：建立 AppSpec 檔案
<a name="tutorial-ecs-create-appspec-file"></a>

 在本節中，您會建立 AppSpec 檔案，並將其上傳至您在 [先決條件](tutorial-ecs-prereqs.md)區段中建立的 Amazon S3 儲存貯體。Amazon ECS 部署的 AppSpec 檔案會指定您的任務定義、容器名稱和容器連接埠。如需詳細資訊，請參閱[Amazon ECS 部署的 AppSpec 檔案範例](reference-appspec-file-example.md#appspec-file-example-ecs)及[Amazon ECS 部署的 AppSpec 'resources' 區段](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**建立 AppSpec 檔案**

1.  如果您想要使用 YAML 建立 AppSpec 檔案，請建立名為 的檔案`appspec.yml`。如果您想要使用 JSON 建立 AppSpec 檔案，請建立名為 的檔案`appspec.json`。

1.  根據您的 AppSpec 檔案是否使用 YAML 或 JSON，選擇適當的標籤，並將其內容複製到您剛建立的 AppSpec 檔案。對於 `TaskDefinition` 屬性，請使用您在[步驟 1：更新您的 Amazon ECS 應用程式](tutorial-ecs-update-the-ecs-application.md)一節記下的任務定義 ARN。

------
#### [ JSON AppSpec ]

   ```
   {
     "version": 0.0,
     "Resources": [
       {
         "TargetService": {
           "Type": "AWS::ECS::Service",
           "Properties": {
             "TaskDefinition": "arn:aws:ecs:aws-region-id:aws-account-id:task-definition/ecs-demo-task-definition:revision-number",
             "LoadBalancerInfo": {
               "ContainerName": "your-container-name",
               "ContainerPort": your-container-port
             }
           }
         }
       }
     ]
   }
   ```

------
#### [ YAML AppSpec ]

   ```
   version: 0.0
   Resources:
     - TargetService:
         Type: AWS::ECS::Service
         Properties:
           TaskDefinition: "arn:aws:ecs:aws-region-id:aws-account-id:task-definition/ecs-demo-task-definition:revision-number"
           LoadBalancerInfo:
             ContainerName: "your-container-name"
             ContainerPort: your-container-port
   ```

------
**注意**  
 您的替換任務集會從原始任務集繼承子網路、安全群組、平台版本及指派的公有 IP 值。您可以在 AppSpec 檔案中設定替代任務集的選用屬性，以覆寫這些值。如需詳細資訊，請參閱[Amazon ECS 部署的 AppSpec 'resources' 區段](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)及[Amazon ECS 部署的 AppSpec 檔案範例](reference-appspec-file-example.md#appspec-file-example-ecs)。

1.  將您的 AppSpec 檔案上傳至您建立做為本教學課程先決條件的 S3 儲存貯體。

# 步驟 3：使用 CodeDeploy 主控台部署您的應用程式
<a name="tutorial-ecs-deployment-deploy"></a>

 在本節中，您會建立 CodeDeploy 應用程式和部署群組，將更新的應用程式部署到 Amazon ECS。在部署期間，CodeDeploy 會在新的替換任務集中，將應用程式的生產流量轉移到其新版本。若要完成此步驟，您需要下列項目：
+  您的 Amazon ECS 叢集名稱。
+  您的 Amazon ECS 服務名稱。
+  您的 Application Load Balancer 名稱。
+  您的生產接聽程式連接埠。
+  您的目標群組名稱。
+  您建立的 S3 儲存貯體的名稱。

**建立 CodeDeploy 應用程式**

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

1. 選擇**建立應用程式**。

1. 在 **Application name (應用程式名稱)** 中，輸入 **ecs-demo-codedeploy-app**。

1. 在 **Compute Platform (運算平台)** 中，選擇 **Amazon ECS**。

1. 選擇**建立應用程式**。

**建立 CodeDeploy 部署群組**

1. 在應用程式頁面的 **Deployment groups (部署群組)** 標籤上，選擇 **Create deployment group (建立部署群組)**。

1. 在 **Deployment group name (部署群組名稱)** 中，輸入 **ecs-demo-dg**。

1. 在**服務角色**中，選擇授予 CodeDeploy 存取 Amazon ECS 的服務角色。如需詳細資訊，請參閱[的身分和存取管理 AWS CodeDeploy](security-iam.md)。

1. 在**環境組態**中，選擇您的 Amazon ECS 叢集名稱和服務名稱。

1. 從**負載平衡器**中，選擇為 Amazon ECS 服務提供流量的負載平衡器名稱。

1. 從**生產接聽程式連接埠**中，選擇為 Amazon ECS 服務提供生產流量的接聽程式連接埠和通訊協定 （例如 **HTTP：80**)。本教學課程不包含選用的測試接聽程式，因此請勿從 **Test listener port (測試接聽程式連接埠)** 中選擇連接埠。

1. 從 **Target group 1 name (目標群組 1 名稱)** 和 **Target group 2 name (目標群組 2 名稱)** 中，選擇在部署期間路由流量的目標群組。確定這些是您為負載平衡器建立的目標群組。何者用於目標群組 1，何者用於目標群組 2，都沒關係。

1. 選擇 **Reroute traffic immediately (立即重新路由流量)**。

1. 對於 **Original revision termination (原始修訂終止)**，選擇 0 天、0 小時和 5 分鐘。這可讓您看到部署比使用預設值 (1 小時) 更快完成。  
![\[CodeDeploy 主控台的環境組態區段。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/ecs-demo-create-acd-dg.png)

1. 選擇 **Create deployment group (建立部署群組)**。

**部署 Amazon ECS 應用程式**

1. 從您的部署群組主控台頁面，選擇 **Create deployment (建立部署)**。

1.  針對 **Deployment group (部署群組)**，選擇 **ecs-demo-dg**。

1.  針對 **Revision type (修訂版類型)**，選擇 **My application is stored in Amazon S3 (我的應用程式存放在 Amazon S3)**。在 **Revision location (修訂版位置)** 中，輸入您的 S3 儲存貯體的名稱。

1.  針對 **Revision file type (修訂檔案類型)**，視需要選擇 **.json** 或 **.yaml**。

1.  (選用) 在 **Deployment description (部署描述)** 中，輸入部署的描述。

1. 選擇 **Create deployment (建立部署)**。

1.  在 **Deployment status (部署狀態)** 中，您可以監控部署。在 100% 的生產流量路由到替代任務集之後，並在五分鐘等待時間到期之前，您可以選擇**終止原始任務集**，以立即終止原始任務集。如果您不選擇 **Terminate original task set (終止原始任務集)**，原始任務集會在您指定的五分鐘等待時間到期之後終止。  
![\[CodeDeploy 主控台的部署狀態區段。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-without-test-listener.png)

# 步驟 4：清理
<a name="tutorial-ecs-clean-up"></a>

 下一個教學課程 以本教學課程為基礎[教學課程：使用驗證測試部署 Amazon ECS 服務](tutorial-ecs-deployment-with-hooks.md)，並使用您建立的 CodeDeploy 應用程式和部署群組。如果您想要遵循該教學課程中的步驟，請略過此步驟，並且不要刪除您建立的資源。

**注意**  
 AWS 您的帳戶不會對您建立的 CodeDeploy 資源產生費用。

這些步驟中的資源名稱是本教學課程中建議的名稱 （例如，**ecs-demo-codedeploy-app**適用於 CodeDeploy 應用程式的名稱）。如果您使用不同的名稱，請務必在清理期間使用這些名稱。

1. 使用 [delete-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-deployment-group.html) 命令來刪除 CodeDeploy 部署群組。

   ```
   aws deploy delete-deployment-group --application-name ecs-demo-codedeploy-app --deployment-group-name ecs-demo-dg --region aws-region-id
   ```

1. 使用 [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 命令來刪除 CodeDeploy 應用程式。

   ```
   aws deploy delete-application --application-name ecs-demo-codedeploy-app --region aws-region-id
   ```

# 教學課程：使用驗證測試部署 Amazon ECS 服務
<a name="tutorial-ecs-deployment-with-hooks"></a>

 在本教學課程中，您將了解如何使用 Lambda 函數來驗證已更新 Amazon ECS 應用程式的部分部署。本教學課程使用 CodeDeploy 應用程式、CodeDeploy 部署群組，以及您在 中使用的 Amazon ECS 應用程式[教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)。請先完成該教學課程，再開始本教學課程。

 若要新增驗證測試，請先在 Lambda 函數中實作測試。接著，在部署 AppSpec 檔案中，為您要測試的生命週期掛鉤指定 Lambda 函數。如果驗證測試失敗，部署會停止、轉返，並標記為失敗。如果測試成功，部署會繼續下一個部署生命週期事件或勾點。

 在具有驗證測試的 Amazon ECS 部署期間，CodeDeploy 會使用負載平衡器，其設定有兩個目標群組：一個生產流量接聽程式和一個測試流量接聽程式。下圖顯示部署開始之前，負載平衡器、生產和測試接聽程式、目標群組和 Amazon ECS 應用程式之間的關聯。本教學課程會使用 Application Load Balancer。您也可以使用 Network Load Balancer。

![\[Application Load Balancer 或 Network Load Balancer、接聽程式、目標群組、任務集和 Amazon ECS 服務之間的連線。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-1.png)


 在 Amazon ECS 部署期間，有五個生命週期掛鉤可供測試。本教學課程會在第三個生命週期部署勾點 `AfterAllowTestTraffic` 期間實作一個測試。如需詳細資訊，請參閱[Amazon ECS 部署的生命週期事件掛鉤清單](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)。成功部署後，生產流量接聽程式會將流量轉送至新的替換任務集，並終止原始任務集。下圖顯示您的資源在成功部署後如何相關。如需詳細資訊，請參閱[Amazon ECS 部署期間會發生什麼情況](deployment-steps-ecs.md#deployment-steps-what-happens)。

![\[部署後Application Load Balancer 或 Network Load Balancer、接聽程式、目標群組和替換任務集之間的連線。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-6.png)


**注意**  
完成本教學課程可能會導致 AWS 您的帳戶產生費用。這些包括 CodeDeploy AWS Lambda和 CloudWatch 的可能費用。如需詳細資訊，請參閱[AWS CodeDeploy 定價](https://aws.amazon.com/codedeploy/pricing/)、[AWS Lambda 定價](https://aws.amazon.com/lambda/pricing/)和 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

**Topics**
+ [先決條件](tutorial-ecs-with-hooks-prereqs.md)
+ [步驟 1：建立測試接聽程式](tutorial-ecs-with-hooks-create-second-listener.md)
+ [步驟 2：更新您的 Amazon ECS 應用程式](tutorial-ecs-with-hooks-update-the-ecs-application.md)
+ [步驟 3：建立 lifecycle hook Lambda 函數](tutorial-ecs-with-hooks-create-hooks.md)
+ [步驟 4：更新您的 AppSpec 檔案](tutorial-ecs-with-hooks-create-appspec-file.md)
+ [步驟 5：使用 CodeDeploy 主控台部署您的 Amazon ECS 服務](tutorial-ecs-with-hooks-deployment.md)
+ [步驟 6：在 CloudWatch Logs 中檢視 Lambda 掛鉤函數輸出](tutorial-ecs-with-hooks-view-cw-logs.md)
+ [步驟 7：清除](tutoria-ecs-with-hooks-clean-up.md)

# 先決條件
<a name="tutorial-ecs-with-hooks-prereqs"></a>

若要成功完成此教學課程，您必須先：
+  完成 中 [先決條件](tutorial-ecs-prereqs.md) 的先決條件[教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)。
+  完成「[教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)」中的步驟。記下以下項目：
  +  負載平衡器的名稱。
  +  目標群組的名稱。
  +  負載平衡器接聽程式所使用的連接埠。
  +  負載平衡器的 ARN。這可用來建立新的接聽程式。
  +  其中一個目標群組的 ARN。這可用來建立新的接聽程式。
  +  您建立的 CodeDeploy 應用程式和部署群組。
  +  您建立的 AppSpec 檔案，供 CodeDeploy 部署使用。您在此教學課程中會編輯此檔案。

# 步驟 1：建立測試接聽程式
<a name="tutorial-ecs-with-hooks-create-second-listener"></a>

 具有驗證測試的 Amazon ECS 部署需要第二個接聽程式。此接聽程式用於在替代任務集中將測試流量提供給更新的 Amazon ECS 應用程式。您的驗證測試會針對測試流量執行。

 測試流量的接聽程式可以使用任一個目標群組。使用 [create-listener](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-listener.html) AWS CLI 命令建立第二個接聽程式，其中包含將測試流量轉送至連接埠 8080 的預設規則。使用負載平衡器的 ARN 和其中一個目標群組的 ARN。

```
aws elbv2 create-listener --load-balancer-arn your-load-balancer-arn \
--protocol HTTP --port 8080 \
--default-actions Type=forward,TargetGroupArn=your-target-group-arn --region your-aws-region
```

# 步驟 2：更新您的 Amazon ECS 應用程式
<a name="tutorial-ecs-with-hooks-update-the-ecs-application"></a>

 在本節中，您將更新 Amazon ECS 應用程式以使用其任務定義的新修訂。您建立新的修訂版，新增一個標籤稍做更新。

**更新您的任務定義**

1. 開啟 Amazon ECS 傳統主控台，網址為 [https://console.aws.amazon.com/ecs/](https://console.aws.amazon.com/ecs/)。

1.  在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1.  選取 Amazon ECS 服務使用之任務定義的核取方塊。

1.  選擇 **Create new revision (建立新的修訂)**。

1.  稍微更新任務定義，只新增一個標籤。在頁面底部的 **Tags (標籤)** 中，輸入新的鍵值對來建立新的標籤。

1.  選擇**建立**。您應該會看到任務定義的修訂版編號已增加 1。

1.  選擇 **JSON** 標籤。記下 `taskDefinitionArn` 的值。格式為 `arn:aws:ecs:aws-region: account-id:task-definition/task-definition-family: task-definition-revision`。這是已更新之任務定義的 ARN。

# 步驟 3：建立 lifecycle hook Lambda 函數
<a name="tutorial-ecs-with-hooks-create-hooks"></a>

在本節中，您會為 Amazon ECS 部署的`AfterAllowTestTraffic`掛鉤實作一個 Lambda 函數。Lambda 函數會在安裝更新的 Amazon ECS 應用程式之前執行驗證測試。在此教學課程中，Lambda 函數會傳回 `Succeeded`。在真實世界部署期間，驗證測試會傳回 `Succeeded` 或 `Failed`，取決於驗證測試的結果。此外，在實際部署期間，您可以為一或多個其他 Amazon ECS 部署生命週期事件掛鉤 (`BeforeInstall`、`BeforeAllowTraffic`、 `AfterInstall`和 ) 實作 Lambda 測試函數`AfterAllowTraffic`。如需詳細資訊，請參閱[Amazon ECS 部署的生命週期事件掛鉤清單](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)。

 建立 Lambda 函數需要 IAM 角色。此角色授予 Lambda 函數寫入 CloudWatch Logs 的許可，並設定 CodeDeploy 生命週期掛鉤的狀態。

**若要建立一個 IAM 角色**

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

1. 從導覽窗格，選擇 **Roles (角色)**，然後選擇 **Create role (建立角色)**。

1.  建立具備下列屬性的角色：
   +  **Trusted entity (信任實體)**：**AWS Lambda**。
   +  **Permissions (許可)**：**AWSLambdaBasicExecutionRole**。這會授予 Lambda 函數寫入 CloudWatch Logs 的許可。
   +  **Role name (角色名稱)**：**`lambda-cli-hook-role`**。

   如需詳細資訊，請參閱[建立 AWS Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/with-userapp.html#with-userapp-walkthrough-custom-events-create-iam-role)。

1.  將許可 `codedeploy:PutLifecycleEventHookExecutionStatus` 連接至您建立的角色。這會授予 Lambda 函數在部署期間設定 CodeDeploy 生命週期掛鉤狀態的許可。如需詳細資訊，請參閱*AWS Identity and Access Management 《 使用者指南*》中的[新增 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)和《*CodeDeploy API 參考*》中的 [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)。

**建立`AfterAllowTestTraffic`勾點 Lambda 函數**

1.  使用下列內容建立名為 `AfterAllowTestTraffic.js` 的檔案。

   ```
   'use strict';
    
    const AWS = require('aws-sdk');
    const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
    
    exports.handler = (event, context, callback) => {
    
    	console.log("Entering AfterAllowTestTraffic hook.");
    	
    	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
     var deploymentId = event.DeploymentId;
    	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
    	var validationTestResult = "Failed";
    	
    	// Perform AfterAllowTestTraffic validation tests here. Set the test result 
    	// to "Succeeded" for this tutorial.
    	console.log("This is where AfterAllowTestTraffic validation tests happen.")
    	validationTestResult = "Succeeded";
    	
    	// Complete the AfterAllowTestTraffic hook by sending CodeDeploy the validation status
    	var params = {
    		deploymentId: deploymentId,
    		lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
    		status: validationTestResult // status can be 'Succeeded' or 'Failed'
    	};
    	
    	// Pass CodeDeploy the prepared validation test results.
    	codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
    		if (err) {
    			// Validation failed.
    			console.log('AfterAllowTestTraffic validation tests failed');
    			console.log(err, err.stack);
    			callback("CodeDeploy Status update failed");
    		} else {
    			// Validation succeeded.
    			console.log("AfterAllowTestTraffic validation tests succeeded");
    			callback(null, "AfterAllowTestTraffic validation tests succeeded");
    		}
    	});
    }
   ```

1.  建立 Lambda 部署套件。

   ```
   zip AfterAllowTestTraffic.zip AfterAllowTestTraffic.js 
   ```

1.  使用 `create-function`命令為您的`AfterAllowTestTraffic`勾點建立 Lambda 函數。

   ```
   aws lambda create-function --function-name AfterAllowTestTraffic \
          --zip-file fileb://AfterAllowTestTraffic.zip \
          --handler AfterAllowTestTraffic.handler \
          --runtime nodejs10.x \
          --role arn:aws:iam::aws-account-id:role/lambda-cli-hook-role
   ```

1.  在`create-function`回應中記下您的 Lambda 函數 ARN。在下一個步驟中更新 CodeDeploy 部署的 AppSpec 檔案時，您會使用此 ARN。

# 步驟 4：更新您的 AppSpec 檔案
<a name="tutorial-ecs-with-hooks-create-appspec-file"></a>

 在本節中，您會使用 `Hooks`區段更新 AppSpec 檔案。在 `Hooks`區段中，您可以為`AfterAllowTestTraffic`生命週期掛鉤指定 Lambda 函數。

**更新您的 AppSpec 檔案**

1.  開啟您在 中建立[步驟 2：建立 AppSpec 檔案](tutorial-ecs-create-appspec-file.md)的 AppSpec 檔案[教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)。

1.  使用您在[步驟 2：更新您的 Amazon ECS 應用程式](tutorial-ecs-with-hooks-update-the-ecs-application.md)中記下的任務定義 ARN 來更新 `TaskDefinition` 屬性。

1. 將 `Hooks`區段複製並貼到您的 AppSpec 檔案。`AfterAllowTestTraffic` 使用您在 中記下的 Lambda 函數 ARN，更新 之後的 ARN[步驟 3：建立 lifecycle hook Lambda 函數](tutorial-ecs-with-hooks-create-hooks.md)。

------
#### [ JSON AppSpec ]

   ```
   {
     "version": 0.0,
     "Resources": [
       {
         "TargetService": {
           "Type": "AWS::ECS::Service",
           "Properties": {
             "TaskDefinition": "arn:aws:ecs:aws-region-id:aws-account-id::task-definition/ecs-demo-task-definition:revision-number",
             "LoadBalancerInfo": {
               "ContainerName": "sample-website",
               "ContainerPort": 80
             }
           }
         }
       }
     ],
     "Hooks": [
       {
         "AfterAllowTestTraffic": "arn:aws:lambda:aws-region-id:aws-account-id:function:AfterAllowTestTraffic"
       }
     ]
   }
   ```

------
#### [ YAML AppSpec ]

   ```
   version: 0.0
   Resources:
     - TargetService:
         Type: AWS::ECS::Service
         Properties:
           TaskDefinition: "arn:aws:ecs:aws-region-id:aws-account-id::task-definition/ecs-demo-task-definition:revision-number"
           LoadBalancerInfo:
             ContainerName: "sample-website"
             ContainerPort: 80
   Hooks:
     - AfterAllowTestTraffic: "arn:aws:lambda:aws-region-id:aws-account-id:function:AfterAllowTestTraffic"
   ```

------

1.  儲存您的 AppSpec 檔案並上傳至其 S3 儲存貯體。

# 步驟 5：使用 CodeDeploy 主控台部署您的 Amazon ECS 服務
<a name="tutorial-ecs-with-hooks-deployment"></a>

 在本節中，您會指定測試接聽程式的連接埠，以更新部署群組。這是您在[步驟 1：建立測試接聽程式](tutorial-ecs-with-hooks-create-second-listener.md)中建立的接聽程式。在部署期間，CodeDeploy 會使用測試接聽程式提供給替代任務集的測試流量，在`AfterAllowTestTraffic`部署生命週期掛鉤期間執行驗證測試。您的驗證測試會傳回結果 `Succeeded`，因此部署會繼續進行下一個部署生命週期事件。在真實世界案例中，您的測試函數會傳回 `Succeeded` 或 `Failed`。

**將測試接聽程式新增至您的部署群組**

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

1. 從導覽窗格中，選擇 **Applications (應用程式)**。

1. 選擇您在[教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)中建立的應用程式。如果您使用建議的名稱，則為 **ecs-demo-codedeploy-app**。

1. 在 **Deployment group (部署群組)** 中，選擇您在[教學課程：將應用程式部署至 Amazon ECS](tutorial-ecs-deployment.md)中建立的部署群組。如果您已使用建議的名稱，則為 **ecs-demo-dg**。

1.  選擇**編輯**。

1. 從 **Test listener port (測試接聽程式連接埠)** 中，為您稍早在此教學課程中建立的測試接聽程式，選擇連接埠和通訊協定。此應為 **HTTP: 8080**。

1.  選擇**儲存變更**。

**部署 Amazon ECS 應用程式**

1. 從您的部署群組主控台頁面，選擇 **Create deployment (建立部署)**。

1.  針對 **Deployment group (部署群組)**，選擇 **ecs-demo-dg**。

1.  針對 **Revision type (修訂版類型)**，選擇 **My application is stored in Amazon S3 (我的應用程式存放在 Amazon S3)**。在**修訂位置**中，輸入 S3 儲存貯體的名稱和 AppSpec 檔案 （例如 **s3://my-s3-bucket/appspec.json**)。

1.  針對 **Revision file type (修訂檔案類型)**，視需要選擇 **.json** 或 **.yaml**。

1.  (選用) 在 **Deployment description (部署描述)** 中，輸入部署的描述。

1. 選擇 **Create deployment (建立部署)**。

 您可以在 **Deployment status (部署狀態)**中監控部署。將 100% 的生產流量路由至替代任務集後，您可以選擇**終止原始任務集**，以立即終止原始任務集。如果您不選擇 **Terminate original task set (終止原始任務集)**，原始任務集會在您建立部署群組時指定的持續時間後終止。

![\[CodeDeploy 主控台的部署狀態區段。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-with-test-listener.png)


# 步驟 6：在 CloudWatch Logs 中檢視 Lambda 掛鉤函數輸出
<a name="tutorial-ecs-with-hooks-view-cw-logs"></a>

 如果您的 CodeDeploy 部署成功，Lambda 勾點函數中的驗證測試也會成功。您可以在 CloudWatch Logs 中查看勾點函數的日誌來確認這一點。

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1.  從導覽窗格中，選擇 **Logs (日誌)**。您應該會看到 AppSpec 檔案中所指定 Lambda 勾點函數的一個新日誌群組。  
![\[CloudWatch 主控台中的新日誌群組。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/ecs-demo-cw-logs.png)

1.  選擇新的日誌群組。這應該是 **/aws/lambda/AfterAllowTestTrafficHook**。

1.  選擇日誌串流。如果您看到多個日誌串流，請選擇在 **Last Event Time (上次事件時間)** 下具有最新日期和時間的日誌串流。

1.  展開日誌串流事件，以確認您的 Lambda 勾點函數將成功訊息寫入日誌。以下顯示 `AfterAllowTraffic` Lambda 勾點函數成功。  
![\[顯示AfterAllowTraffic勾點的日誌串流事件。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/ecs-demo-cw-log-events.png)

# 步驟 7：清除
<a name="tutoria-ecs-with-hooks-clean-up"></a>

 完成此教學課程時，清除與其相關的資源，以免未使用的資源產生費用。此步驟中的資源名稱是本教學課程中建議的名稱 （例如，**ecs-demo-codedeploy-app**適用於 CodeDeploy 應用程式的名稱）。如果您使用不同的名稱，請務必在清理時使用這些名稱。

**清除教學課程資源**

1. 使用 [delete-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-deployment-group.html) 命令來刪除 CodeDeploy 部署群組。

   ```
   aws deploy delete-deployment-group --application-name ecs-demo-deployment-group --deployment-group-name ecs-demo-dg --region aws-region-id
   ```

1. 使用 [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 命令來刪除 CodeDeploy 應用程式。

   ```
   aws deploy delete-application --application-name ecs-demo-deployment-group --region aws-region-id
   ```

1. 使用 [delete-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/delete-function.html) 命令來刪除 Lambda 勾點函數。

   ```
   aws lambda delete-function --function-name AfterAllowTestTraffic
   ```

1. 使用 [delete-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/delete-log-group.html) 命令來刪除 CloudWatch 日誌群組。

   ```
   aws logs delete-log-group --log-group-name /aws/lambda/AfterAllowTestTraffic
   ```

# 教學課程：使用 CodeDeploy 和無 AWS 伺服器應用程式模型部署更新的 Lambda 函數
<a name="tutorial-lambda-sam"></a>

AWS SAM 是用於建置無伺服器應用程式的開放原始碼架構。它會將 AWS SAM 範本中的 YAML CloudFormation 語法轉換並擴展為語法，以建置無伺服器應用程式，例如 Lambda 函數。如需詳細資訊，請參閱[什麼是無 AWS 伺服器應用程式模型？](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) 

 在本教學課程中，您會使用 AWS SAM 來建立執行下列動作的解決方案：
+  建立您的 Lambda 函數。
+  建立 CodeDeploy 應用程式和部署群組。
+  建立兩個 Lambda 函數，在 CodeDeploy 生命週期關聯期間執行部署驗證測試。
+  偵測 Lambda 函數更新的時間。更新 Lambda 函數會觸發 CodeDeploy 的部署，以逐步將生產流量從 Lambda 函數的原始版本轉移到更新版本。

**注意**  
本教學要求您建立資源，可能會對您的 AWS 帳戶收費。這包括 CodeDeploy、Amazon CloudWatch 和 的可能費用 AWS Lambda。如需詳細資訊，請參閱 [CodeDeploy 定價](https://aws.amazon.com/codedeploy/pricing/)、[Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)和[AWS Lambda 定價](https://aws.amazon.com/lambda/pricing/)。

**Topics**
+ [先決條件](tutorial-lambda-sam-prereqs.md)
+ [步驟 1：設定您的基礎設施](tutorial-lambda-sam-setup-infrastructure.md)
+ [步驟 2：更新 Lambda 函數](tutorial-lambda-sam-update-function.md)
+ [步驟 3：部署更新的 Lambda 函數](tutorial-lambda-sam-deploy-update.md)
+ [步驟 4：檢視您的部署結果](tutorial-lambda-sam-deploy-view-results.md)
+ [步驟 5：清除](tutorial-lambda-clean-up.md)

# 先決條件
<a name="tutorial-lambda-sam-prereqs"></a>

若要完成此教學課程，您必須先：
+  完成「[CodeDeploy 入門](getting-started-codedeploy.md)」中的步驟。
+  安裝 AWS Serverless Application Model CLI。如需詳細資訊，請參閱[安裝 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)。
+  建立 S3 儲存貯體。 AWS SAM 會將 [AWS SAM 範本](https://docs.aws.amazon.com/en_us/codedeploy/latest/userguide/tutorial-lambda-sam-template.html)中參考的成品上傳至此儲存貯體。

# 步驟 1：設定您的基礎設施
<a name="tutorial-lambda-sam-setup-infrastructure"></a>

 本主題說明如何使用 AWS SAM 為您的 AWS SAM 範本和 Lambda 函數建立檔案。然後，您可以使用 AWS SAM `package`和 `deploy`命令來產生基礎設施中的元件。當您的基礎設施準備就緒時，您會有一個 CodeDeploy 應用程式和部署群組、要更新和部署的 Lambda 函數，以及兩個包含部署 Lambda 函數時執行之驗證測試的 Lambda 函數。完成後，您可以使用 在 Lambda 主控台或 中 CloudFormation 檢視元件， AWS CLI 以測試 Lambda 函數。

**Topics**
+ [建立您的檔案](tutorial-lambda-create-files.md)
+ [封裝 AWS SAM 應用程式](tutorial-lambda-sam-package.md)
+ [部署 AWS SAM 應用程式](tutorial-lambda-sam-deploy.md)
+ [（選用） 檢查和測試您的基礎設施](tutorial-lambda-sam-confirm-components.md)

# 建立您的檔案
<a name="tutorial-lambda-create-files"></a>

 若要建立您的基礎設施，您必須建立以下檔案：
+ `template.yml`
+ `myDateTimeFunction.js`
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`

**Topics**
+ [建立您的 AWS SAM 範本](tutorial-lambda-sam-template.md)
+ [為您的 Lambda 函數建立檔案](tutorial-lambda-sam-create-lambda-function.md)
+ [為您的 BeforeAllowTraffic Lambda 函數建立檔案](tutorial-lambda-sam-create-lambda-before-traffic.md)
+ [為您的 AfterAllowTraffic Lambda 函數建立檔案](tutorial-lambda-sam-create-lambda-after-traffic.md)

# 建立您的 AWS SAM 範本
<a name="tutorial-lambda-sam-template"></a>

建立 AWS SAM 範本檔案，指定基礎設施中的元件。

**建立您的 AWS SAM 範本**

1.  建立名為 `SAM-Tutorial` 的目錄。

1.  在 `SAM-Tutorial` 目錄中，建立名為 `template.yml` 的檔案。

1.  將下列 YAML 程式碼複製到 `template.yml` 中。這是您的 AWS SAM 範本。

   ```
   AWSTemplateFormatVersion : '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: A sample SAM template for deploying Lambda functions.
   
   Resources:
   # Details about the myDateTimeFunction Lambda function
     myDateTimeFunction:
       Type: AWS::Serverless::Function
       Properties:
         Handler: myDateTimeFunction.handler
         Runtime: nodejs18.x
   # Instructs your myDateTimeFunction is published to an alias named "live".      
         AutoPublishAlias: live
   # Grants this function permission to call lambda:InvokeFunction
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: '*'
         DeploymentPreference:
   # Specifies the deployment configuration      
             Type: Linear10PercentEvery1Minute
   # Specifies Lambda functions for deployment lifecycle hooks
             Hooks:
               PreTraffic: !Ref beforeAllowTraffic
               PostTraffic: !Ref afterAllowTraffic
               
   # Specifies the BeforeAllowTraffic lifecycle hook Lambda function
     beforeAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: beforeAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call lambda:InvokeFunction        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_beforeAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
             
   # Specifies the AfterAllowTraffic lifecycle hook Lambda function
     afterAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: afterAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus         
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call lambda:InvokeFunction          
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_afterAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
   ```

此範本指定下列項目。如需詳細資訊，請參閱[AWS SAM 範本概念](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)。

**稱為 的 Lambda 函數 `myDateTimeFunction`**  
 發佈此 Lambda 函數時，範本中的`AutoPublishAlias`行會將其連結至名為 的別名`live`。在本教學課程稍後，此函數的更新會透過 觸發部署 AWS CodeDeploy ，逐步將生產流量從原始版本轉移到更新版本。

**兩個 Lambda 部署驗證函數**  
 下列 Lambda 函數會在 CodeDeploy 生命週期關聯期間執行。函數中的程式碼會驗證已更新的 `myDateTimeFunction` 是否部署完成。驗證測試的結果會使用其 `PutLifecycleEventHookExecutionStatus` API 方法傳遞至 CodeDeploy。如果驗證測試失敗，部署會失敗並轉返。  
+  `CodeDeployHook_beforeAllowTraffic` 會在 `BeforeAllowTraffic` 勾點期間執行。
+  `CodeDeployHook_afterAllowTraffic` 會在 `AfterAllowTraffic` 勾點期間執行。
兩個函數的名稱以 `CodeDeployHook_` 開頭。此`CodeDeployRoleForLambda`角色僅允許在名稱開頭為此字首的 Lambda 函數中呼叫 Lambda `invoke`方法。如需詳細資訊，請參閱 *CodeDeploy API 參考*中的 [AWS Lambda 部署的 AppSpec 'hooks' 區段](reference-appspec-file-structure-hooks.md#appspec-hooks-lambda)和 [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)。

**自動偵測更新的 Lambda 函數**  
 `AutoPublishAlias` 一詞告知框架偵測 `myDateTimeFunction` 函數何時變更，然後使用 `live` 別名部署此函數。

**部署組態**  
 部署組態會決定 CodeDeploy 應用程式將流量從 Lambda 函數的原始版本轉移到新版本的速率。此範本指定預先定義的部署組態 `Linear10PercentEvery1Minute`。  
 您無法在 AWS SAM 範本中指定自訂部署組態。如需詳細資訊，請參閱[使用 CodeDeploy 建立部署組態](deployment-configurations-create.md)。

**部署生命週期勾點函數**  
 `Hooks` 區段指定在生命週期事件勾點期間執行的函數。`PreTraffic` 指定在 `BeforeAllowTraffic` 勾點期間執行的函數。`PostTraffic` 指定在 `AfterAllowTraffic` 勾點期間執行的函數。

**Lambda 叫用另一個 Lambda 函數的許可**  
 指定的`lambda:InvokeFunction`許可會授予 SAM 應用程式用來叫用 Lambda AWS 函數的 角色許可。當 `CodeDeployHook_beforeAllowTraffic`和 `CodeDeployHook_afterAllowTraffic`函數在驗證測試期間調用部署的 Lambda 函數時，這是必要的。

# 為您的 Lambda 函數建立檔案
<a name="tutorial-lambda-sam-create-lambda-function"></a>

為您稍後在此教學課程中更新和部署的函數建立檔案。

**注意**  
 Lambda 函數可以使用 支援的任何執行時間 AWS Lambda。如需詳細資訊，請參閱 [AWS Lambda 執行時間](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)。

**建立 Lambda 函數**

1.  建立文字檔案，並在 `SAM-Tutorial` 目錄中儲存為 `myDateTimeFunction.js`。

1.  將下列 Node.js 程式碼複製到 `myDateTimeFunction.js` 中。

   

   ```
   'use strict';
       
       exports.handler = function(event, context, callback) {
       
         if (event.body) {
           event = JSON.parse(event.body);
         }
       
         var sc; // Status code
         var result = ""; // Response payload
       
         switch(event.option) {
           case "date": 
             switch(event.period) {
               case "yesterday":
                 result = setDateResult("yesterday");
                 sc = 200;
                 break;
               case "today":
                 result = setDateResult();
                 sc = 200;
                 break;
               case "tomorrow":
                 result = setDateResult("tomorrow");
                 sc = 200;
                 break;
               default:
                 result = {
                   "error": "Must specify 'yesterday', 'today', or 'tomorrow'."
                 };
                 sc = 400;
                 break;
             }
             break;
             
       /*      Later in this tutorial, you update this function by uncommenting 
               this section. The framework created by AWS SAM detects the update 
               and triggers a deployment by CodeDeploy. The deployment shifts 
               production traffic to the updated version of this function.
               
               case "time":
               var d = new Date();
               var h = d.getHours();
               var mi = d.getMinutes();
               var s = d.getSeconds();
       
               result = {
                 "hour": h,
                 "minute": mi,
                 "second": s
               };
               sc = 200;
               break;
       */
             default:
               result = {
                 "error": "Must specify 'date' or 'time'."
               };
               sc = 400;
             break;
         }
       
         const response = {
           statusCode: sc,
           headers: { "Content-type": "application/json" },
           body: JSON.stringify( result )
         };
       
         callback(null, response);
       
         function setDateResult(option) {
       
           var d = new Date(); // Today
           var mo; // Month
           var da; // Day
           var y; // Year
       
           switch(option) {
             case "yesterday":
               d.setDate(d.getDate() - 1);
               break;
             case "tomorrow":
               d.setDate(d.getDate() + 1);
             default:
              break;
           }
       
           mo = d.getMonth() + 1; // Months are zero offset (0-11)
           da = d.getDate();
           y = d.getFullYear();
       
           result = {
             "month": mo,
             "day": da,
             "year": y
           };
       
           return result;
         }
       };
   ```

Lambda 函數會傳回昨天、今天或明天的日、月和年。稍後在本教學課程中，您會取消註解程式碼，以更新函數來傳回您所指定的日期或時間的相關資訊 (例如，年、月、日，或目前的時、分、秒)。建立的架構會 AWS SAM 偵測並部署函數的更新版本。

**注意**  
 此 Lambda 函數也用於 AWS Cloud9 教學課程。 AWS Cloud9 是雲端型整合開發環境。如需有關如何在 中建立、執行、更新和偵錯此函數的資訊 AWS Cloud9，請參閱 [AWS Lambda 教學課程 AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/tutorial-lambda.html)。

# 為您的 BeforeAllowTraffic Lambda 函數建立檔案
<a name="tutorial-lambda-sam-create-lambda-before-traffic"></a>

為您的`beforeAllowTraffic`勾點 Lambda 函數建立 檔案。

1.  建立文字檔案，並在 `SAM-Tutorial` 目錄中儲存為 `beforeAllowTraffic.js`。

1.  將下列 Node.js 程式碼複製到 `beforeAllowTraffic.js` 中。此函數會在您的部署 `BeforeAllowTraffic` 勾點期間執行。

   ```
   'use strict';
       
       const AWS = require('aws-sdk'); 
       const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
       var lambda = new AWS.Lambda();
       
       exports.handler = (event, context, callback) => {
       
       	console.log("Entering PreTraffic Hook!");
       	
       	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
         var deploymentId = event.DeploymentId;
       	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
       
       	var functionToTest = process.env.NewVersion;
       	console.log("BeforeAllowTraffic hook tests started");
       	console.log("Testing new function version: " + functionToTest);
       
       	// Create parameters to pass to the updated Lambda function that
       	// include the newly added "time" option. If the function did not
       	// update, then the "time" option is invalid and function returns
       	// a statusCode of 400 indicating it failed.
       	var lambdaParams = {
       		FunctionName: functionToTest,    
       		Payload: "{\"option\": \"time\"}", 
       		InvocationType: "RequestResponse"
       	};
       
       	var lambdaResult = "Failed";
       	// Invoke the updated Lambda function.
       	lambda.invoke(lambdaParams, function(err, data) {
       		if (err){	// an error occurred
       			console.log(err, err.stack);
       			lambdaResult = "Failed";
       		}
       		else{	// successful response
       			var result = JSON.parse(data.Payload);
       			console.log("Result: " +  JSON.stringify(result));
             console.log("statusCode: " + result.statusCode);
             
             // Check if the status code returned by the updated
             // function is 400. If it is, then it failed. If 
             // is not, then it succeeded.
       			if (result.statusCode != "400"){
               console.log("Validation succeeded");
       				lambdaResult = "Succeeded";
             }
             else {
               console.log("Validation failed");
             }
       
       			// Complete the PreTraffic Hook by sending CodeDeploy the validation status
       			var params = {
       				deploymentId: deploymentId,
       				lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
       				status: lambdaResult // status can be 'Succeeded' or 'Failed'
       			};
       			
       			// Pass CodeDeploy the prepared validation test results.
       			codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
       				if (err) {
       					// Validation failed.
       					console.log("CodeDeploy Status update failed");
       					console.log(err, err.stack);
       					callback("CodeDeploy Status update failed");
       				} else {
       					// Validation succeeded.
       					console.log("CodeDeploy status updated successfully");
       					callback(null, "CodeDeploy status updated successfully");
       				}
       			});
       		}  
       	});
       }
   ```

# 為您的 AfterAllowTraffic Lambda 函數建立檔案
<a name="tutorial-lambda-sam-create-lambda-after-traffic"></a>

為您的`afterAllowTraffic`勾點 Lambda 函數建立 檔案。

1.  建立文字檔案，並在 `SAM-Tutorial` 目錄中儲存為 `afterAllowTraffic.js`。

1.  將下列 Node.js 程式碼複製到 `afterAllowTraffic.js` 中。此函數會在您的部署 `AfterAllowTraffic` 勾點期間執行。

   ```
   'use strict';
       
       const AWS = require('aws-sdk');
       const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
       var lambda = new AWS.Lambda();
       
       exports.handler = (event, context, callback) => {
       
       	console.log("Entering PostTraffic Hook!");
       	
       	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
         var deploymentId = event.DeploymentId;
       	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
       
       	var functionToTest = process.env.NewVersion;
       	console.log("AfterAllowTraffic hook tests started");
       	console.log("Testing new function version: " + functionToTest);
       
       	// Create parameters to pass to the updated Lambda function that
       	// include the original "date" parameter. If the function did not 
       	// update as expected, then the "date" option might be invalid. If 
       	// the parameter is invalid, the function returns
       	// a statusCode of 400 indicating it failed.
       	var lambdaParams = {
       		FunctionName: functionToTest,    
       		Payload: "{\"option\": \"date\", \"period\": \"today\"}", 
       		InvocationType: "RequestResponse"
       	};
       
       	var lambdaResult = "Failed";
       	// Invoke the updated Lambda function.
       	lambda.invoke(lambdaParams, function(err, data) {
       		if (err){	// an error occurred
       			console.log(err, err.stack);
       			lambdaResult = "Failed";
       		}
       		else{	// successful response
       			var result = JSON.parse(data.Payload);
       			console.log("Result: " +  JSON.stringify(result));
             console.log("statusCode: " + result.statusCode);
             
             // Check if the status code returned by the updated
             // function is 400. If it is, then it failed. If 
             // is not, then it succeeded.
       			if (result.statusCode != "400"){
               console.log("Validation of time parameter succeeded");
       				lambdaResult = "Succeeded";
             }
             else {
               console.log("Validation failed");
             }
       
       			// Complete the PostTraffic Hook by sending CodeDeploy the validation status
       			var params = {
       				deploymentId: deploymentId,
       				lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
       				status: lambdaResult // status can be 'Succeeded' or 'Failed'
       			};
       			
       			// Pass CodeDeploy the prepared validation test results.
       			codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
       				if (err) {
       					// Validation failed.
       					console.log("CodeDeploy Status update failed");
       					console.log(err, err.stack);
       					callback("CodeDeploy Status update failed");
       				} else {
       					// Validation succeeded.
       					console.log("CodeDeploy status updated successfully");
       					callback(null, "CodeDeploy status updated successfully");
       				}
       			});
       		}  
       	});
       }
   ```

# 封裝 AWS SAM 應用程式
<a name="tutorial-lambda-sam-package"></a>

 您的 `SAM-Tutorial` 目錄現在應該有四個檔案：
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`
+ `myDateTimeFunction.js`
+ `template.yml`

 您現在可以使用 AWS SAM **sam package**命令為您的 Lambda 函數和 CodeDeploy 應用程式建立和封裝成品。成品會上傳至 S3 儲存貯體。命令的輸出是名為 `package.yml` 的新檔案。SAM AWS **sam deploy**命令會在下一個步驟中使用此檔案。

**注意**  
 如需 **sam package**命令的詳細資訊，請參閱《 *AWS Serverless Application Model 開發人員指南*》中的 [AWS SAM CLI 命令參考](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)。

 在 `SAM-Tutorial` 目錄中執行下列命令。

```
sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket amzn-s3-demo-bucket
```

針對 `s3-bucket` 參數，指定您建立的 Amazon S3 儲存貯體，做為本教學課程的先決條件。`output-template-file` 指定 SAM AWS **sam deploy**命令使用的新檔案名稱。

# 部署 AWS SAM 應用程式
<a name="tutorial-lambda-sam-deploy"></a>

 使用 AWS SAM **sam deploy**命令搭配 `package.yml` 檔案，使用 建立 Lambda 函數和 CodeDeploy 應用程式和部署群組 CloudFormation。

**注意**  
如需 **sam deploy**命令的詳細資訊，請參閱《 *AWS Serverless Application Model 開發人員指南*》中的 [AWS SAM CLI 命令參考](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)。

 在 `SAM-Tutorial` 目錄中執行下列命令。

```
sam deploy \
  --template-file package.yml \
  --stack-name my-date-time-app \
  --capabilities CAPABILITY_IAM
```

 需要 `--capabilities CAPABILITY_IAM` 參數才能授權 CloudFormation 建立 IAM 角色。

# （選用） 檢查和測試您的基礎設施
<a name="tutorial-lambda-sam-confirm-components"></a>

 本主題說明如何檢視基礎設施元件並測試 Lambda 函數。

**在執行 `sam deploy` 後查看堆疊的結果**

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

1.  在導覽窗格中，選擇 **Stacks (堆疊)**。`my-date-time-app` 堆疊會顯示在頂端。

1.  選擇 **Events (事件)** 標籤，以查看已完成的事件。您可以在堆疊建立進行時檢視事件。堆疊建立完成時，您可以查看所有堆疊建立事件。

1.  選取堆疊後，選擇 **Resources (資源)**。在**類型**欄中，您可以看到 Lambda 函數、`CodeDeployHook_beforeAllowTraffic`、 `myDateTimeFunction`和 `CodeDeployHook_afterAllowTraffic`。每個 Lambda 函數的**實體 ID** 欄都包含一個連結，可在 Lambda 主控台中檢視函數。
**注意**  
 `myDateTimeFunction` Lambda 函數的名稱前面加上 CloudFormation 堆疊的名稱，並新增了識別符，因此看起來像 `my-date-time-app-myDateTimeFunction-123456ABCDEF`。

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

1.  在導覽窗格中，展開 **Deploy (部署)**，然後選擇 **Applications (應用程式)**。

1.  您應該會看到由 建立且名稱開頭 CloudFormation 為 的新 CodeDeploy 應用程式`my-date-time-app-ServerlessDeploymentApplication`。選擇此應用程式。

1.  您應該會看到名稱開頭為 `my-date-time-app-myDateTimeFunctionDeploymentGroup` 的部署群組。選擇此部署群組。

    在 **Deployment configuration (部署組態)** 下，您應該會看到 **CodeDeployDefault.LambdaLinear10PercentEvery1Minute**。

**（選用） 以測試您的函數 （主控台）**

1. 在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1.  從導覽窗格中，選擇您的 `my-date-time-app-myDateTimeFunction` 函數。在主控台中，其名稱包含識別符，因此看起來像 `my-date-time-app-myDateTimeFunction-123456ABCDEF`。

1.  選擇**測試**。

1.  在 **Event name (事件名稱)** 中，輸入測試事件的名稱。

1.  為您的測試事件輸入下列內容，然後選擇 **Create (建立)**。

   ```
   {
     "option": "date",
     "period": "today"
   }
   ```

1.  選擇**測試**。您在測試事件清單中應該只會看到您的測試事件。

    對於 **Execution result (執行結果)**，您應該會看到 **succeeded (成功)**。

1.  在 **Execution result (執行結果)** 下，展開 **Details (詳細資訊)** 以查看結果。您應該會看到目前的年、月、日。

**（選用） 以測試您的函數 (AWS CLI)**

1.  尋找 Lambda 函數的 ARN。當您檢視函數時，它會出現在 Lambda 主控台的頂端。

1.  執行下列命令。將 *your-function-arn* 換成函數 ARN。

   ```
   aws lambda invoke \
   --function your-function-arn \
   --cli-binary-format raw-in-base64-out \
   --payload "{\"option\": \"date\", \"period\": \"today\"}" out.txt
   ```

1.  開啟 `out.txt` 以確認結果包含目前的年、月、日。

# 步驟 2：更新 Lambda 函數
<a name="tutorial-lambda-sam-update-function"></a>

 在本主題中，您會更新 `myDateTimeFunction.js` 檔案。在下一個步驟中，您將使用此檔案部署更新的函數。這會觸發 CodeDeploy 透過將生產流量從 Lambda 函數的目前版本轉移到更新的版本來部署它。

**更新您的 Lambda 函數**

1.  打開 `myDateTimeFunction.js`。

1.  移除兩個註解標記 (「`/*`」和「`*/`」)，以及 `switch` 區塊中名為 `time` 的 `case` 開頭和結尾的說明文字。

    取消註解的程式碼可讓您將新的參數 `time` 傳遞至函數。如果您將 `time` 傳遞給更新的函數，它會傳回目前的 `hour`、`minute` 和 `second`。

1.  儲存 `myDateTimeFunction.js`。它看起來應該如下所示：

   ```
   'use strict';
   
   exports.handler = function(event, context, callback) {
   
     if (event.body) {
       event = JSON.parse(event.body);
     }
   
     var sc; // Status code
     var result = ""; // Response payload
   
     switch(event.option) {
       case "date":
         switch(event.period) {
           case "yesterday":
             result = setDateResult("yesterday");
             sc = 200;
             break;
           case "today":
             result = setDateResult();
             sc = 200;
             break;
           case "tomorrow":
             result = setDateResult("tomorrow");
             sc = 200;
             break;
           default:
             result = {
               "error": "Must specify 'yesterday', 'today', or 'tomorrow'."
             };
             sc = 400;
             break;
         }
         break;
         case "time":
           var d = new Date();
           var h = d.getHours();
           var mi = d.getMinutes();
           var s = d.getSeconds();
   
           result = {
             "hour": h,
             "minute": mi,
             "second": s
           };
           sc = 200;
           break;
   
         default:
           result = {
             "error": "Must specify 'date' or 'time'."
           };
           sc = 400;
         break;
     }
   
     const response = {
       statusCode: sc,
       headers: { "Content-type": "application/json" },
       body: JSON.stringify( result )
     };
   
     callback(null, response);
   
     function setDateResult(option) {
   
       var d = new Date(); // Today
       var mo; // Month
       var da; // Day
       var y; // Year
   
       switch(option) {
         case "yesterday":
           d.setDate(d.getDate() - 1);
           break;
         case "tomorrow":
           d.setDate(d.getDate() + 1);
         default:
          break;
       }
   
       mo = d.getMonth() + 1; // Months are zero offset (0-11)
       da = d.getDate();
       y = d.getFullYear();
   
       result = {
         "month": mo,
         "day": da,
         "year": y
       };
   
       return result;
     }
   };
   ```

# 步驟 3：部署更新的 Lambda 函數
<a name="tutorial-lambda-sam-deploy-update"></a>

 在此步驟中，您會使用更新的 `myDateTimeFunction.js`來更新和啟動 Lambda 函數的部署。您可以在 CodeDeploy 或 AWS Lambda 主控台中監控部署進度。

 AWS SAM 範本中的`AutoPublishAlias: live`行會導致您的基礎設施偵測使用`live`別名之函數的更新。函數的更新會觸發 CodeDeploy 的部署，將生產流量從函數的原始版本轉移到更新的版本。

 **sam package** 和 **sam deploy**命令用於更新和觸發 Lambda 函數的部署。您在[封裝 AWS SAM 應用程式](tutorial-lambda-sam-package.md)和[部署 AWS SAM 應用程式](tutorial-lambda-sam-deploy.md)中執行過這些命令。

**部署更新的 Lambda 函數**

1.  在 `SAM-Tutorial` 目錄中執行下列命令。

   ```
   sam package \
     --template-file template.yml \
     --output-template-file package.yml  \
     --s3-bucket amzn-s3-demo-bucket
   ```

    這會建立新的一組成品，參考 S3 儲存貯體中更新的 Lambda 函數。

1.  在 `SAM-Tutorial` 目錄中執行下列命令。

   ```
   sam deploy \
     --template-file package.yml \
     --stack-name my-date-time-app \
     --capabilities CAPABILITY_IAM
   ```

   由於堆疊名稱仍然是 `my-date-time-app`， 會 CloudFormation 辨識這是堆疊更新。若要檢視更新後的堆疊，請傳回 CloudFormation 主控台，然後從導覽窗格中選擇**堆疊**。

**（選用） 在部署期間檢視流量 (CodeDeploy 主控台）**

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

1.  在導覽窗格中，展開 **Applications (應用程式)**，然後選擇您的 **my-date-time-app-ServerlessDeploymentApplication** 應用程式。

1.  在 **Deployment groups (部署群組)** 中，選擇您應用程式的部署群組。其狀態應為 **In progress (進行中)**。

1.  在 **Deployment group history (部署群組歷史記錄)** 中，選擇進行中的部署。

   此頁面上的 **Traffic shifting (流量轉移)** 進度列及 **Original (原始)** 和 **Replacement (取代)** 方塊中的百分比會顯示其進度。  
![\[CodeDeploy 主控台的流量轉移進度區段。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lambda-tutorial-codedeploy-console-20-percent-deployed.png)

**（選用） 在部署期間檢視流量 (Lambda 主控台）**

1. 在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1.  從導覽窗格中，選擇您的 `my-date-time-app-myDateTimeFunction` 函數。在主控台中，其名稱包含識別符，因此看起來像 `my-date-time-app-myDateTimeFunction-123456ABCDEF`。

1.  選擇**別名**，然後選擇**即時**。

原始函數版本 (版本 1) 和已更新的函數版本 (版本 2) 旁的權重會顯示載入此 AWS Lambda 主控台頁面時，每個版本接到多少流量。頁面不會隨著時間更新權重。如果您每分鐘重新整理一次頁面，版本 1 的權重會減少 10%，而版本 2 的權重會增加 10%，直到版本 2 的權重達到 100 為止。

![\[CodeDeploy 主控台的別名區段。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lambda-tutorial-lambda-console-20-percent-deployed.png)


# 步驟 4：檢視您的部署結果
<a name="tutorial-lambda-sam-deploy-view-results"></a>

在此步驟中，您將檢視部署的結果。如果您的部署成功，您可以確認更新的 Lambda 函數接收生產流量。如果您的部署失敗，您可以使用 CloudWatch Logs 在部署生命週期雜湊期間執行的 Lambda 函數中檢視驗證測試的輸出。

**Topics**
+ [測試您部署的 函數](#tutorial-lambda-sam-deploy-test-deployed-function)
+ [在 CloudWatch Logs 中檢視掛鉤事件](#tutorial-lambda-view-hook-events)

## 測試您部署的 函數
<a name="tutorial-lambda-sam-deploy-test-deployed-function"></a>

 **sam deploy** 命令會更新 `my-date-time-app-myDateTimeFunction` Lambda 函數。函數版本已更新為 2 並新增至 `live` 別名。

**在 Lambda 主控台中查看更新**

1. 在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1.  從導覽窗格中，選擇 `my-date-time-app-myDateTimeFunction` 函數。在主控台中，其名稱包含識別符，因此看起來像 `my-date-time-app-myDateTimeFunction-123456ABCDEF`。

1.  選擇 **Qualifiers (限定詞)**，然後選擇 **Aliases (別名)**。部署完成後 (約 10 分鐘)，針對 `live` 別名，您應該會看到 **Version: 2 (版本：2)**。  
![\[CodeDeploy 主控台的別名區段。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lambda-tutorial-function-version.png)

1.  在 **Function code (函數原始程式碼)** 中，檢視函數的來源碼。您的變更應該會出現。

1.  (選用) 您可以使用[步驟 2：更新 Lambda 函數](tutorial-lambda-sam-update-function.md)中的測試說明來測試已更新的函數。使用下列承載建立新的測試事件，然後確認結果包含目前的時、分、秒。

   ```
   {
       "option": "time"
     }
   ```

    若要使用 AWS CLI 測試更新的函數，請執行下列命令，然後開啟 `out.txt` 以確認結果包含目前的小時、分鐘和秒。

   ```
   aws lambda invoke --function your-function-arn --payload "{\"option\": \"time\"}" out.txt 
   ```
**注意**  
 如果您在部署完成之前使用 AWS CLI 測試函數，您可能會收到非預期的結果。這是因為 CodeDeploy 每分鐘逐步將 10% 的流量轉移到更新版本。在部署期間，有些流量仍指向原始版本，因此 `aws lambda invoke` 可能會使用原始版本。10 分鐘後，部署完成，所有流量都指向新版本的函數。

## 在 CloudWatch Logs 中檢視掛鉤事件
<a name="tutorial-lambda-view-hook-events"></a>

 在`BeforeAllowTraffic`勾點期間，CodeDeploy 會執行您的 `CodeDeployHook_beforeAllowTraffic` Lambda 函數。在`AfterAllowTraffic`勾點期間，CodeDeploy 會執行您的 `CodeDeployHook_afterAllowTraffic` Lambda 函數。每個函數都會執行驗證測試，以使用新的 `time` 參數呼叫更新版本的函數。如果您的 Lambda 函數更新成功， `time`選項不會導致錯誤且驗證成功。如果函數未更新，無法辨識的參數會導致錯誤且驗證失敗。這些驗證測試僅供示範之用。您撰寫自己的測試來驗證部署。您可以使用 CloudWatch Logs 主控台來檢視您的驗證測試。

**檢視 CodeDeploy 勾點事件**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1.  從導覽窗格中，選擇 **Logs (日誌)**。

1.  從日誌群組清單中，選擇 **/aws/lambda/CodeDeployHook\$1beforeAllowTraffic** 或 **/aws/lambda/CodeDeployHook\$1afterAllowTraffic**。

1.  選擇日誌串流。您應該只會看到一個。

1.  展開事件以查看其詳細資訊。  
![\[CodeDeployHook 日誌群組的日誌串流。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lambda-tutorial-cloudwatch.png)

# 步驟 5：清除
<a name="tutorial-lambda-clean-up"></a>

為了避免您在本教學課程中使用的資源進一步收費，請刪除 AWS SAM 範本建立的資源，以及 Lambda 驗證函數建立的 CloudWatch 日誌。

**刪除您的 CloudFormation 堆疊**

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

1. 在 **Stacks (堆疊)** 欄中，選擇您的 `my-date-time-app` 堆疊，然後選擇 **Delete (刪除)**。

1. 出現提示時，選擇 **Delete stack (刪除堆疊)**。 AWS SAM 系統會刪除 Lambda 函數、CodeDeploy 應用程式和部署群組，以及 建立的 IAM 角色。

**在 CloudWatch Logs 中刪除您的日誌**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1.  從導覽窗格中，選擇 **Logs (日誌)**。

1.  從日誌群組清單中，選擇 **/aws/lambda/CodeDeployHook\$1beforeAllowTraffic** 旁的按鈕。

1.  從 **Actions (動作)** 中，選擇 **Delete log group (刪除日誌群組)**，然後選擇 **Yes, Delete (是，刪除)**。

1.  從日誌群組清單中，選擇 **/aws/lambda/CodeDeployHook\$1afterAllowTraffic** 旁的按鈕。

1.  從 **Actions (動作)** 中，選擇 **Delete log group (刪除日誌群組)**，然後選擇 **Yes, Delete (是，刪除)**。