

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

# 监控中的部署 CodeDeploy
<a name="monitoring"></a>

监控是维护 AWS 解决方案的可靠性、可用性和性能的重要组成部分。 CodeDeploy 您应该从 AWS 解决方案的所有部分收集监控数据，以便在出现多点故障时可以更轻松地进行调试。但是 CodeDeploy，在开始监控之前，您应该制定一份包含以下问题答案的监控计划：
+ 监控目的是什么？
+ 您将监控哪些资源？
+ 监控这些资源的频率如何？
+ 您将使用哪些监控工具？
+ 谁负责执行监控任务？
+ 出现错误时应通知谁？

下一步是通过测量不同时间和不同负载条件下的性能，为环境中的正常 CodeDeploy 性能建立基准。监控时 CodeDeploy，存储历史监控数据，以便您可以将其与当前性能数据进行比较，识别正常的性能模式和性能异常，并设计解决问题的方法。

例如，如果您正在使用 CodeDeploy，则可以监控部署和目标实例的状态。当部署或实例失败时，您可能需要重新配置应用程序规范文件、重新安装或更新 CodeDeploy 代理、更新应用程序或部署组中的设置，或者更改实例设置或文件。 AppSpec 

要建立基准，您至少应监控以下各项：
+ 部署事件和状态
+ 实例事件和状态

## 自动监控工具
<a name="monitoring_automated_tools"></a>

AWS 提供了各种可用于监控的工具 CodeDeploy。您可以配置其中的一些工具来为您执行监控任务，但有些工具需要手动干预。建议您尽可能实现监控任务自动化。

您可以使用以下自动监控工具来监视 CodeDeploy 和报告何时出现问题：
+ **A CloudWatch mazon** Alarms — 在您指定的时间段内观察单个指标，并根据该指标在多个时间段内相对于给定阈值的值执行一项或多项操作。该操作是发送到亚马逊简单通知服务 (Amazon SNS) Simple Notification Scaling 主题或亚马逊 EC2 Auto Scaling 策略的通知。 CloudWatch 警报不会仅仅因为它们处于特定状态就调用操作；该状态必须已更改并保持了指定的时间段。有关更多信息，请参阅 [使用 Amazon CloudWatch 工具监控部署](monitoring-cloudwatch.md)。

  有关更新您的服务角色以配合使用 CloudWatch 警报监控的信息，请参阅[向 CodeDeploy 服务角色授予 CloudWatch 权限](monitoring-create-alarms-grant-permissions.md)。有关在 CodeDeploy 操作中添加 CloudWatch 警报监控的信息，请参阅[使用创建应用程序 CodeDeploy](applications-create.md)[使用创建部署组 CodeDeploy](deployment-groups-create.md)、或[使用更改部署组设置 CodeDeploy](deployment-groups-edit.md)。

  
+ **Amazon CloudWatch Logs** — 监控、存储和访问来自 AWS CloudTrail 或其他来源的日志文件。有关更多信息，请参阅 *Amazon CloudWatch 用户指南*中的[监控日志文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)。

  有关使用 CloudWatch 控制台查看 CodeDeploy日志的信息，请参阅在日志[控制台中查看 CodeDeploy CloudWatch 日志](https://aws.amazon.com/blogs/devops/view-aws-codedeploy-logs-in-amazon-cloudwatch-console/)。
+ **Amazon CloudWatch ** Events — 匹配事件并将其路由到一个或多个目标函数或流，以进行更改、捕获状态信息并采取纠正措施。有关更多信息，请参阅《[亚马逊* CloudWatch 用户指南》中的什么是亚马逊 CloudWatch *活动](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchEvents.html)。

  有关在 CodeDeploy 操作中使用 CloudWatch 事件的信息，请参阅[使用 Amazon CloudWatch 事件监控部署](monitoring-cloudwatch-events.md)。
+ **AWS CloudTrail 日志监控**-在账户之间共享日志文件，通过将 CloudTrail 日志文件发送到 “日志” 来实时监控CloudWatch 日志文件，用 Java 编写日志处理应用程序，并验证您的日志文件在传送后是否未更改 CloudTrail。有关更多信息，[请参阅*AWS CloudTrail 用户指南*中的使用CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-working-with-log-files.html)。

  有关 CloudTrail 与一起使用的信息 CodeDeploy，请参阅[使用监控部署 AWS CloudTrail](monitoring-cloudtrail.md)。
+ **Amazon Simple Notification Service** - 配置事件驱动的触发器，以接收有关部署和实例事件（如成功或失败）的短信或电子邮件通知。有关更多信息，请参阅[创建主题](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)和[什么是 Amazon Simple Notification Service](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)。

  有关为其设置 Amazon SNS 通知的信息 CodeDeploy，请参阅。[使用 Amazon SNS 事件通知监控部署](monitoring-sns-event-notifications.md)

## 手动监控工具
<a name="monitoring_manual_tools"></a>

监控 CodeDeploy 的另一个重要部分是手动监控 CloudWatch 警报未涵盖的项目。 CodeDeploy CloudWatch、和其他 AWS 控制台仪表板提供了 AWS 环境状态的 at-a-glance视图。我们建议您同时检查 CodeDeploy 部署的日志文件。
+ CodeDeploy 控制台显示：
  + 部署的状态。
  + 每个上次尝试和上次成功部署的版本的日期和事件
  + 部署中成功、失败、跳过或进行中的实例的数量
  + 本地实例的状态
  + 注册或注销本地实例的日期和时间
+ CloudWatch 主页显示：
  + 当前告警和状态
  + 告警和资源图表
  + 服务运行状况

  此外，您还可以使用 CloudWatch 执行以下操作：
  + 创建[自定义控制面板](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CloudWatch_Dashboards.html)以监控您关心的服务
  + 绘制指标数据图，以排除问题并弄清楚趋势
  + 搜索和浏览您的所有 AWS 资源指标
  + 创建和编辑告警以接收问题通知

**主题**
+ [Monitoring Deployments with Amazon CloudWatch Tools](monitoring-cloudwatch.md)
+ [Monitoring Deployments](monitoring-cloudtrail.md)
+ [Monitoring Deployments with Amazon SNS Event Notifications](monitoring-sns-event-notifications.md)

# 使用 Amazon CloudWatch 工具监控部署
<a name="monitoring-cloudwatch"></a>

您可以使用以下 CloudWatch 工具监控 CodeDeploy 部署：Amazon CloudWatch 事件、 CloudWatch 警报和亚马逊 CloudWatch 日志。

查看 CodeDeploy 代理和部署创建的日志可以帮助您排除部署失败的原因。除了一次查看一个实例上的 CodeDeploy 日志之外，您还可以使用 CloudWatch 日志在一个中心位置监控所有日志。

有关使用 CloudWatch 警报和 CloudWatch 事件监控 CodeDeploy 部署的信息，请参阅以下主题。

**Topics**
+ [使用 CloudWatch 警报监控部署 CodeDeploy](monitoring-create-alarms.md)
+ [使用 Amazon CloudWatch 事件监控部署](monitoring-cloudwatch-events.md)

# 使用 CloudWatch 警报监控部署 CodeDeploy
<a name="monitoring-create-alarms"></a>

您可以为 CodeDeploy操作中使用的实例或 Amazon EC2 Auto Scaling 组创建 CloudWatch 警报。警报在您指定的时间段内监视单个指标，并根据该指标在多个时间段内相对于给定阈值的值执行一项或多项操作。 CloudWatch 警报的状态发生变化时会调用操作（例如，从变`OK`为`ALARM`）。

使用原生 CloudWatch 警报功能，您可以指定部署中使用的实例失败 CloudWatch 时支持的任何操作，例如发送 Amazon SNS 通知或停止、终止、重启或恢复实例。对于您的 CodeDeploy操作，您可以将部署组配置为在激活与部署组关联的任何 CloudWatch 警报时停止部署。

您最多可以将十个 CloudWatch 警报与一个 CodeDeploy 部署组相关联。如果任何指定警报激活，则部署将停止，状态将更新为 Stopped。要使用此选项，必须向您的 CodeDeploy 服务角色授予 CloudWatch 权限。

有关在 CloudWatch 控制台中设置 CloudWatch 警报的信息，请参阅[亚马逊* CloudWatch 用户指南中的创建亚马逊 CloudWatch *警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AlarmThatSendsEmail.html)。

有关在中将 CloudWatch 警报与部署组关联的信息 CodeDeploy，请参阅[使用创建部署组 CodeDeploy](deployment-groups-create.md)和。[使用更改部署组设置 CodeDeploy](deployment-groups-edit.md)

**Topics**
+ [向 CodeDeploy 服务角色授予 CloudWatch 权限](monitoring-create-alarms-grant-permissions.md)

# 向 CodeDeploy 服务角色授予 CloudWatch 权限
<a name="monitoring-create-alarms-grant-permissions"></a>

在部署中使用 CloudWatch 警报监控之前，必须向您在 CodeDeploy 操作中使用的服务角色授予访问 CloudWatch 资源的权限。

**向服务角色授予 CloudWatch 权限**

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

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 选择您在 AWS CodeDeploy 操作中使用的服务角色的名称。

1. 在 **Permissions** 选项卡上的 **Inline Policies** 区域中，选择 **Create Role Policy**。

   –或者–

   如果 **Create Role Policy** 按钮不可用，展开 **Inline Policies** 区域，然后选择 **click here**。

1. 在 **Set Permissions** 页面上，选择 **Custom Policy**，然后选择 **Select**。

1. 在 **Review Policy** 页面上的 **Policy Name** 字段中，键入一个名称以标识此策略，例如 `CWAlarms`。

1. 将以下内容粘贴到 **Policy Document** 字段中：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "cloudwatch:DescribeAlarms",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 选择**应用策略**。

# 使用 Amazon CloudWatch 事件监控部署
<a name="monitoring-cloudwatch-events"></a>

您可以使用 Amazon CloudWatch Events 来检测 CodeDeploy 操作中实例或部署（“事件”）状态的变化并做出反应。然后，根据您创建的规则，当部署或实例进入您在规则中指定的状态时， CloudWatch 事件将调用一个或多个目标操作。根据状态更改的类型，您可能想发送通知，捕获状态信息，采取纠正措施，启动事件或采取其他操作。在 CodeDeploy 操作中使用 CloudWatch 事件时，您可以选择以下类型的目标：
+ AWS Lambda 函数
+  Kinesis Streams
+ Amazon SQS 队列
+ 内置目标（`EC2 CreateSnapshot API call`、`EC2 RebootInstances API call`、`EC2 StopInstances API call` 和 `EC2 TerminateInstances API call`）
+ Amazon SNS 主题

下面是一些用例：
+ 每当部署失败时使用 Lambda 函数向 Slack 通道传送通知。
+ 将有关部署或实例的数据推送到 Kinesis 流，以支持全面、实时的状态监控。
+ 当您指定的部署或 EC2实例事件发生时，使用 CloudWatch 警报操作自动停止、终止、重启或恢复 Amazon 实例。

本主题的其余部分描述了为创建 CloudWatch 事件规则的基本过程 CodeDeploy。但是，在创建用于 CodeDeploy 操作的事件规则之前，应执行以下操作：
+ 完成 CloudWatch 活动先决条件。有关信息，请参阅 [Amazon CloudWatch 活动先决条件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CWE_Prerequisites.html)。
+ 熟悉事件中的事件、规则和目标。 CloudWatch 有关更多信息，请参阅[什么是 Amazon CloudWatch 活动？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) 和[新 CloudWatch 事件 — 跟踪和响应 AWS 资源的变化](https://aws.amazon.com/blogs/aws/new-cloudwatch-events-track-and-respond-to-changes-to-your-aws-resources/)。
+ 创建将在您的事件规则中使用的目标。

**要为以下 CloudWatch 各项创建事件规则 CodeDeploy：**

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

1. 在导航窗格中，选择 **Events（事件）**。

1. 选择**创建规则**，然后在**事件选择器**下选择 **AWS CodeDeploy**。

1. 指定详细信息类型：
   + 要设置适用于所有实例和部署状态更改的规则，请选择 **Any detail type**，然后跳到步骤 6。
   + 要制定仅适用于实例的规则，请选择**特定详细信息类型**，然后选择**CodeDeploy 实例状态更改通知**。
   + 要制定仅适用于部署的规则，请选择**特定详细信息类型**，然后选择**CodeDeploy 部署状态更改通知**。

1. 指定规则适用的状态更改：
   + 要设置适用于所有状态更改的规则，请选择 **Any state**。
   + 要设置仅适用于部分状态更改的规则，请选择 **Specific state（s）**，然后从列表中选择一个或多个状态值。下表列出了您可以选择的状态值：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/monitoring-cloudwatch-events.html)

1. 指定规则适用于哪些 CodeDeploy 应用程序：
   + 要设置适用于所有应用程序的规则，请选择 **Any application**，然后跳到步骤 8。
   + 要设置仅适用于一个应用程序的规则，请选择 **Specific application**，然后从列表中选择该应用程序的名称。

1. 指定规则适用的部署组：
   + 要设置适用于与所选应用程序关联的所有部署组的规则，请选择 **Any deployment group**。
   + 要设置仅适用于与所选应用程序关联的一个部署组的规则，请选择 **Specific deployment group（s）**，然后从列表中选择该部署组的名称。

1. 审查您的规则设置以确保其符合事件监控要求。

1. 在 **Targets** 区域，选择 **Add target\$1**。

1. 在 **Select target type** 列表中，选择您准备为此规则使用的目标类型，然后配置该类型所需的任何其他选项。

1. 选择 **Configure details（配置详细信息）**。

1. 在 **Configure rule details** 页面上，为规则键入名称和说明，然后选择 **State** 框以立即启用该规则。

1. 如果您对规则满意，请选择 **Create rule**。

# 使用监控部署 AWS CloudTrail
<a name="monitoring-cloudtrail"></a>

CodeDeploy 与一项服务集成 CloudTrail，该服务可捕获由您的账户或代表您的 AWS 账户进行的 API 调用，并将日志文件传输到您指定的 Amazon S3 存储桶。 CodeDeploy CloudTrail捕获来自 CodeDeploy 控制台、通过 CodeDeploy 命令或 CodeDeploy APIs 直接从控制台发出的 API 调用。 AWS CLI使用收集到的信息 CloudTrail，您可以确定向哪个请求发出 CodeDeploy、发出请求的源 IP 地址、谁发出了请求、何时发出请求等。要了解更多信息 CloudTrail，包括如何配置和启用它，请参阅[《AWS CloudTrail 用户指南》](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

## CodeDeploy 信息在 CloudTrail
<a name="service-name-info-in-cloudtrail"></a>

在您的 AWS 账户中启用 CloudTrail 日志记录后，将在日志文件中跟踪对 CodeDeploy 操作进行的 API 调用。 CodeDeploy 记录与其他 AWS 服务记录一起写入日志文件。 CloudTrail 根据时间段和文件大小决定何时创建和写入新文件。

所有 CodeDeploy 操作都记录并记录在《[AWS CodeDeploy 命令行参考](https://docs.aws.amazon.com/cli/latest/reference/deploy/index.html)》和《[AWS CodeDeploy API 参考](https://docs.aws.amazon.com/codedeploy/latest/APIReference/)》中。例如，创建部署、删除应用程序和注册应用程序修订的调用会在 CloudTrail 日志文件中生成条目。

每个日志条目都包含有关生成请求的人员的信息。日志中的用户身份信息可帮助您确定请求是使用根凭证还是用户凭证发出，使用角色或联合用户的临时安全证书，还是由其他 AWS 服务发出的。有关更多信息，请参阅 [CloudTrail 事件参考](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/event_reference_top_level.html)中的 **userIdentity** 字段。

日志文件可以在存储桶中存储任意长时间，不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。默认情况下，将使用 Amazon S3 服务器端加密（SSE）对日志文件进行加密。

您可以让您在传送新的日志文件时 CloudTrail 发布 Amazon SNS 通知。有关更多信息，请参阅[为 CloudTrail 配置 Amazon SNS 通知](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)。

您还可以将来自多个 AWS 区域和多个 AWS 账户的 CodeDeploy 日志文件聚合到单个 Amazon S3 存储桶中。有关更多信息，请参阅[接收来自多个区域的 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/aggregating_logs_top_level.html)。

## 了解 CodeDeploy 日志文件条目
<a name="understanding-service-name-entries"></a>

CloudTrail 日志文件可以包含一个或多个日志条目，其中每个条目由多个 JSON 格式的事件组成。一个日志条目表示来自任何源的一个请求，包括有关所请求的操作、所有参数以及操作的日期和时间等信息。日志条目不一定具有任何特定顺序。也即，它们不是公用 API 调用的有序堆栈跟踪。

以下示例显示了演示 “ CodeDeploy 创建部署组” 操作的 CloudTrail 日志条目：

```
{
	"Records": [{
		"eventVersion": "1.02",
		"userIdentity": {
			"type": "AssumedRole",
			"principalId": "AKIAI44QH8DHBEXAMPLE:203.0.113.11",
			"arn": "arn:aws:sts::123456789012:assumed-role/example-role/203.0.113.11",
			"accountId": "123456789012",
			"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
			"sessionContext": {
				"attributes": {
					"mfaAuthenticated": "false",
					"creationDate": "2014-11-27T03:57:36Z"
				},
				"sessionIssuer": {
					"type": "Role",
					"principalId": "AKIAI44QH8DHBEXAMPLE",
					"arn": "arn:aws:iam::123456789012:role/example-role",
					"accountId": "123456789012",
					"userName": "example-role"
				}
			}
		},
		"eventTime": "2014-11-27T03:57:36Z",
		"eventSource": "codedeploy.amazonaws.com",
		"eventName": "CreateDeploymentGroup",
		"awsRegion": "us-west-2",
		"sourceIPAddress": "203.0.113.11",
		"userAgent": "example-user-agent-string",
		"requestParameters": {
			"applicationName": "ExampleApplication",
			"serviceRoleArn": "arn:aws:iam::123456789012:role/example-instance-group-role",
			"deploymentGroupName": "ExampleDeploymentGroup",
			"ec2TagFilters": [{
                "value": "CodeDeployDemo",
				"type": "KEY_AND_VALUE",
				"key": "Name"
            }],
            "deploymentConfigName": "CodeDeployDefault.HalfAtATime"
		},
		"responseElements": {
			"deploymentGroupId": "7d64e680-e6f4-4c07-b10a-9e117EXAMPLE"
		},
		"requestID": "86168559-75e9-11e4-8cf8-75d18EXAMPLE",
		"eventID": "832b82d5-d474-44e8-a51d-093ccEXAMPLE",
		"eventType": "AwsApiCall",
		"recipientAccountId": "123456789012"
	},
    ... additional entries ...
    ]
}
```

# 使用 Amazon SNS 事件通知监控部署
<a name="monitoring-sns-event-notifications"></a>

您可以向 CodeDeploy 部署组添加触发器，以接收与该部署组中的部署或实例相关的事件的通知。对于您加入到该触发器操作中的 Amazon SNS 主题，通知将发送到已订阅该主题的接收人。

您可以通过 SMS 消息或电子邮件接收 CodeDeploy 事件通知。您也可以通过其他方式使用在指定事件发生时创建的 JSON 数据，如发送消息到 Amazon SQS 队列或调用 AWS Lambda中的函数。若要查看为部署和实例触发器提供的 JSON 数据的结构，请参阅 [CodeDeploy 触发器的 JSON 数据格式](monitoring-sns-event-notifications-json-format.md)。

在以下情况下，您可以选择使用触发器来接收通知：
+ 您是开发人员，需要知道部署失败或停止的时间，以便进行问题排查。
+ 您是系统管理员，需要知道失败的实例数量，以便监控 Amazon EC2 队列的运行状况。
+ 你是一名经理，需要 at-a-glance计算部署和实例事件，你可以通过筛选规则来获得这些信息，这些规则将不同类型的通知发送到桌面电子邮件客户端中的文件夹。

对于以下任一事件类型，您最多可以为每个 CodeDeploy 部署组创建 10 个触发器。


| 部署事件 | 实例事件 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/monitoring-sns-event-notifications.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/monitoring-sns-event-notifications.html)  | 
| ¹ 仅适用于 blue/green 部署。表示已在替换环境中的实例上安装最新应用程序修订并且现在可以在负载均衡器的后面重新路由来自原始环境的流量。有关更多信息，请参阅 [在中处理部署 CodeDeploy](deployments.md)。 | 

**Topics**
+ [向服务角色授予 Amazon SNS 权限](monitoring-sns-event-notifications-permisssions.md)
+ [为 CodeDeploy 事件创建触发器](monitoring-sns-event-notifications-create-trigger.md)
+ [在部署组中编辑触发器](monitoring-sns-event-notifications-edit-trigger.md)
+ [从部署组中删除触发器](monitoring-sns-event-notifications-delete-trigger.md)
+ [触发器的 JSON 数据格式](monitoring-sns-event-notifications-json-format.md)

# 向服务角色授予 Amazon SNS 权限 CodeDeploy
<a name="monitoring-sns-event-notifications-permisssions"></a>

在触发器生成通知之前，必须向您在 CodeDeploy 操作中使用的服务角色授予访问 Amazon SNS 资源的权限。

**向服务角色授予 Amazon SNS 权限**

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

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 选择您在 AWS CodeDeploy 操作中使用的服务角色的名称。

1. 在 **Permissions** 选项卡上的 **Inline Policies** 区域中，选择 **Create Role Policy**。

   –或者–

   如果 **Create Role Policy** 按钮不可用，展开 **Inline Policies** 区域，然后选择 **click here**。

1. 在 **Set Permissions** 页面上，选择 **Custom Policy**，然后选择 **Select**。

1. 在**审查策略**页面上的**策略名称**字段中，输入一个名称以标识此策略（如 `SNSPublish`）。

1. 将以下内容粘贴到 **Policy Document** 字段中：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "sns:Publish",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 选择**应用策略**。

# 为 CodeDeploy 事件创建触发器
<a name="monitoring-sns-event-notifications-create-trigger"></a>

您可以创建一个针对 AWS CodeDeploy 部署或实例事件发布 Amazon Simple Notification Service（Amazon SNS）主题的触发器。然后，当该事件发生时，关联主题的所有订阅者都通过主题中指定的终端节点（如短信或电子邮件）接收通知。Amazon SNS 提供多种订阅主题的方式。

在创建触发器之前，必须设置触发器指向的 Amazon SNS 主题。有关信息，请参阅[创建主题](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。在创建主题时，我们建议您为主题指定一个标识其用途的名称，并采用诸如 `Topic-group-us-west-3-deploy-fail` 或 `Topic-group-project-2-instance-stop` 这样的格式。

您还必须向 CodeDeploy 服务角色授予 Amazon SNS 权限，然后才能为您的触发器发送通知。有关信息，请参阅[向服务角色授予 Amazon SNS 权限 CodeDeploy](monitoring-sns-event-notifications-permisssions.md)。

创建主题后，您可以添加订阅者。有关创建、管理和订阅主题的信息，请参阅[什么是 Amazon Simple Notification Service](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)。



## 创建触发器以发送 CodeDeploy 事件通知（控制台）
<a name="monitoring-sns-event-notifications-create-trigger-console"></a>

您可以使用 CodeDeploy 控制台为 CodeDeploy 事件创建触发器。在设置过程结束时，将发送一条测试通知消息，以确保权限和触发器详细信息均已正确设置。

**为 CodeDeploy 事件创建触发器**

1. 在中 AWS 管理控制台，打开 AWS CodeDeploy 控制台。

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

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

1. 在 **Applications（应用程序）**页面上，选择与您要在其中添加触发器的部署组关联的应用程序的名称。

1. 在 **Application details（应用程序）**页面上，选择您要在其中添加触发器的部署组。

1.  选择**编辑**。

1.  展开 **Advanced - optional（高级 - 可选）**。

1.  在 **Triggers（触发器）**区域中，选择 **Create trigger（创建触发器）**。

1. 在 **Create deployment trigger（创建部署触发器）**窗格中，执行以下操作：

   1. 在**触发器名称**中，输入触发器的名称以便于标识其用途。我们建议采用 `Trigger-group-us-west-3-deploy-fail` 或 `Trigger-group-eu-central-instance-stop` 这样的格式。

   1. 在**事件**中，选择将触发 Amazon SNS 主题发送通知的事件类型。

   1. 在 **Amazon SNS 主题**中，选择您为发送此触发器的通知而创建的主题的名称。

   1.  选择**创建触发器**。 CodeDeploy 发送测试通知，确认您已正确配置与 Amazon SNS 主题 CodeDeploy 之间的访问权限。如果您已订阅该主题，您会收到通过 SMS 消息或电子邮件发送的确认信息，具体取决于您为该主题选择的终端结点类型。

1.  选择**保存更改**。

## 创建触发器以发送 CodeDeploy 事件通知 (CLI)
<a name="monitoring-sns-event-notifications-create-trigger-cli"></a>

您可以在创建部署组时使用 CLI 来加入触发器，也可以将触发器添加到现有部署组。

### 创建触发器以发送关于新部署组的通知
<a name="monitoring-sns-event-notifications-create-trigger-cli-new"></a>

创建 JSON 文件来配置部署组，然后使用`--cli-input-json`选项运行该[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html)命令。

创建 JSON 文件最简单的方式是使用 `--generate-cli-skeleton` 选项获取 JSON 格式的副本，然后在纯文本编辑器中提供所需的值。

1. 运行以下命令，然后将结果复制到纯文本编辑器中。

   ```
   aws deploy create-deployment-group --generate-cli-skeleton
   ```

1. 将现有 CodeDeploy 应用程序的名称添加到输出中：

   ```
   {
       "applicationName": "TestApp-us-east-2",
       "deploymentGroupName": "",
       "deploymentConfigName": "",
       "ec2TagFilters": [
           {
               "Key": "",
               "Value": "",
               "Type": ""
           }
       ],
       "onPremisesInstanceTagFilters": [
           {
               "Key": "",
               "Value": "",
               "Type": ""
           }
       ],
       "autoScalingGroups": [
           ""
       ],
       "serviceRoleArn": "",
       "triggerConfigurations": [
           {
               "triggerName": "",
               "triggerTargetArn": "",
               "triggerEvents": [
                   ""
               ]
           }
       ]
   }
   ```

1. 为您要配置的参数提供值。

   使用该[create-deployment-group](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeploymentGroup.html)命令时，必须至少为以下参数提供值：
   + `applicationName`：已在您的账户中创建的应用程序的名称。
   + `deploymentGroupName`：您正在创建的部署组的名称。
   + `serviceRoleArn`：在您的账户中设置的现有服务角色的 CodeDeploy ARN。有关信息，请参阅[步骤 2：为创建服务角色 CodeDeploy](getting-started-create-service-role.md)。

   在 `triggerConfigurations` 部分，为以下参数提供值：
   + `triggerName`：您要为触发器给定的便于标识的名称。我们建议采用 `Trigger-group-us-west-3-deploy-fail` 或 `Trigger-group-eu-central-instance-stop` 这样的格式。
   + `triggerTargetArn`：您创建的要与触发器关联的 Amazon SNS 主题的 ARN，采用以下格式：`arn:aws:sns:us-east-2:444455556666:NewTestTopic`。
   + `triggerEvents`：您要为其触发通知的事件的类型。您可以指定一个或多个事件类型，多个事件类型名称用逗号分隔（例如，`"triggerEvents":["DeploymentSuccess","DeploymentFailure","InstanceFailure"]`）。当您添加多个事件类型时，所有这些类型的通知都将发送到您指定的主题，而不是分别发送到不同的主题。您可以从以下事件类型中选择：
     + DeploymentStart
     + DeploymentSuccess
     + DeploymentFailure
     + DeploymentStop
     + DeploymentRollback
     + DeploymentReady （仅适用于 blue/green 部署中的替换实例）
     + InstanceStart
     + InstanceSuccess
     + InstanceFailure
     + InstanceReady （仅适用于 blue/green 部署中的替换实例）

   以下配置示例将为一个名为 `TestApp-us-east-2` 的应用程序创建一个名为 `dep-group-ghi-789-2` 的部署组，并创建一个触发器，在部署启动、成功或失败时，该触发器都提示发送通知：

   ```
   {
       "applicationName": "TestApp-us-east-2",
       "deploymentConfigName": "CodeDeployDefault.OneAtATime",
       "deploymentGroupName": "dep-group-ghi-789-2",
       "ec2TagFilters": [
           {
               "Key": "Name",
               "Value": "Project-ABC",
               "Type": "KEY_AND_VALUE"
           }
       ],
       "serviceRoleArn": "arn:aws:iam::444455556666:role/AnyCompany-service-role",
       "triggerConfigurations": [
           {
               "triggerName": "Trigger-group-us-east-2",
               "triggerTargetArn": "arn:aws:sns:us-east-2:444455556666:us-east-deployments",
               "triggerEvents": [
                   "DeploymentStart",
                   "DeploymentSuccess",
                   "DeploymentFailure"
               ]
           }
       ]
   }
   ```

1. 以 JSON 文件格式保存更新，然后在运行 **create-deployment-group** 命令时使用 `--cli-input-json` 选项调用该文件：
**重要**  
务必在文件名前包含 `file://`。此命令中需要该项。

   ```
   aws deploy create-deployment-group --cli-input-json file://filename.json
   ```

   在创建过程结束时，您会收到一条测试通知消息，指示权限和触发器详细信息均已正确设置。

### 创建触发器以发送关于现有部署组的通知
<a name="monitoring-sns-event-notifications-create-trigger-cli-existing"></a>

要使用将 AWS CLI CodeDeploy 事件触发器添加到现有部署组，请创建一个 JSON 文件来更新部署组，然后使用`--cli-input-json`选项运行[update-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html)命令。

创建 JSON 文件最简单的方式是运行 **get-deployment-group** 命令以获取部署组配置的副本（采用 JSON 格式），然后在纯文本编辑器中更新参数值。

1.  运行以下命令，然后将结果复制到纯文本编辑器中。

   ```
   aws deploy get-deployment-group --application-name application --deployment-group-name deployment-group
   ```

1. 从输出中删除以下内容：
   + 在输出的开头处，删除 `{ "deploymentGroupInfo":`。
   + 在输出的结尾处，删除 `}`。
   + 删除包含 `deploymentGroupId` 的行。
   + 删除包含 `deploymentGroupName` 的行。

   现在，您的文本文件的内容看起来应类似于以下内容：

   ```
   {
       "applicationName": "TestApp-us-east-2",
       "deploymentConfigName": "CodeDeployDefault.OneAtATime",
       "autoScalingGroups": [],
       "ec2TagFilters": [
           {
               "Type": "KEY_AND_VALUE",
               "Value": "Project-ABC",
               "Key": "Name"
           }
       ],
       "triggerConfigurations": [],
       "serviceRoleArn": "arn:aws:iam::444455556666:role/AnyCompany-service-role",
       "onPremisesInstanceTagFilters": []
   }
   ```

1. 在 `triggerConfigurations` 部分，为 `triggerEvents`、`triggerTargetArn` 和 `triggerName` 参数添加数据。有关触发器配置参数的信息，请参见[TriggerConfig](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_TriggerConfig.html)。

   现在，您的文本文件的内容看起来应类似于以下内容。在部署启动、成功或失败时，此代码都会提示发送通知。

   ```
   {
       "applicationName": "TestApp-us-east-2",
       "deploymentConfigName": "CodeDeployDefault.OneAtATime",
       "autoScalingGroups": [],
       "ec2TagFilters": [
           {
               "Type": "KEY_AND_VALUE",
               "Value": "Project-ABC",
               "Key": "Name"
           }
       ],
       "triggerConfigurations": [
           {
               "triggerEvents": [
                   "DeploymentStart",
                   "DeploymentSuccess",
                   "DeploymentFailure"
               ],
               "triggerTargetArn": "arn:aws:sns:us-east-2:444455556666:us-east-deployments",
               "triggerName": "Trigger-group-us-east-2"
           }
       ],
       "serviceRoleArn": "arn:aws:iam::444455556666:role/AnyCompany-service-role",
       "onPremisesInstanceTagFilters": []
   }
   ```

1. 将更新保存为 JSON 文件，然后使用`--cli-input-json`选项运行[update-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html)命令。请务必包含该`--current-deployment-group-name`选项，并将您的 JSON 文件名替换*filename*为：
**重要**  
务必在文件名前包含 `file://`。此命令中需要该项。

   ```
   aws deploy update-deployment-group --current-deployment-group-name deployment-group-name --cli-input-json file://filename.json
   ```

   在创建过程结束时，您会收到一条测试通知消息，指示权限和触发器详细信息均已正确设置。

# 在 CodeDeploy 部署组中编辑触发器
<a name="monitoring-sns-event-notifications-edit-trigger"></a>

如果您的通知要求更改，您可以修改触发器而不必创建新的触发器。

## 修改 CodeDeploy 触发器 (CLI)
<a name="monitoring-sns-event-notifications-edit-trigger-cli"></a>

 AWS CLI 要在更新部署组时使用更改 CodeDeploy 事件的触发器详细信息，请创建一个 JSON 文件来定义对部署组属性的更改，然后运行带有`--cli-input-json`选项的[update-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/update-deployment-group.html)命令。

创建 JSON 文件最简单的方式是运行 **get-deployment-group** 命令以获取当前部署组详细信息（采用 JSON 格式），然后在纯文本编辑器中编辑所需的值。

1. 运行以下命令，用应用程序和部署组的名称代替*application*和*deployment-group*：

   ```
   aws deploy get-deployment-group --application-name application --deployment-group-name deployment-group
   ```

1. 将命令的结果复制到纯文本编辑器中，然后删除以下内容：
   + 在输出的开头处，删除 `{ "deploymentGroupInfo":`。
   + 在输出的结尾处，删除 `}`。
   + 删除包含 `deploymentGroupId` 的行。
   + 删除包含 `deploymentGroupName` 的行。

   现在，您的文本文件的内容看起来应类似于以下内容：

   ```
   {
       "applicationName": "TestApp-us-east-2",
       "deploymentConfigName": "CodeDeployDefault.OneAtATime",
       "autoScalingGroups": [],
       "ec2TagFilters": [
           {
               "Type": "KEY_AND_VALUE",
               "Value": "East-1-Instances",
               "Key": "Name"
           }
       ],
       "triggerConfigurations": [
           {
               "triggerEvents": [
                   "DeploymentStart",
                   "DeploymentSuccess",
                   "DeploymentFailure",
                   "DeploymentStop"
               ],
               "triggerTargetArn": "arn:aws:sns:us-east-2:111222333444:Trigger-group-us-east-2",
               "triggerName": "Trigger-group-us-east-2"
           }
       ],
       "serviceRoleArn": "arn:aws:iam::444455556666:role/AnyCompany-service-role",
       "onPremisesInstanceTagFilters": []
   }
   ```

1. 根据需要更改任意参数。有关触发器配置参数的信息，请参见[TriggerConfig](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_TriggerConfig.html)。

1. 将更新保存为 JSON 文件，然后使用`--cli-input-json`选项运行[update-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/update-deployment-group.html)命令。请务必包含该`--current-deployment-group-name`选项，并将您的 JSON 文件名替换*filename*为：
**重要**  
务必在文件名前包含 `file://`。此命令中需要该项。

   ```
   aws deploy update-deployment-group --current-deployment-group-name deployment-group-name --cli-input-json file://filename.json
   ```

在创建过程结束时，您会收到一条测试通知消息，指示权限和触发器详细信息均已正确设置。

# 从 CodeDeploy 部署组中删除触发器
<a name="monitoring-sns-event-notifications-delete-trigger"></a>

由于每个部署组的触发器数量限制为 10 个，因此您可能需要删除不再使用的触发器。您无法撤消删除触发器的操作，但可以重新创建一个触发器。

## 从部署组中删除触发器（控制台）
<a name="monitoring-sns-event-notifications-delete-trigger-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. 在 **Applications（应用程序）**页面上，选择与您要在其中删除触发器的部署组关联的应用程序的名称。

1. 在 **Application details（应用程序）**页面上，选择您要在其中删除触发器的部署组。

1.  选择**编辑**。

1.  展开 **Advanced - optional（高级 - 可选）**。

1. 在 **Triggers（触发器）**区域中，选择要删除的触发器，然后选择 **Delete trigger（删除触发器）**。

1.  选择**保存更改**。

## 从部署组中删除触发器（CLI）
<a name="monitoring-sns-event-notifications-delete-trigger-cli"></a>

要使用 CLI 删除触发器，请使用空的触发器配置参数调用 [update-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/update-deployment-group.html) 命令，并指定：
+ 与部署组关联的应用程序的名称。要查看应用程序名称的列表，请调用 [list-applications](https://docs.aws.amazon.com/cli/latest/reference/deploy/list-applications.html) 命令。
+ 与应用程序关联的部署组的名称。要查看部署组名称的列表，请调用 [list-deployment-groups](https://docs.aws.amazon.com/cli/latest/reference/deploy/list-deployment-groups.html) 命令。

例如：

```
aws deploy update-deployment-group --application-name application-name --current-deployment-group-name deployment-group-name --trigger-configurations
```

# CodeDeploy 触发器的 JSON 数据格式
<a name="monitoring-sns-event-notifications-json-format"></a>

您可以使用在自定义通知工作流程中激活部署或实例的触发器时创建的 JSON 输出，如发送消息到 Amazon SQS 队列或调用 AWS Lambda中的函数。

**注意**  
本指南不解决如何使用 JSON 配置通知的问题。有关使用 Amazon SNS 将消息发送到 Amazon SQS 队列的信息，请参阅[将 Amazon SNS 消息发送至 Amazon SQS 队列](https://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html)。有关使用 Amazon SNS 调用 Lambda 函数的信息，请参阅[使用 Amazon SNS 通知调用 Lambda 函数](https://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html)。

以下示例将显示适用于 CodeDeploy 触发器的 JSON 输出的结构。

**适用于基于实例的触发器的示例 JSON 输出**

```
{
    "region": "us-east-2",
    "accountId": "111222333444",
    "eventTriggerName": "trigger-group-us-east-instance-succeeded",
    "deploymentId": "d-75I7MBT7C",
    "instanceId": "arn:aws:ec2:us-east-2:444455556666:instance/i-496589f7",
    "lastUpdatedAt": "1446744207.564",
    "instanceStatus": "Succeeded",
    "lifecycleEvents": [
        {
            "LifecycleEvent": "ApplicationStop",
            "LifecycleEventStatus": "Succeeded",
            "StartTime": "1446744188.595",
            "EndTime": "1446744188.711"
        },
        {
            "LifecycleEvent": "BeforeInstall",
            "LifecycleEventStatus": "Succeeded",
            "StartTime": "1446744189.827",
            "EndTime": "1446744190.402"
        }
//More lifecycle events might be listed here
    ]
}
```

**适用于基于部署的触发器的示例 JSON 输出**

```
{
    "region": "us-west-1",
    "accountId": "111222333444",
    "eventTriggerName": "Trigger-group-us-west-3-deploy-failed",
    "applicationName": "ProductionApp-us-west-3",
    "deploymentId": "d-75I7MBT7C",
    "deploymentGroupName": "dep-group-def-456",
    "createTime": "1446744188.595",
    "completeTime": "1446744190.402",
    "deploymentOverview": {
        "Failed": "10",
        "InProgress": "0",
        "Pending": "0",
        "Skipped": "0",
        "Succeeded": "0"
    },
    "status": "Failed",
    "errorInformation": {
        "ErrorCode": "IAM_ROLE_MISSING",
        "ErrorMessage": "IAM Role is missing for deployment group: dep-group-def-456"
    }
}
```