

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

本部分包含的一些教程可帮助您了解如何使用 CodeDeploy。

这些教程中的过程提供了建议的文件存储位置（例如，c:\$1temp）和建议的存储桶、子文件夹或文件的名称（例如，分别为 amzn-s3-demo-bucket、HelloWorldApp 和 CodeDeployDemo-EC2-Trust.json），但您并不是必须使用它们。在执行这些过程时，请确保替换您的文件位置和名称。

**Topics**
+ [教程：部署 WordPress 到亚马逊 EC2 实例（亚马逊 Linux 或红帽企业 Linux 和 Linux、macOS 或 Unix）](tutorials-wordpress.md)
+ [教程：使用 CodeDeploy 部署“Hello, World\$1” 带有 CodeDeploy （Windows 服务器）的应用程序](tutorials-windows.md)
+ [教程：使用 CodeDeploy （Windows 服务器、Ubuntu 服务器或红帽企业 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)
+ [教程：使用无 AWS 服务器应用程序模型部署更新的 Lambda 函数 CodeDeploy](tutorial-lambda-sam.md)

# 教程：部署 WordPress 到亚马逊 EC2 实例（亚马逊 Linux 或红帽企业 Linux 和 Linux、macOS 或 Unix）
<a name="tutorials-wordpress"></a>

在本教程中，您将基于 PHP 和 MySQL 的开源博客工具和内容管理系统部署 WordPress到运行亚马逊 Linux 或红帽企业 Linux (RHEL) 的单个 Amazon EC2 实例。

不是您要找的内容？
+ 要改为部署到运行 Windows Server 的 Amazon EC2 实例，请参阅[教程：使用 CodeDeploy 部署“Hello, World\$1” 带有 CodeDeploy （Windows 服务器）的应用程序](tutorials-windows.md)。
+ 要部署到本地实例而不是 Amazon EC2 实例，请参阅[教程：使用 CodeDeploy （Windows 服务器、Ubuntu 服务器或红帽企业 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 应用程序上传到亚马逊 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>

要使用部署 WordPress 应用程序 CodeDeploy，您需要一个运行亚马逊 Linux 或红帽企业 Linux (RHEL) 的 Amazon EC2 实例。Amazon EC2 实例需要允许 HTTP 连接的新入站安全规则。成功部署 WordPress 页面后，需要使用此规则才能在浏览器中查看该页面。

按照[为创建一个 Amazon EC2 实例 CodeDeploy](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 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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*** 是创建实例时分配到您安全组的编号。

    选择**入站**选项卡。如果实例的安全组配置正确，则应看到一条具有以下值的规则：
   + **类型**：HTTP
   + **协议**：TCP
   + **端口范围**：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，可改用 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存储库，在`/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. 在 `install_dependencies.sh` 中创建一个 `/tmp/WordPress/scripts` 文件。将以下行添加到该文件中。此 `install_dependencies.sh` 脚本安装 Apache、MySQL 和 PHP。还会将 MySQL 支持添加到 PHP 中。

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

1. 在 `start_server.sh` 中创建一个 `/tmp/WordPress/scripts` 文件。将以下行添加到该文件中。此 `start_server.sh` 脚本启动 Apache 和 MySQL。

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

1. 在 `stop_server.sh` 中创建一个 `/tmp/WordPress/scripts` 文件。将以下行添加到该文件中。此 `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. 在 `create_test_db.sh` 中创建一个 `/tmp/WordPress/scripts` 文件。将以下行添加到该文件中。此`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 文件），即 [YAML](http://www.yaml.org) 格式的文件，用于： CodeDeploy 
+ 将应用程序修订中的源文件映射到其在目标 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`文件夹。在部署过程中，在部署生命周期`root`内的指定事件（例如**BeforeInstall**和）处 CodeDeploy 运行目标 Amazon EC2 实例上的`/var/www/html/WordPress/scripts`文件夹中的指定脚本**AfterInstall**。如果其中任何一个脚本的运行时间超过 300 秒（5 分钟），则 CodeDeploy 停止部署并将部署标记为失败。

有关这些设置的更多信息，请参阅 [CodeDeploy AppSpec 文件引用](reference-appspec-file.md)。

**重要**  
此文件中各项之间的空格的位置和数量很重要。如果间距不正确，则 CodeDeploy 会引发可能难以调试的错误。有关更多信息，请参阅 [AppSpec 文件间距](reference-appspec-file.md#reference-appspec-file-spacing)。

# 步骤 3：将您的 WordPress 应用程序上传到亚马逊 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、亚马逊 S3 控制台或 Amazon S APIs 3 创建亚马逊 S3 存储桶。创建存储桶后，请确保提供对存储桶和您的 AWS 账户的访问权限。

**注意**  
在 Amazon S3 中，所有 AWS 账户的存储桶名称必须是唯一的。如果您无法使用 **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** 命令以创建一个名为 **amzn-s3-demo-bucket** 的 Amazon S3 存储桶：

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

### 创建 Amazon S3 存储桶（控制台）
<a name="tutorials-wordpress-upload-application-create-s3-bucket-console"></a>

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/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) 允许 AWS 账户将文件上传`111122223333`到 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）允许任何附有包含 ARN `arn:aws:iam::444455556666:role/CodeDeployDemo` 的 IAM 实例配置文件的 Amazon EC2 实例，从名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶中的任何目录下载文件：

```
{
    "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 policy 的信息，请参阅[使用策略](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 文件捆绑到存档文件（称为应用程序*修订版*）中。

**注意**  
将对象存储在存储桶中以及将应用程序修订传入和传出存储桶可能需支付费用。有关更多信息，请参阅 [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. 调用 p CodeDeploy [ush 命令将](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 角色，该角色授予某个服务代表您执行操作的权限。在这种情况下，服务角色授予访问您的 Amazon EC2 实例以扩展（读取）其 Amazon EC2 实例标签的 CodeDeploy 权限。

   您应该已经按照[创建服务角色（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** 命令，使用名为 **CodeDeployDemo** 的 Amazon EC2 标签和名为 **CodeDeployDefault.OneAtATime** 的部署配置，创建一个与名为 **WordPress\$1App** 的应用程序相关联的名为 **WordPress\$1DepGroup** 的部署组：

   ```
   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 状态管理器中创建关联，该关联将安装 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. 现在调用 **create-deployment** 命令，使用名为 **amzn-s3-demo-bucket** 的存储桶中名为 **WordPressApp.zip** 的应用程序修订，创建一个与名为 **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 角色，该角色授予某个服务代表您执行操作的权限。在这种情况下，服务角色授予访问您的 Amazon EC2 实例以扩展（读取）其 Amazon EC2 实例标签的 CodeDeploy 权限。

   您应该已经按照[创建服务角色（控制台）](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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

1. 在应用程序列表中，选择 **WordPress\$1App**。

1. 在**部署组**选项卡中，选择**创建部署组**。

1. 在 **Deployment group name（部署组名称）**中，输入 **WordPress\$1DepGroup**。

1. 在 **Deployment type** 下，选择 **In-place deployment**。

1. 在**环境配置**中，选择 **Amazon EC2 实例**。

1. 在使用的 **Agent 配置**中 AWS Systems Manager，保留默认值。

1. 在**键**中，输入 **Name**。

1. 在**值**中，输入 **CodeDeployDemo**。
**注意**  
键入后**CodeDeployDemo**，“**匹配实例**” 下方应会出现 “**1**”，以确认 CodeDeploy 找到了匹配的 Amazon EC2 实例。

1. 在**部署配置**中，选择**CodeDeployDefault。 OneAtATime**。

1. 在**服务角色 ARN** 中，选择服务角色 ARN，然后选择**创建部署组**。

1. 选择 **Create deployment（创建部署）**。

1. 在**部署组**中，选择 **WordPress\$1DepGroup**。

1. 在**存储库类型**旁，选择**我的应用程序存储在 Amazon S3** 中。在**版本位置**中，输入您之前上传到 Amazon S3 的示例 WordPress 应用程序修订版的位置。获取位置：

   1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   1. 在存储桶列表中，选择 **amzn-s3-demo-bucket**（或您将应用程序修订上传到的存储桶的名称）。

   1. 在对象列表中，选择 **WordPressApp.zip。**

   1. 在**概述**选项卡中，将**链接**字段的值复制到您的剪贴板。

      其内容如下所示：

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

   1. 返回 CodeDeploy 控制台，然后在 “**修订位置**” 中粘贴 “**链接**” 字段值。

1. 如果**文件类型**列表中显示的消息告诉您无法检测文件类型，请选择 **.zip**。

1. （可选）在 **Deployment description** 框中键入注释。

1. **展开**部署组覆盖**，然后从**部署配置**中选择CodeDeployDefault。 OneAtATime**。

1. 选择**开始部署**。有关您新创建的部署的信息将显示在 **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. 在**部署**表中，选择部署名称。部署失败后，将显示描述失败原因的消息。

1. 在**实例活动**中，将显示有关部署的更多信息。部署失败之后，您可以确定在哪些 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_cn/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 实例的公有 DNS 地址加上 `/WordPress` 扩展。对于此示例 WordPress 网站（以及示例 Amazon EC2 实例公有 DNS 地址），网址为**http://ec2-01-234-567-890.compute-1.amazonaws.com/WordPress**。

1. 如果您尚未设置网站，则会显示 WordPress 默认的欢迎页面。选择**开始！**。

1. 要使用默认 MySQL 数据库，请在数据库配置页面上，键入以下值：
   + **数据库名称**：**test**
   + **用户名**：**root**
   + **Password**：留空。
   + **数据库主机**：**localhost**
   + **表前缀**：**wp\$1**

   选择 **Submit** 以设置数据库。

1. 继续站点设置。在 “**欢迎**” 页面上，填写所需的任何值，然后选择 “**安装**” 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** 的部署组以及名为 **amzn-s3-demo-bucket** 的存储桶中名为 **WordPressApp.zip** 的修订：

```
 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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

1. 在应用程序列表中，选择 **WordPress\$1App**。

1. 在**部署组**选项卡上，选择 **WordPress\$1DepGroup**。

1. 选择 **Create deployment（创建部署）**。

1. 在 **Create deployment** 页面上：

   1. 在**部署组**中，选择 **WordPress\$1DepGroup**。

   1. 在**存储库类型**区域中，选择**我的应用程序存储在 Amazon S3** 中，然后将修订的 Amazon S3 链接复制到**修订位置**框中。要查找链接值，请执行以下操作：

      1. 在单独的浏览器选项卡中：

         登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

          浏览到并打开 **amzn-s3-demo-bucket**，然后选择您的修订 **WordPressApp.zip**。

      1.  如果**属性**窗格在 Amazon S3 控制台中不可见，则选择**属性**按钮。

      1.  在 “**属性**” 窗格中，将 “**链接**” 字段的值复制到 CodeDeploy 控制台的 “**修订位置**” 框中。

   1. 如果显示消息说明无法检测文件类型，请选择 **.zip**。

   1. 将 **Deployment description** 框留空。

   1. **展开**部署组覆盖**，然后从**部署配置**中选择CodeDeployDefault。 OneAtATime**。

   1. 选择**开始部署**。有关您新创建的部署的信息将显示在 **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、、、Amazon S3、Amazon EC2 和 CodeDeploy 控制台，或者 AWS APIs 来执行清理。 CloudFormation

**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
   ```

   你可以*association-id*通过调用**describe-association**命令来获取。

   ```
   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://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 在 “**筛选器**” 框中，键入您之前创建的 CloudFormation 堆栈名称（例如，**CodeDeployDemoStack**）。

1. 选中堆栈名称旁边的框。在 **Actions** 菜单中，选择 **Delete Stack**。

   CloudFormation 删除堆栈，终止所有随附的 Amazon EC2 实例，并删除所有附带的 IAM 角色。

要终止您在 CloudFormation 堆栈之外创建的 Amazon EC2 实例，请执行以下操作：

1. 登录 AWS 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在 **INSTANCES** 列表中，选择 **Instances**。

1. 在搜索框中，键入要终止的 Amazon EC2 实例的名称（例如，**CodeDeployDemo**），然后按 Enter。

1. 选择 Amazon EC2 实例名称。

1. 在 **Actions** 菜单中，指向 **Instance State**，然后选择 **Terminate**。在系统提示时，选择 **Yes, Terminate**。

对每个实例重复这些步骤。

要删除 Amazon S3 存储桶，请执行以下步骤：

1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在存储桶列表中，浏览到并选择之前创建的 Amazon S3 存储桶的名称（例如，**amzn-s3-demo-bucket**）。

1. 您必须先删除存储桶的内容，然后才能删除存储桶。选择存储桶中的所有文件（如 **WordPressApp.zip**）。在 **Actions** 菜单中，选择 **Delete**。在提示确认删除时，选择 **OK**。

1. 在清空存储桶后，可以删除存储桶。在存储桶列表中，选择存储桶的行（而不是存储桶名称）。选择 **Delete bucket**，当系统提示进行确认时，选择 **OK**。

要从中删除`WordPress_App`应用程序，请执行 CodeDeploy以下操作：

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

1. 在应用程序列表中，选择 **WordPress\$1App**。

1. 在 **Application details** 页上，选择 **Delete application**。

1. 在系统提示时，输入应用程序的名称以确认要删除应用程序，然后选择**删除**。

要删除 Systems Manager 状态管理器关联，请执行以下操作：

1. 在 https://console.aws.amazon.com /systems- AWS Systems Manager manager 上打开控制台。

1. 在导航窗格中，选择**状态管理器**。

1. 选择您创建的关联，然后选择**删除**。

## 接下来做什么？
<a name="tutorials-wordpress-clean-up-whats-next"></a>

如果您已到达此处，那么恭喜您！您已成功完成 CodeDeploy 部署，然后已更新您站点的代码并且已重新部署站点。

# 教程：使用 CodeDeploy 部署“Hello, World\$1” 带有 CodeDeploy （Windows 服务器）的应用程序
<a name="tutorials-windows"></a>

在本教程中，您将一个网页部署到一个正在将 Internet Information Services（IIS）作为其 Web 服务器运行的 Windows Server Amazon EC2 实例。此网页将显示简单的“Hello，World\$1” 消息。

不是您要找的内容？
+ 要练习部署到 Amazon Linux 或 Red Hat Enterprise Linux（RHEL）Amazon EC2 实例，请参阅[教程：部署 WordPress 到亚马逊 EC2 实例（亚马逊 Linux 或红帽企业 Linux 和 Linux、macOS 或 Unix）](tutorials-wordpress.md)。
+ 要改而部署到本地实例，请参阅[教程：使用 CodeDeploy （Windows 服务器、Ubuntu 服务器或红帽企业 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\$1” 应用程序上传到 Amazon S3](tutorials-windows-upload-application.md)
+ [步骤 4：部署 Hello World 应用程序](tutorials-windows-deploy-application.md)
+ [步骤 5：更新和重新部署“Hello, World\$1” 应用程序](tutorials-windows-update-and-redeploy-application.md)
+ [步骤 6：清理“Hello，World\$1” 应用程序和相关资源](tutorials-windows-clean-up.md)

# 步骤 1：启动 Windows Server Amazon EC2 实例
<a name="tutorials-windows-launch-instance"></a>

要使用部署 Hello World 应用程序 CodeDeploy，你需要一个运行 Windows Server 的 Amazon EC2 实例。

按照[为创建一个 Amazon EC2 实例 CodeDeploy](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 Desktop Connection 客户端应用程序。有关信息，请参阅[使用 RDP 连接到您的 Windows 实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html)。对于其他操作系统或其他 RDP 连接客户端应用程序，您可能需要相应修改这些说明。

1. 登录 AWS 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中的 **Instances** 下，选择 **Instances**。

1. 浏览并在列表中选择您的 Windows Server 实例。

1. 选择**连接**。

1. 选择**获取密码**，然后选择**选择文件**。

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 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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*** 是创建实例时分配到您安全组的编号。

    选择**入站**选项卡。如果实例的安全组配置正确，则应看到一条具有以下值的规则：
   + **类型**：HTTP
   + **协议**：TCP
   + **端口范围**：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 实例，后者将 Internet Information Services（IIS）作为其 Web 服务器运行。此网页将简单地显示“Hello，World\$1” 消息。

**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. 在您的 `HelloWorldApp` 文件夹中创建一个名为 `c:\temp` 的子目录（子文件夹），然后切换到该文件夹。

   ```
   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 文件是一个 [YAML](http://www.yaml.org) 格式的文件，用于以下用途： CodeDeploy 
+ 将应用程序修订中的源文件映射到其在实例上的目的地。
+ 指定在部署期间要在实例上运行的脚本。

 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\$1” 应用程序上传到 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、亚马逊 S3 控制台或 Amazon S3 APIs 来创建 Amazon S3 存储桶。创建存储桶后，请确保提供对存储桶和您的 CodeDeploy 用户的访问权限。

**注意**  
在 Amazon S3 中，所有 AWS 账户的存储桶名称必须是唯一的。如果您无法使用 **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** 命令以创建一个名为 **amzn-s3-demo-bucket** 的 Amazon S3 存储桶：

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

### 创建 Amazon S3 存储桶（控制台）
<a name="tutorials-windows-upload-application-create-s3-bucket-console"></a>

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/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) 允许 AWS 账户将文件上传`111122223333`到 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）允许任何附有包含 ARN `arn:aws:iam::444455556666:role/CodeDeployDemo` 的 IAM 实例配置文件的 Amazon EC2 实例，从名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶中的任何目录下载文件：

```
{
    "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 policy（添加到用户的权限集）或 IAM 角色（允许用户代入）。以下 IAM policy 允许用户将修订上传到名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶中的任意位置：

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

****  

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

------

有关如何创建 IAM policy 的信息，请参阅《IAM 用户指南》**中的[创建 IAM policy](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>

将这些文件打包到一个存档文件（称为应用程序*修订*）。

**注意**  
将对象存储在存储桶中以及将应用程序修订传入和传出存储桶可能需支付费用。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

1. 在开发计算机上，切换到这些文件存储到的文件夹：

   ```
   cd c:\temp\HelloWorldApp
   ```
**注意**  
如果您未切换到此文件夹，则将在您的当前文件夹中启动文件打包。例如，如果您当前的文件夹是 `c:\temp` 而非 `c:\temp\HelloWorldApp`，则打包操作将从 `c:\temp` 文件夹中的文件和子文件夹开始，这可能包括 `HelloWorldApp` 子文件夹之外的内容。

1. 调用**create-application**命令注册一个名**HelloWorld\$1App**为的新应用程序 CodeDeploy：

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

1. 调用 p CodeDeploy [ush 命令将](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 角色，该角色授予某个服务代表您执行操作的权限。在这种情况下，服务角色授予访问您的 Amazon EC2 实例以扩展（读取）其 Amazon EC2 实例标签的 CodeDeploy 权限。

   您应该已经按照[创建服务角色（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** 命令，使用名为 **CodeDeployDemo** 的 Amazon EC2 实例标签和名为 **CodeDeployDefault.OneAtATime** 的部署配置创建一个与名为 **HelloWorld\$1App** 的应用程序相关联的名为 **HelloWorld\$1DepGroup** 的部署组（具有指定的服务角色 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 状态管理器中创建关联，该关联将安装 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. 现在调用 **create-deployment** 命令，使用名为 **amzn-s3-demo-bucket** 的存储桶中名为 **HelloWorld\$1App.zip** 的应用程序修订，创建一个与名为 **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 角色，该角色授予某个服务代表您执行操作的权限。在这种情况下，服务角色授予访问您的 Amazon EC2 实例以扩展（读取）其 Amazon EC2 实例标签的 CodeDeploy 权限。

   您应该已经按照[创建服务角色（控制台）](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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

1. 选择 **HelloWorld\$1App**。

1. 在**部署组**选项卡中，选择**创建部署组**。

1. 在 **Deployment group name（部署组名称）**中，输入 **HelloWorld\$1DepGroup**。

1. 在**服务角色**中，选择服务角色的名称。

1. 在**部署类型**中，选择**就地**。

1. 在**环境配置**中，选择 **Amazon EC2 实例**。

1. 在使用的 **Agent 配置**中 AWS Systems Manager，保留默认值。

1. 在**键**中，输入 **Name**。

1. 在**值**中，输入 **CodeDeployDemo**。

1. 在**部署配置**中，选择**CodeDeployDefault。 OneAtATime**。

1. 在**负载均衡器**中，清除**启用负载均衡**。

1. 选择 **Create deployment group（创建部署组）**。

1. 选择**创建部署**。

1. 在**部署组**中，选择 **HelloWorld\$1 DepGroup**

1. 在**修订类型**中，选择**我的应用程序将存储在 Amazon S3** 中，然后在**修订位置**中输入已上传到 Amazon S3 的示例 Hello World 应用程序修订的位置。获取位置：

   1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/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. 在**部署**表中，选择您的部署 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\$1 网页。

# 步骤 5：更新和重新部署“Hello, World\$1” 应用程序
<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>

现在调用 **create-deployment** 命令，再次使用名为 **HelloWorld\$1App** 的应用程序、名为 **CodeDeployDefault.OneAtATime** 的部署配置、名为 **HelloWorld\$1DepGroup** 的部署组以及名为 **amzn-s3-demo-bucket** 的存储桶中名为 **HelloWorld\$1App.zip** 的修订，基于上传的修订创建部署。

```
 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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格上，选择**应用程序**。

1. 在 “**应用程序**” 列表中，选择 **HelloWorld\$1App**。

1. 在**部署**选项卡中，选择**创建部署**。

   1. 在**部署组**列表中，选择 **HelloWorld\$1 DepGroup**。

   1.  在**修订位置**中，输入您的修订的 Amazon S3 链接。

      要查找链接值，请执行以下操作：

      1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

         浏览到并打开 **amzn-s3-demo-bucket**，然后在 Amazon S3 控制台中选择您的修订 **HelloWorld\$1App.zip**。

      1. 如果**属性**窗格在 Amazon S3 控制台中不可见，则选择**属性**按钮。

      1. 在**属性**窗格中，复制**链接**字段的值。

      1. 返回 CodeDeploy 控制台，然后将链接粘贴到 “**修订版” 位置**。

   1. 在**修订文件类型**中，如果出现指示无法检测文件类型的消息，则选择 **.zip**。

   1. 保留**部署描述**为空。

   1. **展开**部署组覆盖**在**部署配置**列表中，选择CodeDeployDefault。 OneAtATime**，然后选择**创建部署**。

      您可以检查部署的状态，如[监控您的部署并排除故障](tutorials-windows-deploy-application.md#tutorials-windows-deploy-application-monitor)中所述。

      重新部署网站 CodeDeploy 后，请在 Web 浏览器中重新访问该站点，以验证网页上的背景颜色和文本是否已更改。（您可能需要刷新浏览器。） 如果背景颜色和文本已更改，那么恭喜！您已经修改并重新部署了站点！

# 步骤 6：清理“Hello，World\$1” 应用程序和相关资源
<a name="tutorials-windows-clean-up"></a>

您现在已成功更新“Hello, World\$1” 代码并已重新部署站点。要避免为完成此教程而创建的资源持续产生费用，您应删除：
+ 任何 CloudFormation 堆栈（或终止任何 Amazon EC2 实例，如果您是在外部创建的 CloudFormation）。
+ 任何 Amazon S3 存储桶。
+  CodeDeploy 中的 `HelloWorld_App` 应用程序。
+  CodeDeploy 代理的 AWS Systems Manager 州经理协会。

你可以使用 AWS CLI、、、Amazon S3、Amazon EC2 和 CodeDeploy 控制台，或者 AWS APIs 来执行清理。 CloudFormation

**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. 要从中删除`HelloWorld_App`应用程序 CodeDeploy，请调用**delete-application**命令。这将删除应用程序的所有关联部署组记录和部署记录。

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

1. 要删除 Systems Manager 状态管理器关联，请调用 **delete-association** 命令。

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

   你可以*association-id*通过调用**describe-association**命令来获取。

   ```
   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://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 在搜索框中，键入 CloudFormation 堆栈名称（例如，**CodeDeployDemoStack**）。

1. 选中堆栈名称旁边的框。

1. 在 **Actions** 菜单中，选择 **Delete Stack**。这将删除堆栈，终止所有附带的 Amazon EC2 实例，并删除所有附带的 IAM 角色。

要终止您在 CloudFormation 堆栈之外创建的 Amazon EC2 实例，请执行以下操作：

1. 登录 AWS 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在 **Instances** 区域中，选择 **Instances**。

1. 在搜索框中，键入要终止的 Amazon EC2 实例的名称，然后按 **Enter**。

1. 选择您的 Amazon EC2 实例。

1. 选择 **Actions**，指向 **Instance State**，然后选择 **Terminate**。在系统提示时，选择 **Yes, Terminate**。对任何其他 Amazon EC2 实例重复这些步骤。

要删除 Amazon S3 存储桶，请执行以下步骤：

1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在存储桶列表中，浏览到并选择 Amazon S3 存储桶的名称（例如，**amzn-s3-demo-bucket**）。

1. 您必须先删除存储桶的内容，然后才能删除存储桶。选择存储桶中的所有文件（如 **HelloWorld\$1App.zip**）。在 **Actions** 菜单中，选择 **Delete**。在提示确认删除时，选择 **OK**。

1. 在清空存储桶后，可以删除存储桶。在存储桶列表中，选择存储桶的行（而不是存储桶名称）。选择 **Delete bucket**，当系统提示进行确认时，选择 **OK**。

要从中删除`HelloWorld_App`应用程序，请执行 CodeDeploy以下操作：

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

   

1. 选择 **`HelloWorld_App`**。

1. 选择**删除应用程序**。

1. 当系统提示时，输入 **Delete**，然后选择**删除**。

要删除 Systems Manager 状态管理器关联，请执行以下操作：

1. 在 https://console.aws.amazon.com /systems- AWS Systems Manager manager 上打开控制台。

1. 在导航窗格中，选择**状态管理器**。

1. 选择您创建的关联，然后选择**删除**。

## 接下来做什么？
<a name="tutorials-windows-clean-up-whats-next"></a>

如果您已到达这里，则表示您已成功完成部署 CodeDeploy。恭喜您！

# 教程：使用 CodeDeploy （Windows 服务器、Ubuntu 服务器或红帽企业 Linux）将应用程序部署到本地实例
<a name="tutorials-on-premises-instance"></a>

本教程 CodeDeploy 通过指导您将示例应用程序修订部署到运行 Windows Server、Ubuntu 服务器或红帽企业 Linux (RHEL) 的单个本地实例（即不是 Amazon EC2 实例的物理设备），帮助您积累经验。有关本地实例及其使用方式的信息 CodeDeploy，请参阅[使用本地实例 CodeDeploy](instances-on-premises.md)。

不是您要找的内容？
+ 要练习部署到运行 Amazon Linux 或 RHEL 的 Amazon EC2 实例，请参阅[教程：部署 WordPress 到亚马逊 EC2 实例（亚马逊 Linux 或红帽企业 Linux 和 Linux、macOS 或 Unix）](tutorials-wordpress.md)。
+ 要练习部署到运行 Windows Server 的 Amazon EC2 实例，请参阅[教程：使用 CodeDeploy 部署“Hello, World\$1” 带有 CodeDeploy （Windows 服务器）的应用程序](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 部署生命周期事件（包括 In **stall**、**AfterInstall**ApplicationStart****、和）中的每个事件写入一个文件**ValidateService**。在**BeforeInstall**部署生命周期事件期间，将运行一个脚本来删除此示例的先前部署期间写入的旧文件，并在您的本地实例上创建一个写入新文件的位置。

**注意**  
如果出现以下任何情况，此示例应用程序修订可能无法部署：  
在本地实例上启动 CodeDeploy 代理的用户没有执行脚本的权限。
用户无权在脚本中列出的位置创建或删除文件夹。
用户无权在脚本中列出的位置创建文本文件。

**注意**  
如果您配置了 Windows Server 实例并希望部署其他示例，则可能需要使用[教程：使用 CodeDeploy 部署“Hello, World\$1” 带有 CodeDeploy （Windows 服务器）的应用程序](tutorials-windows.md)教程的[步骤 2：将您的源内容配置为部署到 Windows Server Amazon EC2 实例](tutorials-windows-configure-content.md)中的示例。  
如果您配置了 RHEL 实例并希望部署其他示例，则可能需要使用[教程：部署 WordPress 到亚马逊 EC2 实例（亚马逊 Linux 或红帽企业 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` 的文件：

   对于 Windows Server 为 `appspec.yml`：

   ```
   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
   ```

   对于 Ubuntu Server 和 RHEL 为 `appspec.yml`：

   ```
   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` 子文件夹的根中，使用文本编辑器创建 4 个文件（对于 Windows Server，它们分别名为 `before-install.bat`、`after-install.bat`、`application-start.bat` 和 `validate-service.bat`；对于 Ubuntu Server 和 RHEL，它们分别名为 `before-install.sh`、`after-install.sh`、`application-start.sh` 和 `validate-service.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）中找到 4 个文本文件。

如果部署失败，请按照[使用 CodeDeploy 查看实例详细信息](instances-view-details.md)和 [排查实例问题](troubleshooting-ec2-instances.md)中的排除故障步骤操作。进行任何必要的修复，重新打包并上传应用程序修订，然后再次尝试部署。

# 步骤 6：清理资源
<a name="tutorials-on-premises-instance-6-clean-up-resources"></a>

为避免对您为此教程创建的资源继续收费，请删除您不再使用的 Amazon S3 存储桶。您还可以清理关联的资源，例如本地实例中的应用程序 CodeDeploy 和部署组记录。

您可以使用 AWS CLI 或 Amazon S3 控制台 CodeDeploy 和 Amazon S3 控制台的组合 AWS CLI 来清理资源。

## 清理资源（CLI）
<a name="tutorials-on-premises-instance-6-clean-up-resources-cli"></a>

**删除 Amazon S3 存储桶**
+ 使用 `--recursive` 开关对存储桶调用 [rm](https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html) 命令（例如 `amzn-s3-demo-bucket`）。该存储桶及存储桶中的所有对象将被删除。

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

**要删除中的应用程序和部署组记录 CodeDeploy**
+ 对应用程序（例如，`CodeDeploy-OnPrem-App`）调用 [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 命令。将删除部署和部署组的记录。

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

**注销本地实例并删除 IAM 用户**
+ 对本地实例和区域调用 [deregister](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 代理并从本地实例中删除配置文件**
+ 从本地实例调用 [uninstall](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 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 选择要删除的存储桶旁边的图标（例如，`amzn-s3-demo-bucket`），但不要选择存储桶本身。

1. 选择**操作**，然后选择**删除**。

1. 在提示删除存储桶时，选择 **OK**。

**要删除中的应用程序和部署组记录 CodeDeploy**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，选择**应用程序**。

1. 选择要删除的应用程序的名称（例如，`CodeDeploy-OnPrem-App`），然后选择**删除应用程序**。

1. 在系统提示时，输入应用程序的名称以确认要删除应用程序，然后选择**删除**。

您不能使用 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 可以通过确保始终有正确数量的 Amazon EC2 实例来处理部署负载来帮助 CodeDeploy 扩展。有关 Amazon EC2 Auto Scaling 与集成的信息 CodeDeploy，请参阅[CodeDeploy 与亚马逊 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)，包括设置和配置以及创建 IAM 实例配置文件 (**CodeDeployDemo-EC2-Instance-Profile**) 和服务角色 (**CodeDeployDemo**)。 AWS CLI *服务角色* 是一种特殊类型的 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/create-launch-template.html)和[启动模板支持](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-launch-template-permissions.html)。
+  创建并使用与 Ubuntu 服务器实例兼容的修订版，然后。 CodeDeploy对于您的修订，可以执行以下操作之一：
  + 创建并使用[教程：使用 CodeDeploy （Windows 服务器、Ubuntu 服务器或红帽企业 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 实例密钥对的名称才能访问由占位符*key-name*表示的 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 系统映像**页上的**快速启动**选项卡上，记下 **Amazon Linux 2 AMI**、**Red Hat Enterprise Linux 7.1**、**Ubuntu Server 14.04 LTS** 或 **Microsoft Windows Server 2012 R2** 旁边的 AMI 的 ID。
**注意**  
如果您拥有与 CodeDeploy 兼容的 AMI 自定义版本，则在此选择它，而不用浏览**快速启动**选项卡。有关将自定义 AMI 与 CodeDeploy Amazon EC2 Auto Scaling 配合使用的信息，请参阅[将自定义 AMI 与 CodeDeploy Amazon EC2 Auto Scaling 配合使用](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 组。您需要在区域中列出的其中一个区域中的一个可用区的名称，[以及中以占位符*availability-zone*表示的*AWS 一般参考*终端节点](https://docs.aws.amazon.com/general/latest/gr/rande.html#codedeploy_region)。
**注意**  
要查看区域中的可用区列表，请调用：  

   ```
   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-Launch-Template** 的 Amazon EC2 启动模板创建名为 **CodeDeployDemo-AS-Group** 的 Auto Scaling 组。此 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 部署。通过调用 AWS Systems Manager 带有创建 Auto Scaling 组时添加的标签的**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 状态管理器中创建关联，该关联将在 CodeDeploy Auto Scaling 组中的所有实例上安装代理，然后在每周日凌晨 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. 在**亚马逊机器映像（AMI）**对话框中，单击 **AMI** 下的下拉列表，选择适用于本教程的 AMI：

   1. 在 **AMI** 下拉列表的**快速启动**选项卡上，选择以下选项之一：**Amazon Linux 2 AMI**、**Red Hat Enterprise Linux 7.1**、**Ubuntu Server 14.04 LTS** 或 **Microsoft Windows Server 2012 R2**。
**注意**  
如果您拥有与 CodeDeploy 兼容的 AMI 自定义版本，则在此选择它，而不用浏览**快速启动**选项卡。有关将自定义 AMI 与 CodeDeploy Amazon EC2 Auto Scaling 配合使用的信息，请参阅[将自定义 AMI 与 CodeDeploy Amazon EC2 Auto Scaling 配合使用](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，则必须创建 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. 在**键**中，输入 **Name**。

   1. 在**值**中，输入 **CodeDeployDemo**。

   选择**下一步**。

1. 在**审核**页面上，检查 Auto Scaling 组的详细信息，然后选择**创建 Auto Scaling 组**。

1. 在导航栏中，在 **Auto Scaling 组**处于选中状态的情况下，选择 **CodeDeployDemo-AS-Group**，然后选择**实例管理**选项卡。在 “**生命周期**” 列中**InService**显示的值且 “健康” 的值出现在 “**健康****状态**” 列中之前，请勿继续操作。

1. 按照安装 CodeDeploy 代理中的步骤[安装 CodeDeploy 代理，](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html)并使用`Name=CodeDeployDemo`实例标签。

# 步骤 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** 命令，使用名为 **CodeDeployDemo-AS-Group** 的 Auto Scaling 组和名为 **CodeDeployDefault.OneAtATime** 的部署配置创建一个与名为 **SimpleDemoApp** 的应用程序相关联的名为 **SimpleDemoDG** 的部署组（具有指定的服务角色 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*是包含您所在地区的 CodeDeploy 资源包文件的 Amazon S3 存储桶的名称。例如，对于美国东部（俄亥俄州）区域，请*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*是包含您所在地区的 CodeDeploy 资源包文件的 Amazon S3 存储桶的名称。例如，对于美国东部（俄亥俄州）区域，请*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*是包含您所在地区的 CodeDeploy 资源包文件的 Amazon S3 存储桶的名称。例如，对于美国东部（俄亥俄州）区域，请*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*是包含您所在地区的 CodeDeploy 资源包文件的 Amazon S3 存储桶的名称。例如，对于美国东部（俄亥俄州）区域，请*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** 命令以确保部署已成功。

   在调用此命令之前，您需要应该已经通过调用 **create-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" --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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

1. 选择**创建应用程序**。

1. 选择**自定义应用程序**。

1. 在 **Application name（应用程序名称）**中，输入 **SimpleDemoApp**。

1. 在**计算平台**中，选择 **EC2/本地**。

1. 选择**创建应用程序**。

1. 在**部署组**选项卡中，选择**创建部署组**。

1. 在 **Deployment group name（部署组名称）**中，输入 **SimpleDemoDG**。

1. 在**服务角色**中，选择您的服务角色的名称。

1. 在**部署类型**中，选择**就地**。

1. 在**环境配置**中，选择 **Auto Scaling 组**，然后选择 **CodeDeployDemo-AS-Group**。

1. 在**部署配置**中，选择**CodeDeployDefault。 OneAtATime**。

1. 清除**启用负载均衡**。

1. 选择 **Create deployment group（创建部署组）**。

1. 在“部署组”页面中，选择**创建部署**。

1. 对于**修订类型**，选择**我的应用程序存储在 Amazon S3 中**。

1. 在**修订位置**中，输入您的操作系统的示例应用程序的位置和区域。

   **对于 Amazon Linux 和 RHEL Amazon EC2 实例**  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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_cn/codedeploy/latest/userguide/tutorials-auto-scaling-group-create-deployment.html)

    **对于 Ubuntu Server Amazon EC2 实例**

   键入存储在 Amazon S3 中的自定义应用程序修订的位置。

1. 保留**部署描述**为空。

1. 展开**高级**。

1. 选择 **Create deployment（创建部署）**。
**注意**  
如果显示**失败**而不是**成功**，则您可能需要尝试[监控您的部署并排除故障](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)中的一些方法（使用应用程序名称 **SimpleDemoApp** 和部署组名称 **SimpleDemoDG**）。

# 步骤 3：检查结果
<a name="tutorials-auto-scaling-group-verify"></a>

在此步骤中，您将检查是否在 Auto Scaling 组中的单个 Amazon EC2 实例上 CodeDeploy 安装了该**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。

使用通过调 AWS CLI 用**describe-instances**命令获取 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。

使用网络浏览器，使用如下所示的 URL 显示部署到该 Amazon EC2 实例的 SimpleDemoApp 修订：

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

如果您看到恭喜页面，则表示您已成功使用 CodeDeploy 在 Auto Scaling 组中的单个 Amazon EC2 实例上部署了修订！

接下来，您将一个 Amazon EC2 实例添加到 Amazon EC2 组中。在 Amazon EC2 Auto Scaling 添加亚马逊 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** 值。它看上去应与下类似：**ec2-01-234-567-890.compute-1.amazonaws.com**。

使用网络浏览器，使用如下所示的 URL 显示部署到该 Amazon EC2 实例的 SimpleDemoApp 修订：

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

如果您看到恭喜页面，则表示您已成功使用 CodeDeploy 在 Auto Scaling 组中的单个 Amazon EC2 实例上部署了修订！

接下来，将一个 Amazon EC2 实例添加到 Amazon EC2 组中。在 Amazon EC2 Auto Scaling 添加亚马逊 EC2 实例后， CodeDeploy 会将您的修订版部署到新的亚马逊 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 组中的 Amazon EC2 实例数（CLI）](#tutorials-auto-scaling-group-scale-up-cli)
+ [扩展部署组中的 Amazon EC2 实例数（控制台）](#tutorials-auto-scaling-group-scale-up-console)

## 扩展 Auto Scaling 组中的 Amazon EC2 实例数（CLI）
<a name="tutorials-auto-scaling-group-scale-up-cli"></a>

1. 调用 **update-auto-scaling-group** 命令以将名为 **CodeDeployDemo-AS-Group** 的 Auto Scaling 组中的 Amazon EC2 实例数量从 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. 选择 **Instances** 选项卡。新的 Amazon EC2 实例应该会出现在列表中。（如果该实例未出现，您可能需要选择几次 **Refresh** 按钮。） 在 “**生命周期**” 列中**InService**显示的值且 “健康” 的值出现在 “**健康****状态**” 列中之前，请勿继续操作。

# 步骤 5：再次检查结果
<a name="tutorials-auto-scaling-group-reverify"></a>

在此步骤中，您将检查是否在 Auto Scaling 组中的新实例上 CodeDeploy 安装了 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
   ```

   应该有两个部署 IDs。在对 **get-deployment** 命令的调用中使用您尚未使用的 ID：

   ```
   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. 使用如下所示的 URL，在 Web 浏览器中显示部署到该 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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**部署**。

   

1. 选择 Amazon EC2 Auto Scaling 创建的部署的部署 ID。

   .

1.  **部署**页显示有关部署的信息。通常，您会自己创建部署，但 Amazon EC2 Auto Scaling 会代表您创建一个部署以将您的修订部署到新的 Amazon EC2 实例。

1. 页面顶部显示**成功**之后，在实例上验证结果。您首先需要获取实例的公有 DNS：

1. 在 Amazon EC2 导航窗格的 **Auto Scaling** 下，选择 **Auto Scaling 组**，然后选择 **CodeDeployDemo-AS-Group** 条目。

1. 在**实例**选项卡上，选择新的 Amazon EC2 实例的 ID。

1. 在 **Instances** 页中的 **Description** 选项卡上，记下 **Public 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. 通过针对 **CodeDeployDemo-AS-Group** 调用 **delete-auto-scaling-group** 命令来删除 Auto Scaling 组。这同时将终止 Amazon EC2 实例。

   ```
   aws autoscaling delete-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --force-delete
   ```

1. （可选）通过对名为 **CodeDeployDemo-AS-Launch-Template** 的启动配置调用 **delete-launch-template** 命令，删除 Auto Scaling 启动模板：

   ```
   aws ec2 delete-launch-template --launch-template-name CodeDeployDemo-AS-Launch-Template
   ```

1. 或者， CodeDeploy 通过对名为的应用程序调用**delete-application**命令来删除该应用程序**SimpleDemoApp**。这同时将删除所有关联的部署、部署组和修订记录。

   ```
   aws deploy delete-application --application-name SimpleDemoApp
   ```

1. 要删除 Systems Manager 状态管理器关联，请调用 **delete-association** 命令。

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

   你可以*association-id*通过调用**describe-association**命令来获取。

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

## 清除资源（控制台）
<a name="tutorials-auto-scaling-group-clean-up-console"></a>

要删除 Auto Scaling 组，同时终止 Amazon EC2 实例，请执行以下操作：

1. 

   登录 AWS 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

   在导航窗格中，展开**部署**，然后选择**应用程序**。

   

1. 在应用程序列表中，选择 **SimpleDemoApp**。

1. 在 **Application details** 页上，选择 **Delete application**。

1. 当系统提示时，输入 **Delete**，然后选择**删除**。

要删除 Systems Manager 状态管理器关联，请执行以下操作：

1. 在 https://console.aws.amazon.com /systems- AWS Systems Manager manager 上打开控制台。

1. 在导航窗格中，选择**状态管理器**。

1. 选择您创建的关联，然后选择**删除**。

# 教程： CodeDeploy 用于从中部署应用程序 GitHub
<a name="tutorials-github"></a>

在本教程中，您将使用 CodeDeploy 将示例应用程序修订部署到运行 Amazon Linux 的单个 Amazon EC2 实例、单个红帽企业 Linux (RHEL) 实例或单个 Windows 服务器实例。 GitHub 有关与 GitHub 集成的信息 CodeDeploy，请参阅[CodeDeploy 与集成 GitHub](integrations-partners-github.md)。

**注意**  
您还可以使用 CodeDeploy 将应用程序修订部署到 Ubuntu 服务器实例。 GitHub 您可以使用[步骤 2：创建示例应用程序修订](tutorials-on-premises-instance-2-create-sample-revision.md)中所述的示例修订版[教程：使用 CodeDeploy （Windows 服务器、Ubuntu 服务器或红帽企业 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. 选择 “**注册**” 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** 页上，执行下列操作：
   + 在**存储库名称**框中，输入 **CodeDeployGitHubDemo**。
   + 选择 **Public**。
**注意**  
选择默认的 **Public（公有）**选项意味着任何人均可查看此存储库。您可以选择 **Private（私有）**选项，限制可对存储库执行查看和提交的人员。
   + 清除 **Initialize this repository with a README（使用自述文件初始化此存储库）**复选框。您将改为在下一步中手动创建 `README.md` 文件。
   + 选择**创建存储库**。

1. 按照适用于您的本地计算机类型的说明操作以使用命令行创建存储库。
**注意**  
如果您启用了双重身份验证 GitHub，请确保在提示输入密码时输入个人访问令牌而不是 GitHub 登录密码。有关信息，请参阅[提供您的双重身份验证代码](https://help.github.com/articles/providing-your-2fa-authentication-code/)。

**在本地 Linux、macOS 或 Unix 计算机上：**

1. 在终端上，逐一运行以下命令，您的 GitHub 用户名在*user-name*哪里：

   ```
   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` 文件。关闭记事本。逐一运行以下命令，您的 GitHub 用户名在*user-name*哪里：

   ```
   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 服务器实例，则需要将与 Ubuntu Server 实例兼容的修订版上传到 GitHub存储库中，以及。 CodeDeploy有关更多信息，请参阅[为 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_Windows.zip` 替换 `SampleApp_Linux.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 copy command)*内容之一在哪里：
+ 美国东部（俄亥俄州）区域为 `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_Linux.zip` 替换 `SampleApp_Windows.zip`。

```
(Amazon S3 copy command)
```

将 ZIP 文件的内容直接解压缩到本地目录（`the`例如 `c:\temp\CodeDeployGitHubDemo`），而不要解压缩到一个新的子目录中。

```
git add .
```

```
git commit -m "Added sample app"
```

```
git push
```

以下*(Amazon S3 copy command)*内容之一在哪里：
+ 美国东部（俄亥俄州）区域为 `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>

在此步骤中，您将创建或配置示例应用程序将部署到的实例。您可以部署到 Amazon EC2 实例或运行所支持的操作系统的本地实例 CodeDeploy。有关信息，请参阅[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 控制台或创建应用程序和部署组，用于从存储 GitHub 库部署示例修订。 AWS CLI 



## 创建应用程序和部署组（控制台）
<a name="tutorials-github-create-application-console"></a>

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

   

1. 选择**创建应用程序**，然后选择**自定义应用程序**。

1. 在 **Application name（应用程序名称）**中，输入 **CodeDeployGitHubDemo-App**。

1. 在 **Compute Platform（计算平台）**中，选择 **EC2/On-premises（EC2/本地）**。

1. 选择**创建应用程序**。

1. 在**部署组**选项卡中，选择**创建部署组**。

1. 在 **Deployment group name（部署组名称）**中，输入 **CodeDeployGitHubDemo-DepGrp**。

1. 在**服务角色**中，选择您在为其创建 CodeDeploy 服务角色中[创建的服务角色的](getting-started-create-service-role.md)名称 CodeDeploy。

1. 在**部署类型**中，选择**就地**。

1. 在**环境配置**中，根据您使用的实例的类型，选择 **Amazon EC2 实例**或**本地实例**。对于**键**和**值**，根据[步骤 4：预置实例](tutorials-github-provision-instance.md)的介绍输入应用于您的实例的实例标签键和值。

1. 在**部署配置**中，选择**CodeDeployDefault。 AllatOnce**。

1. 在**负载均衡器**中，清除**启用负载均衡**。

1. 展开**高级**。

1. 在**警报**中，选择**忽略警报配置**。

1. 选择**创建部署组**，然后继续下一步。

## 创建应用程序和部署组（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*是应用于您的亚马逊 EC2 实例的 Amazon EC2 实例标签密钥[步骤 4：预置实例](tutorials-github-provision-instance.md)。
   + 如果您要部署到 Amazon EC2 实例，*ec2-tag-value*则应用于您的亚马逊 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*是您在为其创建服务角色中[创建的服务角色的服务角色](getting-started-create-service-role.md) ARN。 CodeDeploy（按照[获取服务角色 ARN（CLI）](getting-started-create-service-role.md#getting-started-get-service-role-cli)中的说明执行操作可查找服务角色 ARN。）

   ```
   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. 在**部署组详细信息**页上，选择**创建部署**。

1. 在**部署组**中，选择 **`CodeDeployGitHubDemo-DepGrp`**。

1. 在 “**修订类型**” 中，选择**GitHub**。

1. 在 **Connect t** o 中 GitHub，执行以下任一操作：
   + 要创建 CodeDeploy 应用程序与 GitHub 帐户的连接，请在单独的 Web 浏览器选项卡 GitHub 中注销。在**GitHub 帐户**中，输入用于标识此连接的名称，然后选择 **Connect to GitHub**。该网页会提示您授权 CodeDeploy 与名 GitHub 为的应用程序进行交互`CodeDeployGitHubDemo-App`。继续执行步骤 5。
   + 要使用已创建的连接，请在**GitHub帐户**中选择其名称，然后选择 **Connect to GitHub**。继续执行步骤 7。
   + 要创建与其他 GitHub 帐户的连接，请在单独的 Web 浏览器选项卡 GitHub 中注销。选择 “**连接到其他 GitHub帐户**”，然后选择 “**连接到**” GitHub。继续执行步骤 5。

1. 按照 “**登录**” 页面上的说明使用您的 GitHub 帐户登录。

1. 在 **Authorize application** 页上，选择 **Authorize application**。

1. 在 “ CodeDeploy **创建部署**” 页面的 “**存储库名称**” 中，输入您用于登录的 GitHub 用户名，然后输入正斜杠 (`/`)，然后输入您推送应用程序修订的存储库的名称（例如，***my-github-user-name*/CodeDeployGitHubDemo**）。

   如果您不确定要输入的值，或者需要指定其他存储库，请执行以下步骤：

   1. 在单独的 Web 浏览器选项卡中，转到您的[GitHub 控制面板](https://github.com/dashboard)。

   1. 在 **Your repositories（您的资料库）**中，将鼠标指针悬停在目标存储库名称的上方。将出现一个工具提示，显示 GitHub 用户或组织名称，后跟正斜杠 (`/`)，后跟存储库的名称。将此值输入到**存储库名称**。
**注意**  
如果目标存储库名称未显示在**您的存储库**中，请使用**搜索 GitHub**框查找目标存储库以及 GitHub 用户或组织名称。

1. 在 “**提交 ID**” 框中，输入与将应用程序修订推送到相关的提交 ID GitHub。

   如果您不确定要输入的值，请执行以下步骤：

   1. 在单独的 Web 浏览器选项卡中，转到您的[GitHub 控制面板](https://github.com/dashboard)。

   1. 在**您的存储库**中，选择 **CodeDeployGitHubDemo**。

   1. 在提交列表中，找到与您的应用程序修订推送相关的提交 ID 并将其复制到 GitHub。此 ID 的长度通常为 40 个字符并包含字母和数字。（请不要使用提交 ID 的较短版本，它通常是较长版本的前 10 个字符。）

   1. 将提交 ID 粘贴到 **Commit ID** 框中。

1. 选择 **Deploy**，然后继续执行下一步。

## 部署修订（CLI）
<a name="tutorials-github-deploy-application-cli"></a>

在调用任何与之交互的 AWS CLI 命令 GitHub （例如接下来要调用的**create-deployment**命令）之前，必须 CodeDeploy 授予使用您的 GitHub 用户帐户与之交互 GitHub 的`CodeDeployGitHubDemo-App`权限。当前，您必须使用 CodeDeploy 控制台执行此操作。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

   

1. 选择 **CodeDeployGitHubDemo-App**。

1. 在**部署**选项卡上，选择**创建部署**。
**注意**  
您不会创建新的部署。目前，这是授予代表您的 GitHub 用户帐户进行交互 GitHub 的 CodeDeploy 权限的唯一途径。

1. 从**部署组**中选择 **CodeDeployGitHubDemo-DepGrp**。

1. 在 “**修订类型**” 中，选择**GitHub**。

1. 在 **Connect t** o 中 GitHub，执行以下任一操作：
   + 要创建 CodeDeploy 应用程序与 GitHub 帐户的连接，请在单独的 Web 浏览器选项卡 GitHub 中注销。在**GitHub 账户**中，键入一个名称来标识此连接，然后选择 **Connect to GitHub**。网页会提示您授权 CodeDeploy 与名 GitHub 为的应用程序进行交互`CodeDeployGitHubDemo-App`。继续执行步骤 8。
   + 要使用已创建的连接，请在**GitHub帐户**中选择其名称，然后选择 **Connect to GitHub**。继续执行步骤 10。
   + 要创建与其他 GitHub 帐户的连接，请在单独的 Web 浏览器选项卡 GitHub 中注销。选择 “**连接到其他 GitHub帐户**”，然后选择 “**连接到**” GitHub。继续执行步骤 8。

1. 按照 “**登录**” 页面上的说明使用您的 GitHub 用户名或电子邮件和密码登录。

1. 在 **Authorize application** 页上，选择 **Authorize application**。

1. 在 CodeDeploy **创建部署**页面上，选择**取消**。

1. 调用**create-deployment**命令将版本 GitHub 库中的版本部署到实例，其中：
   + *repository*是您的 GitHub 账户名，后跟正斜杠 (`/`)，后跟仓库名称 (`CodeDeployGitHubDemo`)，例如，。`MyGitHubUserName/CodeDeployGitHubDemo`

     如果您不确定要使用的值，或者需要指定其他存储库，请执行以下步骤：

     1. 在单独的 Web 浏览器选项卡中，转到您的[GitHub 控制面板](https://github.com/dashboard)。

     1. 在 **Your repositories（您的资料库）**中，将鼠标指针悬停在目标存储库名称的上方。将出现一个工具提示，显示 GitHub 用户或组织名称，后跟正斜杠 (`/`)，后跟存储库的名称。这是要使用的值。
**注意**  
如果目标存储库名称未出现在**您的存储库**中，请使用**搜索 GitHub**框查找目标存储库以及相应的 GitHub 用户或组织名称。
   + *commit-id*是与您推送到存储库的应用程序修订版本相关联的提交（例如，`f835159a...528eb76f`）。

     如果您不确定要使用的值，请执行以下步骤：

     1. 在单独的 Web 浏览器选项卡中，转到您的[GitHub 控制面板](https://github.com/dashboard)。

     1. 在**您的存储库**中，选择 **CodeDeployGitHubDemo**。

     1. 在提交列表中，找到与将您的应用程序修订推送到相关的提交 ID GitHub。此 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** 的行。如果**状态**列中未显示**成功**或**失败**，请定期选择**刷新**按钮。

1. 如果**状态**列中出现**失败**，请按照[查看实例详细信息（控制台）](instances-view-details.md#instances-view-details-console)中的说明对部署进行故障排除。

1. 如果**状态**列中出现**成功**，则您现在可以通过 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` 的应用程序和名为 `CodeDeployGitHubDemo-DepGrp` 的部署组的部署 ID：

   ```
   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 实例，可通过转至面向 Amazon EC2 实例的 `http://public-dns`（例如，`http://ec2-01-234-567-890.compute-1.amazonaws.com`）在 Web 浏览器中查看此页。

1. 如果您能看到此网页，那么恭喜您！您已成功使用 GitHub 存储库 AWS CodeDeploy 进行部署。

# 步骤 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://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 在 **Stacks（堆栈）**列中，选择以 `CodeDeploySampleStack` 开头的堆栈。

1. 选择 **Delete（删除）**。

1. 当系统提示时，选择 **Delete stack（删除堆栈）**。这将删除 Amazon EC2 实例以及关联的 IAM 实例配置文件和服务角色。

## 手动取消注册并清除本地实例（如果您已预置本地实例）
<a name="tutorials-github-clean-up-on-premises-instance"></a>

1. 使用对以下所示的本地实例*your-instance-name*和关联区域调用 [dele](https://docs.aws.amazon.com/cli/latest/reference/deploy/deregister.html) gister 命令： AWS CLI *your-region*

   ```
   aws deploy deregister --instance-name your-instance-name --no-delete-iam-user --region your-region
   ```

1. 从本地实例调用 [uninstall](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 管理控制台 并打开 Amazon EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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://console.aws.amazon.com/codede](https://console.aws.amazon.com/codedeploy) ploy 上打开 CodeDeploy 控制台。
**注意**  
使用您在[入门 CodeDeploy](getting-started-codedeploy.md)中设置的同一用户登录。

1. 在导航窗格中，展开**部署**，然后选择**应用程序**。

   

1. 选择 **CodeDeployGitHubDemo-App**。

1. 选择**删除应用程序**。

1. 当系统提示时，输入 **Delete**，然后选择**删除**。

## 删除您的 GitHub 存储库
<a name="tutorials-github-clean-up-github-repository"></a>

请参阅[GitHub 帮助](https://help.github.com)[中的删除存储库](https://help.github.com/articles/deleting-a-repository/)。

# 教程：将应用程序部署到 Amazon ECS
<a name="tutorial-ecs-deployment"></a>

 在本教程中，您将学习如何使用将应用程序部署到 Amazon ECS 中 CodeDeploy。您从已经创建并部署到 Amazon ECS 中的应用程序开始。第一步是采用新的标签修改应用程序的任务定义文件，以更新应用程序。接下来，您将使用 CodeDeploy 来部署更新。在部署期间，将更新 CodeDeploy 安装到新的替换任务集中。然后，将原始任务集中 Amazon ECS 应用程序原始版本的生产流量，转移到替换任务集中更新的版本。

 在 Amazon ECS 部署期间， CodeDeploy 使用配置有两个目标组和一个生产流量侦听器的负载均衡器。下图显示了部署开始之前，负载均衡器、生产侦听器、目标组以及 Amazon ECS 应用程序之间的关联方式。本教程使用应用程序负载均衡器。您也可以使用网络负载均衡器。

![\[应用程序负载均衡器或网络负载均衡器、一个生产侦听器、两个目标组、一个任务集和一个 Amazon ECS 服务。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-1.png)


 成功部署之后，生产流量侦听器将流量提供给新的替换任务集，原始任务集终止。下图显示了成功部署后资源之间的关联方式。有关更多信息，请参阅 [在 Amazon ECS 部署过程中发生的事件](deployment-steps-ecs.md#deployment-steps-what-happens)。

![\[应用程序负载均衡器或网络负载均衡器、一个生产侦听器、两个目标组和一个替换任务集。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-5.png)


有关如何使用将应用程序部署 AWS CLI 到 Amazon ECS 的信息，请参阅[教程：使用 blue/green 部署创建服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html)。有关 CodePipeline 如何使用检测和自动部署对 Amazon ECS 服务的更改的信息 CodeDeploy，请参阅[教程：使用 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。
+  创建配置有两个目标组和一个侦听器的应用程序负载均衡器。有关使用控制台创建负载均衡器的信息，请参阅 [为 A CodeDeploy mazon ECS 部署设置负载均衡器、目标组和侦听器](deployment-groups-create-load-balancer-for-ecs.md)。有关使用创建负载均衡器的信息 AWS CLI，请参阅《*亚马逊弹性容器服务用户指南》*中的[步骤 1：创建应用程序负载均衡](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html#create-blue-green-loadbalancer)器。在创建负载均衡器时，记录以下内容以用于本教程：
  +  负载均衡器的名称。
  +  目标组的名称。
  +  负载均衡器侦听器所用的端口。
+  创建 Amazon ECS 集群和服务 有关更多信息，请参阅《*亚马逊弹性容器服务用户指南》*中的[教程：使用 blue/green 部署创建服务](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 的文件指定了您的任务定义、容器名称和容器端口。有关更多信息，请参阅[AppSpec Amazon ECS 部署的文件示例](reference-appspec-file-example.md#appspec-file-example-ecs)和[AppSpec Amazon ECS 部署的 “资源” 部分](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 文件中设置替换任务集的可选属性来覆盖这些值。有关更多信息，请参阅[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)和[AppSpec Amazon ECS 部署的文件示例](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 服务名称。
+  应用程序负载均衡器名称。
+  生产侦听器端口。
+  目标组名称。
+  您创建的 S3 存储桶的名称。

**创建 CodeDeploy 应用程序**

1. 登录 AWS 管理控制台 并打开 CodeDeploy 控制台，网址为[https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/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_cn/codedeploy/latest/userguide/images/ecs-demo-create-acd-dg.png)

1. 选择 **Create deployment group（创建部署组）**。

**部署您的 Amazon ECS 应用程序**

1. 从部署组控制台页面中，选择 **Create deployment（创建部署）**。

1.  对于**部署组**，选择**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（部署状态）**中监控部署。在生产流量已全部路由至替换任务集并等待五分钟之后，您可以选择**终止原始任务集**，以立即终止原始任务集。如果未选择 **Terminate original task set（终止原始任务集）**，则原始任务集将在您指定的五分钟等待时间到期后终止。  
![\[CodeDeploy 控制台的部署状态部分。\]](http://docs.aws.amazon.com/zh_cn/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 应用程序之间的关联方式。本教程使用应用程序负载均衡器。您也可以使用网络负载均衡器。

![\[应用程序负载均衡器或网络负载均衡器、侦听器、目标组、任务集和 Amazon ECS 服务之间的连接。\]](http://docs.aws.amazon.com/zh_cn/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)。

![\[部署后应用程序负载均衡器或网络负载均衡器、侦听器、目标组和替换任务集之间的连接。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-6.png)


**注意**  
完成本教程可能会导致您的 AWS 账户被扣款。这些费用包括 CodeDeploy AWS Lambda、和可能收取的费用 CloudWatch。[有关更多信息，请参阅[AWS CodeDeploy 定价、AWS Lambda 定价](https://aws.amazon.com/codedeploy/pricing/)和 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。](https://aws.amazon.com/lambda/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：创建生命周期挂钩 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：在日志中查看您的 Lambda 挂钩函数输出 CloudWatch](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 应用程序和部署组。
  +  您创建的、供 CodeDeploy 部署使用的 AppSpec 文件。您可以在本教程中编辑此文件。

# 步骤 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：创建生命周期挂钩 Lambda 函数
<a name="tutorial-ecs-with-hooks-create-hooks"></a>

在本部分中，您将为 Amazon ECS 部署的 `AfterAllowTestTraffic` 挂钩实施一个 Lambda 函数。在安装更新的 Amazon ECS 应用程序之前，Lambda 函数将运行验证测试。对于本教程，Lambda 函数返回 `Succeeded`。在实际部署过程中，验证测试可能返回 `Succeeded` 或 `Failed`，具体取决于验证测试的结果。此外，您可能会对其他 Amazon ECS 部署生命周期事件挂钩（`BeforeInstall`、`AfterInstall`、`BeforeAllowTraffic` 和 `AfterAllowTraffic`）中的一个或多个实施 Lambda 测试函数。有关更多信息，请参阅 [用于 Amazon ECS 部署的生命周期事件挂钩的列表](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)。

 必须具有 IAM 角色才能创建 Lambda 函数。该角色向 Lambda 函数授予写入 CloudWatch 日志和设置 CodeDeploy 生命周期挂钩状态的权限。

**创建 IAM 角色**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 从导航窗格中选择**角色**，然后选择**创建角色**。

1.  创建具有以下属性的角色：
   +  **Trusted entity（可信任的实体）**：**AWS Lambda**。
   +  **权限**：**AWSLambdaBasicExecutionRole**。这会授予您的 Lambda 函数写入日志的权限。 CloudWatch 
   +  **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 用户指南*和 [PutLifecycleEventHookExecutionStatusCodeDeploy ](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)*API 参考*中的[添加 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)。

**创建 `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 文件文件中。采用您在[步骤 3：创建生命周期挂钩 Lambda 函数](tutorial-ecs-with-hooks-create-hooks.md)中记下的 Lambda 函数的 ARN，在 `AfterAllowTestTraffic` 之后更新 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": "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 管理控制台 并打开 CodeDeploy 控制台，网址为[https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/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.  对于**部署组**，选择**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（部署状态）**中监控部署。在生产流量已全部路由至替换任务集之后，您可以选择**终止原始任务集**，以立即终止原始任务集。如果未选择 **Terminate original task set（终止原始任务集）**，则原始任务集将在您创建部署组时指定的持续时间之后终止。

![\[CodeDeploy 控制台的部署状态部分。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-with-test-listener.png)


# 步骤 6：在日志中查看您的 Lambda 挂钩函数输出 CloudWatch
<a name="tutorial-ecs-with-hooks-view-cw-logs"></a>

 如果您的 CodeDeploy 部署成功，那么您的 Lambda 挂钩函数中的验证测试也会成功。您可以通过在 Log CloudWatch s 中查看挂钩函数的日志来确认这一点。

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1.  从导航窗格中，选择 **Logs（日志）**。您应该看到一个与您在文件中指定的 Lambda 挂钩函数对应的新日志组。 AppSpec   
![\[CloudWatch 控制台中的新日志组。\]](http://docs.aws.amazon.com/zh_cn/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_cn/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
   ```

# 教程：使用无 AWS 服务器应用程序模型部署更新的 Lambda 函数 CodeDeploy
<a name="tutorial-lambda-sam"></a>

AWS SAM 是一个用于构建无服务器应用程序的开源框架。它将 AWS SAM 模板中的 YAML 语法转换并扩展为用于构建无服务器应用程序（例如 Lambda 函数）的 CloudFormation 语法。有关更多信息，请参阅[什么是 AWS Serverless Application Model？](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) 中的步骤。
+  安装 C AWS Serverless Application Model LI。有关信息，请参阅[安装 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)。
+  创建 S3 存储桶。 AWS SAM 会将 SA [AWS M 模板](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 函数时运行的验证测试。完成后，您可以使用 CloudFormation 在 Lambda 控制台中查看您的组件，或者使用 AWS CLI 来测试您的 Lambda 函数。

**Topics**
+ [创建文件](tutorial-lambda-create-files.md)
+ [Package 打包 AWS SAM 应用程序](tutorial-lambda-sam-package.md)
+ [部署 S AWS AM 应用程序](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)。

**一个名为 `myDateTimeFunction` 的 Lambda 函数**  
 发布此 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 参考*》中的[AppSpec AWS Lambda 部署的 “挂钩” 部分](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`。  
 您无法在 SA AWS M 模板中指定自定义部署配置。有关更多信息，请参阅 [使用创建部署配置 CodeDeploy](deployment-configurations-create.md)。

**部署生命周期挂钩函数**  
 `Hooks` 部分指定在生命周期事件挂钩期间运行的函数。`PreTraffic` 指定在 `BeforeAllowTraffic` 挂钩期间运行的函数。`PostTraffic` 指定在 `AfterAllowTraffic` 挂钩期间运行的函数。

**Lambda 调用另一个 Lambda 函数的权限**  
 指定的`lambda:InvokeFunction`权限授予 AWS SAM 应用程序使用的角色调用 Lambda 函数的权限。当 `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.  创建文本文件，并以 `myDateTimeFunction.js` 文件形式保存到 `SAM-Tutorial` 目录中。

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.  创建文本文件，并以 `beforeAllowTraffic.js` 文件形式保存到 `SAM-Tutorial` 目录中。

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.  创建文本文件，并以 `afterAllowTraffic.js` 文件形式保存到 `SAM-Tutorial` 目录中。

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");
       				}
       			});
       		}  
       	});
       }
   ```

# Package 打包 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` 的新文件。 AWS SAM **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`定 AWS SAM **sam deploy** 命令使用的新文件的名称。

# 部署 S AWS AM 应用程序
<a name="tutorial-lambda-sam-deploy"></a>

 使用带有`package.yml`文件的 AWS SAM **sam deploy** 命令来创建您的 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://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1.  在导航窗格中，选择 **Stacks（堆栈）**。`my-date-time-app` 堆栈显示在顶部。

1.  选择 **Events（事件）**选项卡，以查看哪些事件已完成。您可以在堆栈创建过程中查看事件。堆栈创建完成后，您可以查看所有的堆栈创建事件。

1.  在已选择堆栈的情况下，选择 **Resources（资源）**。在**类型**列中，您可以看到 Lambda 函数、`myDateTimeFunction`、`CodeDeployHook_beforeAllowTraffic` 和 `CodeDeployHook_afterAllowTraffic`。您的每个 Lambda 函数的**物理 ID** 列都包含一个用于在 Lambda 控制台中查看这些函数的链接。
**注意**  
 `myDateTimeFunction`Lambda 函数的名称前面有 CloudFormation 堆栈的名称，并添加了一个标识符，所以看起来像。`my-date-time-app-myDateTimeFunction-123456ABCDEF`

1. 打开 CodeDeploy 控制台，网址为[https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/)。

1.  在导航窗格中，展开 **Deploy（部署）**，然后选择 **Applications（应用程序）**。

1.  您应该会看到一个由 CloudFormation 创建的新 CodeDeploy 应用程序，其名称以开头`my-date-time-app-ServerlessDeploymentApplication`。选择此应用程序。

1.  您应当看到一个名称以 `my-date-time-app-myDateTimeFunctionDeploymentGroup` 开头的部署组。选择此部署组。

    在 “**部署配置”** 下，您应该看到**CodeDeployDefault。 LambdaLinear10 PercentEvery 1分钟**。

**（可选）测试函数（控制台）**

1. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/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 函数的部署。您已在 [Package 打包 AWS SAM 应用程序](tutorial-lambda-sam-package.md) 和 [部署 S AWS AM 应用程序](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 控制台，然后从导航窗格中选择 **Stacks**。

**（可选）用于在部署期间查看流量（CodeDeploy 控制台）**

1. 打开 CodeDeploy 控制台，网址为[https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/)。

1.  在导航窗格中，展开 “**应用程序**”，然后选择您的 **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_cn/codedeploy/latest/userguide/images/lambda-tutorial-codedeploy-console-20-percent-deployed.png)

**（可选）在部署期间查看流量（Lambda 控制台）**

1. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1.  从导航窗格中，选择 `my-date-time-app-myDateTimeFunction` 函数。在控制台中，其名称包含一个标识符，因此看起来类似 `my-date-time-app-myDateTimeFunction-123456ABCDEF`。

1.  依次选择**别名**和 **live**。

原始函数版本（版本 1）和更新的函数版本（版本 2）旁边的权重，显示了在加载此 AWS Lambda 控制台页面时提供给每个版本的流量。该页面不会随时间更新权重。如果每隔一分钟刷新一次页面，则版本 1 的权重降低 10%，版本 2 的权重增加 10%，直到版本 2 的权重达到 100%。

![\[CodeDeploy 控制台的别名部分。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/lambda-tutorial-lambda-console-20-percent-deployed.png)


# 步骤 4：查看部署结果
<a name="tutorial-lambda-sam-deploy-view-results"></a>

在本步骤中，您将查看部署的结果。如果部署成功，即可确认更新的 Lambda 函数收到了生产流量。如果部署失败，您可以使用 CloudWatch 日志在 Lambda 函数中查看在部署生命周期挂钩期间运行的验证测试的输出。

**Topics**
+ [测试部署的函数](#tutorial-lambda-sam-deploy-test-deployed-function)
+ [在 CloudWatch 日志中查看挂钩事件](#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. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/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_cn/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 来测试您的函数，则可能会收到意想不到的结果。这是因为每分钟将10％的流量 CodeDeploy 逐渐转移到更新的版本。在部署过程中，部分流量仍然指向原始版本，因此 `aws lambda invoke` 可能使用原始版本。10 分钟后，部署完成，所有流量均指向函数的新版本。

## 在 CloudWatch 日志中查看挂钩事件
<a name="tutorial-lambda-view-hook-events"></a>

 在`BeforeAllowTraffic`挂钩期间， CodeDeploy 执行您的 Lambd `CodeDeployHook_beforeAllowTraffic` a 函数。在`AfterAllowTraffic`挂钩期间， CodeDeploy 执行您的 Lambd `CodeDeployHook_afterAllowTraffic` a 函数。每个函数运行验证测试，使用新的 `time` 参数调用更新的函数版本。如果 Lambda 函数更新成功，则 `time` 选项不会导致错误，并且验证成功。如果函数未更新，则无法识别的参数会导致错误，并且验证失败。这些验证测试仅供演示之用。您自行编写测试来验证部署。您可以使用 CloudWatch 日志控制台查看您的验证测试。

**查看您的 CodeDeploy 挂钩事件**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1.  从导航窗格中，选择 **Logs（日志）**。

1.  从日志组列表中选择**/aws/lambda/CodeDeployHook\$1 beforeAllowTraffic** 或**/aws/lambda/CodeDeployHook\$1 afterAllowTraffic**。

1.  选择日志流。您应当只看到一个。

1.  展开事件以查看其详细信息。  
![\[日志组的 CodeDeployHook 日志流。\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/images/lambda-tutorial-cloudwatch.png)

# 第 5 步：清理
<a name="tutorial-lambda-clean-up"></a>

为避免对您在本教程中使用的资源收取更多费用，请删除您的 AWS SAM 模板创建的资源和您的 Lambda 验证函数创建的 CloudWatch 日志。

**删除您的 CloudFormation 堆栈**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 在 **Stacks（堆栈）**列中，选择 `my-date-time-app` 堆栈，然后选择 **Delete（删除）**。

1. 当系统提示时，选择 **Delete stack（删除堆栈）**。由创建的 Lambda 函数、 CodeDeploy应用程序和部署组以及 IAM 角色 AWS SAM 已删除。

**在 “日志” 中删除您的 CloudWatch 日志**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1.  从导航窗格中，选择 **Logs（日志）**。

1.  从日志组列表中，选择**/aws/lambda/CodeDeployHook\$1** 旁边的按钮beforeAllowTraffic。

1.  从 **Actions（操作）**中，选择 **Delete log group（删除日志组）**，然后选择 **Yes, Delete（是，删除）**。

1.  从日志组列表中，选择**/aws/lambda/CodeDeployHook\$1** 旁边的按钮afterAllowTraffic。

1.  从 **Actions（操作）**中，选择 **Delete log group（删除日志组）**，然后选择 **Yes, Delete（是，删除）**。