

终止支持通知：2026 年 5 月 20 日， AWS 将终止对的支持。 AWS IoT Events 2026 年 5 月 20 日之后，您将无法再访问 AWS IoT Events 控制台或 AWS IoT Events 资源。有关更多信息，请参阅[AWS IoT Events 终止支持](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-end-of-support.html)。

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

# 使用警报进行监控 AWS IoT Events
<a name="iotevents-alarms"></a>

AWS IoT Events 警报可帮助您监控数据是否有变化。这些数据可以是您衡量设备和过程的指标。您可以创建警报，从而在突破阈值时发送通知。警报可帮助您检测问题、简化维护并优化设备和进程的性能。

警报是警报模型的实例。警报模型指定了要检测的内容、何时发送通知、谁会收到通知等等。您还可以指定警报状态更改时发生的一个或多个[支持的操作](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-supported-actions.html)。 AWS IoT Events 将从您的数据中派生的[输入属性](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-detector-input.html)路由到相应的警报。如果您正在监控的数据超出指定范围，则会调用警报。您也可以确认警报或将其设置为暂停模式。

## 与 AWS IoT SiteWise
<a name="alarms-collaborations.title"></a>

您可以使用 AWS IoT Events 警报来监控中的资产属性 AWS IoT SiteWise。 AWS IoT SiteWise 向 AWS IoT Events 警报发送资产属性值。 AWS IoT Events 将警报状态发送到 AWS IoT SiteWise。

AWS IoT SiteWise 还支持外部警报。如果您在外部使用警报， AWS IoT SiteWise 并且有返回警报状态数据的解决方案，则可以选择外部警报。外部警报包含用于摄取警报状态数据的测量属性。

AWS IoT SiteWise 不评估外部警报的状态。此外，当警报状态发生变化时，您无法确认或暂停外部警报。

您可以使用 SiteWise 监控器功能在监控器入口中 SiteWise 查看外部警报的状态。

有关更多信息，请参阅*《AWS IoT SiteWise 用户指南》中的 “[使用警报监控数据](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/industrial-alarms.html)” 和《监控SiteWise 器应用指南》*[中的 “使用警报](https://docs.aws.amazon.com//iot-sitewise/latest/appguide/monitor-alarms.html)*监*控”。

## 确认流程
<a name="acknowledge-flow"></a>

创建警报模型时，您可以选择是否启用确认流。如果您启用确认流，当警报状态发生变化时，您的团队会收到通知。您的团队可以确认警报并留下笔记。例如，您可以列出警报的信息以及为解决问题而要采取的措施。如果您正在监控的数据超出指定范围，则会调用警报。

警报具有以下状态：

`DISABLED`  
当警报处于 `DISABLED` 状态时，它还没有准备好评估数据。要启用警报，必须将警报更改为 `NORMAL` 状态。

`NORMAL`  
当警报处于 `NORMAL` 状态时，它就可以评估数据了。

`ACTIVE`  
如果警报处于 `ACTIVE` 状态，则会调用警报。您正在监控的数据超出了指定范围。

`ACKNOWLEDGED`  
当警报处于 `ACKNOWLEDGED` 状态时，警报已被调用并且您确认了警报。

`LATCHED`  
警报已被调用，但一段时间后您仍未确认警报。警报会自动更改为 `NORMAL` 状态。

`SNOOZE_DISABLED`  
当警报处于 `SNOOZE_DISABLED` 状态时，警报将在指定的时间段内处于禁用状态。暂停时间过后，警报会自动变为 `NORMAL` 状态。

# 在中创建警报模型 AWS IoT Events
<a name="create-alarm-model"></a>

您可以使用 AWS IoT Events 警报来监控您的数据，并在突破阈值时收到通知。警报提供用于创建或配置警报模型的参数。您可以使用 AWS IoT Events 控制台或 AWS IoT Events API 来创建或配置警报模型。配置警报模型时，更改会随着新数据的到来而生效。

## 要求
<a name="create-alarm-model-requirements"></a>

创建警报模型时应遵循以下要求。
+ 您可以创建警报模型来监控中的输入属性 AWS IoT Events 或中的资产属性 AWS IoT SiteWise。
  + 如果您选择在中监控输入属性 AWS IoT Events，则在创建警报模型[在中为模型创建输入 AWS IoT Events](create-input-overview.md)之前。
  + 如果您选择监控资产属性，则必须 AWS IoT SiteWise 先在中[创建资产模型](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-asset-models.html)，然后才能创建警报模型。
+ 您必须拥有允许您的警报执行操作和访问 AWS 资源的 IAM 角色。有关更多信息，请参阅[为 AWS IoT Events设置权限](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-start.html)。
+ 本教程使用的所有 AWS 资源都必须位于同一个 AWS 区域。

## 创建警报模型（控制台）
<a name="create-alarm-model-console"></a>

以下内容向您展示了如何创建警报模型以监控 AWS IoT Events 控制台中的 AWS IoT Events 属性。

1. 登录 [AWS IoT Events 控制台](https://console.aws.amazon.com/iotevents/)。

1. 在导航窗格中，选择 **警报模型**。

1. 在**警报模型** 页面上，选择 **创建警报模型**。

1. 在**警报模型详细信息**部分中，执行以下操作：

   1. 输入唯一名称。

   1. （可选）输入描述。

1. 在 **警报目标** 部分，执行以下操作：
**重要**  
如果选择 **AWS IoT SiteWise 资产属性**，则必须已在 AWS IoT SiteWise中创建了资产模型。

   1. 选择 **AWS IoT Events 输入属性**。

   1. 选择输入。

   1. 选择输入属性密钥。此输入属性用作创建警报的密钥。 AWS IoT Events 将与此密钥关联的输入路由到警报。
**重要**  
如果输入消息负载不包含此输入属性密钥，或者该密钥不在密钥中指定的 JSON 路径中，则消息将无法摄取 AWS IoT Events。

1. 在 “**阈值定义**” 部分，您可以定义用于更改警报状态的 AWS IoT Events 输入属性、阈值和比较运算符。

   1. 在**输入**属性中，选择要监控的属性。

      每次此输入属性收到新数据时，都会对其进行评估以确定警报的状态。

   1. 对于**运算符**，选择比较运算符。运算符将您的输入属性与属性的阈值进行比较。

      可从以下选项中进行选择：
      + **> 大于**
      + **>= 大于或等于**
      + **< 小于**
      + **<= 小于或等于**
      + **= 等于**
      + **\$1= 不等于**

   1. 对于阈**值**，在输入中 AWS IoT Events 输入一个数字或选择一个属性。 AWS IoT Events 将此值与您选择的输入属性的值进行比较。

   1. （可选）对于**严重性**，请使用您的团队能够理解的数字来反映此警报的严重性。

1. （可选）在**通知设置**部分，配置警报的通知设置。

   您最多可添加 10 个通知。对于**通知 1**，执行以下操作：

   1. 对于 **协议**，请从以下选项中选择：
      + **电子邮件和短信** - 警报会发送短信通知和电子邮件通知。
      + **电子邮件** - 警报会发送电子邮件通知。
      + **短信** - 警报会发送短信通知。

   1. 对于**发件人**，请指定可以发送有关此警报的通知的电子邮件地址。

      要向发件人列表中添加更多电子邮件地址，请选择**添加发件人**。

   1. （可选）在**收件人**中，选择收件人。

      要向收件人列表中添加更多用户，请选择**添加新用户**。您必须先将新用户添加到您的 IAM Identity Center 存储中，然后才能将其添加到警报模型中。有关更多信息，请参阅 [在中管理警报收件人的 IAM 身份中心访问权限 AWS IoT Events](sso-authorization-recipients.md)。

   1. （可选）对于**其他自定义消息**，请输入一条消息，描述警报检测到的内容以及收件人应采取的操作。

1. 在**实例**部分，您可以启用或禁用基于此警报模型创建的所有警报实例。

1. 在**高级设置**部分中，执行以下操作：

   1. 对于**确认流**，您可以启用或禁用通知。
      + 如果选择**启用**，当警报状态发生变化时，您会收到通知。在警报状态可恢复到正常前，您必须选择确认通知。
      + 如果选择**禁用**，则无需执行任何操作。当测量值返回到指定范围以内时，警报会自动变更至正常状态。

      有关更多信息，请参阅 [确认流程](iotevents-alarms.md#acknowledge-flow)。

   1. 对于**权限**，请选择下列选项之一：
      + 您可以通过** AWS 策略模板创建新角色**并 AWS IoT Events 自动为您创建 IAM 角色。
      + **您可以使用允许此警报模型执行操作和访问其他 AWS 资源的现有 IAM 角色**。

      有关更多信息，请参阅 [AWS IoT Events的身份和访问权限管理](https://docs.aws.amazon.com/iotevents/latest/developerguide/security-iam.html)。

   1. 对于**其他通知设置**，您可以编辑您的 AWS Lambda 功能以管理警报通知。为您的 AWS Lambda 函数选择以下选项之一：
      + **创建新 AWS Lambda 函数**- AWS IoT Events 为您创建新 AWS Lambda 函数。
      + **使用现有 AWS Lambda 函数**-通过选择 AWS Lambda 函数名称来使用现有 AWS Lambda 函数。

      有关可能操作的更多信息，请参阅 [AWS IoT Events 使用其他 AWS 服务](iotevents-other-aws-services.md)。

   1. （可选）**在 “设置状态操作”** 中，您可以添加一个或多个在警报状态发生变化时要 AWS IoT Events 执行的操作。

1. (可选) 您可以添加**标签**来管理警报。有关更多信息，请参阅[标记您的 AWS IoT Events 资源](https://docs.aws.amazon.com/iotevents/latest/developerguide/tagging-iotevents.html)。

1. 选择**创建**。

# 对警报做出响应 AWS IoT Events
<a name="respond-to-alarms"></a>

有效响应警报是管理物联网系统的一个重要方面 AWS IoT Events。探索配置和处理警报的各种方法，包括：设置通知渠道、定义上报程序和实施自动响应操作。学习如何创建细致入微的警报条件，确定警报的优先级，并与其他 AWS 服务集成，为您的物联网应用构建响应式警报管理系统。

如果启用[确认流](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-alarms.html#acknowledge-flow) ，当警报状态发生变化时，您会收到通知。要响应警报，您可以确认、禁用、启用、重置或暂停警报。

------
#### [ Console ]

以下内容向您展示了如何在 AWS IoT Events 控制台中响应警报。

1. 登录 [AWS IoT Events 控制台](https://console.aws.amazon.com/iotevents/)。

1. 在导航窗格中，选择 **警报模型**。

1. 选择目标警报模型。

1. 在**警报列表**部分，选择目标警报。

1. 您可以从**操作**中选择以下选项之一：
   + **确认** - 警报变为 `ACKNOWLEDGED` 状态。
   + **禁用** - 警报变为 `DISABLED` 状态。
   + **启用** - 警报变为 `NORMAL` 状态。
   + **重置** - 警报变为 `NORMAL` 状态。
   + **暂停**，然后执行以下操作：

     1. 选择 **暂停时长**或输入**自定义暂停时长**。

     1. 选择**保存**。

     警报变为 `SNOOZE_DISABLED` 状态

   有关警报状态的更多信息，请参阅 [确认流程](iotevents-alarms.md#acknowledge-flow)。

------
#### [ API ]

要响应一个或多个警报，您可以使用以下 AWS IoT Events API 操作：
+ [BatchAcknowledgeAlarm](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_BatchAcknowledgeAlarm.html)
+ [BatchDisableAlarm](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_BatchDisableAlarm.html)
+ [BatchEnableAlarm](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_BatchEnableAlarm.html)
+ [BatchResetAlarm](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_BatchResetAlarm.html)
+ [BatchSnoozeAlarm](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_BatchSnoozeAlarm.html)

------

# 在中管理警报通知 AWS IoT Events
<a name="lambda-support"></a>

AWS IoT Events 与 Lambda 集成，提供自定义事件处理功能。本节探讨如何在探 AWS IoT Events 测器模型中使用 Lambda 函数，使您能够执行复杂逻辑、与外部服务交互以及实现复杂的事件处理。

AWS IoT Events 使用 Lambda 函数来管理警报通知。您可以使用提供的 Lambda 函数， AWS IoT Events 也可以创建一个新的函数。

**Topics**
+ [在中创建 Lambda 函数 AWS IoT Events](alarms-create-lambda.md)
+ [使用由提供的 Lambda 函数 AWS IoT Events](use-alarm-notifications.md)
+ [在中管理警报收件人的 IAM 身份中心访问权限 AWS IoT Events](sso-authorization-recipients.md)

# 在中创建 Lambda 函数 AWS IoT Events
<a name="alarms-create-lambda"></a>

AWS IoT Events 提供了 Lambda 函数，使警报能够发送和接收电子邮件和短信通知。

## 要求
<a name="alarms-lambda-requirements"></a>

为警报创建 Lambda 函数时应遵循以下要求：
+ 如果您的警报发送短信通知，请确保将 Amazon SNS 配置为发送短信。
  + 有关更多信息，请参阅以下文档：
    + 亚马逊*简单*[通知服务开发者指南中使用亚马逊 SNS 和 O [rigination 身份发送亚马逊 SNS 短信](https://docs.aws.amazon.com/sns/latest/dg/channels-sms-originating-identities.html)的移动](https://docs.aws.amazon.com/sns/latest/dg/sns-mobile-phone-number-as-subscriber.html)短信。
    + [什么是 AWS 最终用户消息短信？](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-sms-mms.html) 在《*AWS SMS 用户指南》*中。
+ 如果您的警报发送电子邮件或短信通知，则您必须具有允许 AWS Lambda 使用 Amazon SES 和 Amazon SNS 的 IAM 角色。

  

  示例策略：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "ses:GetIdentityVerificationAttributes",
                  "ses:SendEmail",
                  "ses:VerifyEmailIdentity"
              ],
              "Resource": "*"
          },
          {
              "Effect": "Allow",
              "Action": [
                  "sns:Publish",
                  "sns:OptInPhoneNumber",
                  "sns:CheckIfPhoneNumberIsOptedOut",
                  "sms-voice:DescribeOptedOutNumbers"
              ],
              "Resource": "*"
          },
          {
              "Effect": "Deny",
              "Action": "sns:Publish",
              "Resource": "arn:aws:sns:*:*:*"
          },
          {
            "Effect" : "Allow",
            "Action" : [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ],
            "Resource" : "*"
          }
      ]
  }
  ```

------
+ 必须为 AWS IoT Events 和选择相同的 AWS 区域 AWS Lambda。有关支持的区域列表，请参阅 *Amazon Web Services 一般参考* 中的[AWS IoT Events 端点和配额](https://docs.aws.amazon.com/general/latest/gr/iot-events.html)以及[AWS Lambda 端点和配额](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html)。

# 部署 Lambda 函数以供使用 AWS IoT Events CloudFormation
<a name="alarms-create-lambda-cfn"></a>

本教程使用 CloudFormation 模板部署 Lambda 函数。此模板会自动创建一个 IAM 角色，该角色允许 Lambda 函数与 Amazon SES 和亚马逊 SNS 配合使用。

以下内容向您展示了如何使用 AWS Command Line Interface (AWS CLI) 创建 CloudFormation 堆栈。

1. <a name="install-cli"></a>在设备的终端中，运行`aws --version`以检查您是否安装了 AWS CLI。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新到最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. <a name="configure-cli"></a>运行`aws configure list`以检查您是否 AWS CLI 在包含本教程所有 AWS 资源的 AWS 区域中配置了。有关更多信息，请参阅《*AWS Command Line Interface 用户指南》*中的[使用命令设置和查看配置设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods)

1. 下载 CloudFormation 模板 notificationLambda.templat [e.yaml.zip。](samples/notificationLambda.template.yaml.zip)
**注意**  
如果您在下载文件时遇到困难，也可以在 [CloudFormation 模板](alarms-create-lambda.md#cfn-template) 中找到该模板。

1. 解压缩内容并将其作为 `notificationLambda.template.yaml` 保存在本地。

1. 在您的设备上打开终端，导航到下载了 `notificationLambda.template.yaml` 文件的目录。

1. 要创建 CloudFormation 堆栈，请运行以下命令：

   ```
   aws cloudformation create-stack --stack-name notificationLambda-stack --template-body file://notificationLambda.template.yaml --capabilities CAPABILITY_IAM
   ```

您可以修改此 CloudFormation 模板以自定义 Lambda 函数及其行为。

**注意**  
AWS Lambda 重试函数错误两次。如果该函数没有足够的容量来处理所有传入请求，则事件可能会在队列中等待数小时或数天才能发送到该函数。您可以在函数上配置未送达消息队列 (DLQ) 以捕获未成功处理的事件。有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的[异步调用](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html)。

您也可以在 CloudFormation 控制台中创建或配置堆栈。有关更多信息，请参阅 *AWS CloudFormation 用户指南*中的[使用堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html)。

# 为创建自定义 Lambda 函数 AWS IoT Events
<a name="alarms-create-custom-lambda"></a>

您可以创建 Lambda 函数或修改 AWS IoT Events提供的函数。

创建自定义 Lambda 函数时应遵循以下要求。
+ 添加允许您的 Lambda 函数执行指定操作和访问 AWS 资源的权限。
+ 如果您使用提供的 Lambda 函数 AWS IoT Events，请务必选择 Python 3.7 运行时。

Lambda 函数示例：

```
import boto3
import json
import logging
import datetime
logger = logging.getLogger()
logger.setLevel(logging.INFO)
ses = boto3.client('ses')
sns = boto3.client('sns')
def check_value(target):
  if target:
    return True
  return False

# Check whether email is verified. Only verified emails are allowed to send emails to or from.
def check_email(email):
  if not check_value(email):
    return False
  result = ses.get_identity_verification_attributes(Identities=[email])
  attr = result['VerificationAttributes']
  if (email not in attr or attr[email]['VerificationStatus'] != 'Success'):
      logging.info('Verification email for {} sent. You must have all the emails verified before sending email.'.format(email))
      ses.verify_email_identity(EmailAddress=email)
      return False
  return True

# Check whether the phone holder has opted out of receiving SMS messages from your account
def check_phone_number(phone_number):
  try:
    result = sns.check_if_phone_number_is_opted_out(phoneNumber=phone_number)
    if (result['isOptedOut']):
        logger.info('phoneNumber {} is not opt in of receiving SMS messages. Phone number must be opt in first.'.format(phone_number))
        return False
    return True
  except Exception as e:
    logging.error('Your phone number {} must be in E.164 format in SSO. Exception thrown: {}'.format(phone_number, e))
    return False

def check_emails(emails):
  result = True
  for email in emails:
      if not check_email(email):
          result = False
  return result

def lambda_handler(event, context):
  logging.info('Received event: ' + json.dumps(event))
  nep = json.loads(event.get('notificationEventPayload'))
  alarm_state = nep['alarmState']
  default_msg = 'Alarm ' + alarm_state['stateName'] + '\n'
  timestamp = datetime.datetime.utcfromtimestamp(float(nep['stateUpdateTime'])/1000).strftime('%Y-%m-%d %H:%M:%S')
  alarm_msg = "{} {} {} at {} UTC ".format(nep['alarmModelName'], nep.get('keyValue', 'Singleton'), alarm_state['stateName'], timestamp)
  default_msg += 'Sev: ' + str(nep['severity']) + '\n'
  if (alarm_state['ruleEvaluation']):
    property = alarm_state['ruleEvaluation']['simpleRule']['inputProperty']
    default_msg += 'Current Value: ' + str(property) + '\n'
    operator = alarm_state['ruleEvaluation']['simpleRule']['operator']
    threshold = alarm_state['ruleEvaluation']['simpleRule']['threshold']
    alarm_msg += '({} {} {})'.format(str(property), operator, str(threshold))
  default_msg += alarm_msg + '\n'

  emails = event.get('emailConfigurations', [])
  logger.info('Start Sending Emails')
  for email in emails:
    from_adr = email.get('from')
    to_adrs = email.get('to', [])
    cc_adrs = email.get('cc', [])
    bcc_adrs = email.get('bcc', [])
    msg = default_msg + '\n' + email.get('additionalMessage', '')
    subject = email.get('subject', alarm_msg)
    fa_ver = check_email(from_adr)
    tas_ver = check_emails(to_adrs)
    ccas_ver = check_emails(cc_adrs)
    bccas_ver = check_emails(bcc_adrs)
    if (fa_ver and tas_ver and ccas_ver and bccas_ver):
      ses.send_email(Source=from_adr,
                     Destination={'ToAddresses': to_adrs, 'CcAddresses': cc_adrs, 'BccAddresses': bcc_adrs},
                     Message={'Subject': {'Data': subject}, 'Body': {'Text': {'Data': msg}}})
      logger.info('Emails have been sent')

  logger.info('Start Sending SNS message to SMS')
  sns_configs = event.get('smsConfigurations', [])
  for sns_config in sns_configs:
    sns_msg = default_msg + '\n' + sns_config.get('additionalMessage', '')
    phone_numbers = sns_config.get('phoneNumbers', [])
    sender_id = sns_config.get('senderId')
    for phone_number in phone_numbers:
        if check_phone_number(phone_number):
          if check_value(sender_id):
            sns.publish(PhoneNumber=phone_number, Message=sns_msg, MessageAttributes={'AWS.SNS.SMS.SenderID':{'DataType': 'String','StringValue': sender_id}})
          else:
            sns.publish(PhoneNumber=phone_number, Message=sns_msg)
          logger.info('SNS messages have been sent')
```

有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的[什么是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)

## CloudFormation 模板
<a name="cfn-template"></a>

使用以下 CloudFormation 模板创建您的 Lambda 函数。

```
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Notification Lambda for Alarm Model'
Resources:
  NotificationLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      Path: "/"
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AWSLambdaExecute'
      Policies:
        - PolicyName: "NotificationLambda"
          PolicyDocument:
            Version: "2012-10-17"		 	 	 
            Statement:
              - Effect: "Allow"
                Action:
                  - "ses:GetIdentityVerificationAttributes"
                  - "ses:SendEmail"
                  - "ses:VerifyEmailIdentity"
                Resource: "*"
              - Effect: "Allow"
                Action:
                  - "sns:Publish"
                  - "sns:OptInPhoneNumber"
                  - "sns:CheckIfPhoneNumberIsOptedOut"
                  - "sms-voice:DescribeOptedOutNumbers"
                Resource: "*"
              - Effect: "Deny"
                Action:
                  - "sns:Publish"
                Resource: "arn:aws:sns:*:*:*"
  NotificationLambdaFunction:              
    Type: AWS::Lambda::Function
    Properties:
      Role: !GetAtt NotificationLambdaRole.Arn
      Runtime: python3.7
      Handler: index.lambda_handler
      Timeout: 300
      MemorySize: 3008
      Code:
        ZipFile: |
          import boto3
          import json
          import logging
          import datetime
          logger = logging.getLogger()
          logger.setLevel(logging.INFO)
          ses = boto3.client('ses')
          sns = boto3.client('sns')
          def check_value(target):
            if target:
              return True
            return False

          # Check whether email is verified. Only verified emails are allowed to send emails to or from.
          def check_email(email):
            if not check_value(email):
              return False
            result = ses.get_identity_verification_attributes(Identities=[email])
            attr = result['VerificationAttributes']
            if (email not in attr or attr[email]['VerificationStatus'] != 'Success'):
                logging.info('Verification email for {} sent. You must have all the emails verified before sending email.'.format(email))
                ses.verify_email_identity(EmailAddress=email)
                return False
            return True

          # Check whether the phone holder has opted out of receiving SMS messages from your account
          def check_phone_number(phone_number):
            try:
              result = sns.check_if_phone_number_is_opted_out(phoneNumber=phone_number)
              if (result['isOptedOut']):
                  logger.info('phoneNumber {} is not opt in of receiving SMS messages. Phone number must be opt in first.'.format(phone_number))
                  return False
              return True
            except Exception as e:
              logging.error('Your phone number {} must be in E.164 format in SSO. Exception thrown: {}'.format(phone_number, e))
              return False

          def check_emails(emails):
            result = True
            for email in emails:
                if not check_email(email):
                    result = False
            return result

          def lambda_handler(event, context):
            logging.info('Received event: ' + json.dumps(event))
            nep = json.loads(event.get('notificationEventPayload'))
            alarm_state = nep['alarmState']
            default_msg = 'Alarm ' + alarm_state['stateName'] + '\n'
            timestamp = datetime.datetime.utcfromtimestamp(float(nep['stateUpdateTime'])/1000).strftime('%Y-%m-%d %H:%M:%S')
            alarm_msg = "{} {} {} at {} UTC ".format(nep['alarmModelName'], nep.get('keyValue', 'Singleton'), alarm_state['stateName'], timestamp)
            default_msg += 'Sev: ' + str(nep['severity']) + '\n'
            if (alarm_state['ruleEvaluation']):
              property = alarm_state['ruleEvaluation']['simpleRule']['inputProperty']
              default_msg += 'Current Value: ' + str(property) + '\n'
              operator = alarm_state['ruleEvaluation']['simpleRule']['operator']
              threshold = alarm_state['ruleEvaluation']['simpleRule']['threshold']
              alarm_msg += '({} {} {})'.format(str(property), operator, str(threshold))
            default_msg += alarm_msg + '\n'

            emails = event.get('emailConfigurations', [])
            logger.info('Start Sending Emails')
            for email in emails:
              from_adr = email.get('from')
              to_adrs = email.get('to', [])
              cc_adrs = email.get('cc', [])
              bcc_adrs = email.get('bcc', [])
              msg = default_msg + '\n' + email.get('additionalMessage', '')
              subject = email.get('subject', alarm_msg)
              fa_ver = check_email(from_adr)
              tas_ver = check_emails(to_adrs)
              ccas_ver = check_emails(cc_adrs)
              bccas_ver = check_emails(bcc_adrs)
              if (fa_ver and tas_ver and ccas_ver and bccas_ver):
                ses.send_email(Source=from_adr,
                               Destination={'ToAddresses': to_adrs, 'CcAddresses': cc_adrs, 'BccAddresses': bcc_adrs},
                               Message={'Subject': {'Data': subject}, 'Body': {'Text': {'Data': msg}}})
                logger.info('Emails have been sent')

            logger.info('Start Sending SNS message to SMS')
            sns_configs = event.get('smsConfigurations', [])
            for sns_config in sns_configs:
              sns_msg = default_msg + '\n' + sns_config.get('additionalMessage', '')
              phone_numbers = sns_config.get('phoneNumbers', [])
              sender_id = sns_config.get('senderId')
              for phone_number in phone_numbers:
                  if check_phone_number(phone_number):
                    if check_value(sender_id):
                      sns.publish(PhoneNumber=phone_number, Message=sns_msg, MessageAttributes={'AWS.SNS.SMS.SenderID':{'DataType': 'String','StringValue': sender_id}})
                    else:
                      sns.publish(PhoneNumber=phone_number, Message=sns_msg)
                    logger.info('SNS messages have been sent')
```

# 使用由提供的 Lambda 函数 AWS IoT Events
<a name="use-alarm-notifications"></a>

 AWS IoT Events 对于警报通知，您可以使用提供的 Lambda 函数来管理警报通知。

当您使用 AWS IoT Events 提供的 Lambda 函数来管理警报通知时，应遵循以下要求：
+ 您必须验证在 Amazon Simple Email Service (Amazon SES) 中发送电子邮件通知的电子邮件地址。有关更多信息，请参阅《Amazon Simple Email Service 开发人员指南》**中的[验证电子邮件地址身份](https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#just-verify-email-proc)。

  如果您收到验证链接，请单击该链接以验证您的电子邮件地址。您也可以查看垃圾邮件文件夹中是否有验证邮件。
+ 如果您的警报发送短信通知，则必须使用 E.164 国际电话号码格式作为电话号码。此格式包含 `+<country-calling-code><area-code><phone-number>`。

  电话号码示例：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iotevents/latest/developerguide/use-alarm-notifications.html)

  要查找国家/地区呼叫码，请访问 [countrycode.org](https://countrycode.org/)。

  提供的 Lambda 函数 AWS IoT Events 会检查您是否使用 E.164 格式的电话号码。但是，它不验证电话号码。如果您确保输入了准确的电话号码，但没有收到短信通知，则可以联系电话运营商。运营商可能会屏蔽消息。

# 在中管理警报收件人的 IAM 身份中心访问权限 AWS IoT Events
<a name="sso-authorization-recipients"></a>

AWS IoT Events AWS IAM Identity Center 用于管理警报接收者的 SSO 访问权限。为 AWS IoT Events 通知收件人实施 IAM 身份中心可以增强安全性和用户体验。要使警报能够向收件人发送通知，您必须启用 IAM Identity Center 并将收件人添加到您的 IAM Identity Center 存储。有关更多信息，请参阅*《AWS IAM Identity Center 用户指南》*中的[添加用户](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html)。

**重要**  
您必须为 AWS IoT Events AWS Lambda、和 IAM 身份中心选择相同的 AWS 区域。
AWS Organizations 一次仅支持一个 IAM 身份中心区域。如果您想在其他区域提供 IAM Identity Center，则必须先删除当前的 IAM Identity Center 配置。有关更多信息，请参阅*《AWS IAM Identity Center 用户指南》*中的[IAM Identity Center 区域数据](https://docs.aws.amazon.com/singlesignon/latest/userguide/regions.html#region-data)。