

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

# Amazon EC2 Auto Scaling 的 Amazon SNS 通知选项
<a name="ec2-auto-scaling-sns-notifications"></a>

可以配置自动扩缩组以通知您影响应用程序的重要事件。如果使用通知，您还可以不再使用轮询，并且不会遇到有时由轮询引起的 `RequestLimitExceeded` 错误。

可通过两种方式接收有关 Amazon EC2 Auto Scaling 的通知：
+ **Amazon Simple Notiﬁcation Service**：Amazon SNS 可以在自动扩缩组启动或终止实例时通知您。您只能打开或关闭 Amazon SNS 通知。有关更多信息，请参阅 [Amazon SNS 和 Amazon EC2 Auto Scaling](#amazon-sns-and-ec2-auto-scaling)。
+ **亚马逊 EventBridge** — EventBridge 提供更高级的事件驱动型通知，这些通知符合指定标准，并发送到各种目标，包括 Amazon SNS。 EventBridge 还可以监控更广泛的 Auto Scaling 事件，以实现更精确的监控。有关更多信息，请参阅 [用于处理 EventBridge Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。

您可以选择使用带有生命周期挂钩的通知，以在启动或终止期间对实例执行自定义操作。有关如何配置通知以与生命周期挂钩配合使用的更多信息，请参阅 [Amazon EC2 Auto Scaling 生命周期钩子](lifecycle-hooks.md)。

## Amazon SNS 和 Amazon EC2 Auto Scaling
<a name="amazon-sns-and-ec2-auto-scaling"></a>

本节介绍如何使用 Amazon SNS 监控自动扩缩组何时启动或终止实例。

例如，如果将 Auto Scaling 组配置为使用 `autoscaling: EC2_INSTANCE_TERMINATE` 通知类型，并且您的 Auto Scaling 组终止了某个实例，则它会发送电子邮件通知。该电子邮件包含已终止实例的详细信息，如实例 ID 以及终止该实例的原因。

请注意，当 Amazon EC2 Auto Scaling 在组中添加或移除实例时，会向您发送有关这些更改的通知，每个实例发送一条通知。但是，这些通知的发送基于尽力原则，您的实例在初始通知后仍可能失败，例如，稍后的运行状况检查失败。有关运行状况检查流程的更多信息，请参阅[自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。

有关 Amazon SNS 一般情况的更多信息，请参阅《Amazon Simple Notification Service Developer Guide》[https://docs.amazonaws.cn/sns/latest/dg/](https://docs.amazonaws.cn/sns/latest/dg/)。

**Contents**
+ [SNS 通知](#auto-scaling-sns-notifications)
+ [为 Amazon EC2 Auto Scaling 配置 Amazon SNS 通知](#as-configure-sns)
  + [创建 Amazon SNS 主题](#as-sns-create-topic)
  + [订阅 Amazon SNS 主题](#as-sns-subscribe-topic)
  + [确认您的 Amazon SNS 订阅](#as-sns-confirm-subscription)
  + [配置 Auto Scaling 组以发送通知](#as-configure-asg-for-sns)
  + [测试通知](#testing-hook-notifications)
  + [删除通知配置](#delete-settingupnotifications)
+ [加密 Amazon SNS 主题的密钥策略](#sns-kms-permissions)

### SNS 通知
<a name="auto-scaling-sns-notifications"></a>

Amazon EC2 Auto Scaling 支持在发生以下事件时发送 Amazon SNS 通知。


| 事件 | 说明 | 
| --- | --- | 
|  `autoscaling:EC2_INSTANCE_LAUNCH`  | 实例启动成功 | 
|  `autoscaling:EC2_INSTANCE_LAUNCH_ERROR`  | 实例启动失败 | 
|  `autoscaling:EC2_INSTANCE_TERMINATE`  | 实例终止成功 | 
|  `autoscaling:EC2_INSTANCE_TERMINATE_ERROR`  | 实例终止失败 | 

消息包含以下信息：
+ `Event` — 事件。
+ `AccountId` — 亚马逊云科技账户 ID。
+ `AutoScalingGroupName` — Auto Scaling 组的名称。
+ `AutoScalingGroupARN` — Auto Scaling 组的 ARN。
+ `EC2InstanceId` — EC2 实例的 ID。

例如：

```
Service: AWS Auto Scaling
Time: 2016-09-30T19:00:36.414Z
RequestId: 4e6156f4-a9e2-4bda-a7fd-33f2ae528958
Event: autoscaling:EC2_INSTANCE_LAUNCH
AccountId: 123456789012
AutoScalingGroupName: my-asg
AutoScalingGroupARN: arn:aws:autoscaling:region:123456789012:autoScalingGroup...
ActivityId: 4e6156f4-a9e2-4bda-a7fd-33f2ae528958
Description: Launching a new EC2 instance: i-0598c7d356eba48d7
Cause: At 2016-09-30T18:59:38Z a user request update of AutoScalingGroup constraints to ...
StartTime: 2016-09-30T19:00:04.445Z
EndTime: 2016-09-30T19:00:36.414Z
StatusCode: InProgress
StatusMessage: 
Progress: 50
EC2InstanceId: i-0598c7d356eba48d7
Details: {"Subnet ID":"subnet-id","Availability Zone":"zone"}
Origin: AutoScalingGroup
Destination: EC2
```

### 为 Amazon EC2 Auto Scaling 配置 Amazon SNS 通知
<a name="as-configure-sns"></a>

要使用 Amazon SNS 发送电子邮件通知，必须先创建一个*主题*，然后用您的电子邮件地址订阅该主题。

#### 创建 Amazon SNS 主题
<a name="as-sns-create-topic"></a>

 SNS 主题是一个逻辑接入点，即 Auto Scaling 组用来发送通知的通信通道。您可通过为主题指定名称来创建主题。

您在创建主题名称时，该名称必须满足以下要求：
+ 介于 1 到 256 个字符之间
+ 包含大写和小写 ASCII 字母、数字、下划线或连字符 

有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[创建 Amazon SNS 主题](https://docs.amazonaws.cn/sns/latest/dg/sns-create-topic.html)。

#### 订阅 Amazon SNS 主题
<a name="as-sns-subscribe-topic"></a>

要接收您的 Auto Scaling 组发送到该主题的通知，必须让一个终端节点订阅该主题。在此过程中，为**端点**指定要用来接收来自 Amazon EC2 Auto Scaling 的通知的电子邮件地址。

有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[订阅 Amazon SNS 主题](https://docs.amazonaws.cn/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)。

#### 确认您的 Amazon SNS 订阅
<a name="as-sns-confirm-subscription"></a>

Amazon SNS 向在上一步骤中指定的电子邮件地址发送确认电子邮件。

确保打开并选择链接以确认订阅，然后再继续执行下一步。

您将收到来自的确认消息。 Amazon Amazon SNS 现已配置为接收通知并以电子邮件形式将通知发送到指定的电子邮件地址。

#### 配置 Auto Scaling 组以发送通知
<a name="as-configure-asg-for-sns"></a>

您可以配置 Auto Scaling 组，以便在发生扩展事件（例如，启动实例或终止实例）时向 Amazon SNS 发送通知。Amazon SNS 向您指定的电子邮件地址发送通知，通知中包含有关实例的信息。

**为 Auto Scaling 组配置 Amazon SNS 通知（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的自动扩缩组旁边的复选框。

   将在页面底部打开一个拆分窗格，其中显示有关所选组的信息。

1. 在**活动**选项卡上，选择**活动通知**、**创建通知**。

1. 在 **Create notifications** 窗格上，执行以下操作：

   1. 对于 **SNS 主题**，选择您的 SNS 主题。

   1. 对于**事件类型**，选择要发送通知的事件。

   1. 选择**创建**。

**为 Auto Scaling 组配置 Amazon SNS 通知 (Amazon CLI)**  
使用以下 [put-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-notification-configuration.html) 命令。

```
aws autoscaling put-notification-configuration --auto-scaling-group-name my-asg --topic-arn arn --notification-types "autoscaling:EC2_INSTANCE_LAUNCH" "autoscaling:EC2_INSTANCE_TERMINATE"
```

#### 测试通知
<a name="testing-hook-notifications"></a>

要为启动事件生成通知，请通过将 Auto Scaling 组的所需容量增加 1 来更新 Auto Scaling 组。您将在实例启动后的几分钟内收到通知。

**更改所需容量（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的 Auto Scaling 组旁边的复选框。

   将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格，其中显示有关所选组的信息。

1. 在 **Details**（详细信息）选项卡上，选择 **Group details**（组详细信息）、**Edit (编辑)**。

1. 对于 **Desired capacity (所需容量)**，将当前值增加 1。如果此值超过 **Maximum capacity (最大容量)**，则还必须将 **Maximum capacity (最大容量)** 的值增加 1。

1. 选择**更新**。

1. 在数分钟后，您将收到事件的通知。如果您不需要您为此测试启动的其他实例，则可以将 **Desired capacity (所需容量)** 减少 1。在数分钟后，您将收到事件的通知。

#### 删除通知配置
<a name="delete-settingupnotifications"></a>

如果您的 Amazon EC2 Auto Scaling 通知配置不再使用，您可以将其删除。

**删除 Amazon EC2 Auto Scaling 通知配置（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选择您的 Auto Scaling 组。

1. 在**活动**选项卡上，选中您要删除的通知旁边的复选框，然后选择**操作**、**删除**。

**删除 Amazon EC2 Auto Scaling 通知配置 (Amazon CLI)**  
使用以下 **delete-notification-configuration** 命令。

```
aws autoscaling delete-notification-configuration --auto-scaling-group-name my-asg --topic-arn arn
```

有关删除 Amazon SNS 主题以及与您的 Auto Scaling 组关联的所有订阅的信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[删除 Amazon SNS 订阅和主题](https://docs.amazonaws.cn/sns/latest/dg/sns-delete-subscription-topic.html)。

### 加密 Amazon SNS 主题的密钥策略
<a name="sns-kms-permissions"></a>

您指定的 Amazon SNS 主题可能会使用通过 Amazon Key Management Service创建的客户托管密钥进行加密。要授予 Amazon EC2 Auto Scaling 发布加密主题的权限，您必须先创建您的 KMS 密钥，然后将以下语句添加到 KMS 密钥的策略中。将示例 ARN 替换为允许访问密钥的相应服务相关角色的 ARN。有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[配置 Amazon KMS 权限](https://docs.amazonaws.cn/sns/latest/dg/sns-key-management.html#sns-what-permissions-for-sse)。

在此示例中，策略声明向名为的服务相关角色**AWSServiceRoleForAutoScaling**授予使用客户托管密钥的权限。要了解有关 Amazon EC2 Auto Scaling 服务相关角色的更多信息，请参阅 [Amazon EC2 Auto Scaling 的服务相关角色](autoscaling-service-linked-role.md)。

```
{
  "Sid": "Allow service-linked role use of the customer managed key",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
  },
  "Action": [
    "kms:GenerateDataKey*",
    "kms:Decrypt"
  ],
  "Resource": "*"
}
```

允许 Amazon EC2 Auto Scaling 发布加密主题的密钥策略不支持 `aws:SourceArn` 和 `aws:SourceAccount` 条件键。