

支援終止通知：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 警示來監控資產屬性 in AWS IoT SiteWise. AWS IoT SiteWise sends 資產屬性值到 AWS IoT Events alarm. AWS IoT Events send the alarm status to AWS IoT SiteWise。

AWS IoT SiteWise 也支援外部警示。如果您在 外部使用警示， AWS IoT SiteWise 並擁有傳回警示狀態資料的解決方案，您可以選擇外部警示。外部警示包含擷取警示狀態資料的測量屬性。

AWS IoT SiteWise 不會評估外部警示的狀態。此外，您無法在警示狀態變更時確認或休眠外部警示。

您可以使用 SiteWise Monitor 功能，在 SiteWise Monitor 入口網站中檢視外部警示的狀態。

如需詳細資訊，請參閱*AWS IoT SiteWise 《 使用者指南*》中的[使用警示監控資料](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/industrial-alarms.html)，以及《 *SiteWise Monitor 應用程式指南*》中的[使用警示監控](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)之前監控 中的輸入屬性。
  + 如果您選擇監控資產屬性，您必須先在 中[建立資產模型](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-asset-models.html)， AWS IoT SiteWise 才能建立警示模型。
+ 您必須擁有允許警示執行動作和存取 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. 選擇輸入屬性索引鍵。此輸入屬性用作建立與警示金鑰相關聯之 alarm. AWS IoT Events routes 輸入的金鑰。
**重要**  
如果輸入訊息承載不包含此輸入屬性金鑰，或如果金鑰不在金鑰中指定的相同 JSON 路徑中，則訊息將失敗擷取 AWS IoT Events。

1. 在**閾值定義**區段中，您可以定義 AWS IoT Events 用於變更警示狀態的輸入屬性、閾值和比較運算子。

   1. 針對**輸入屬性**，選擇您要監控的屬性。

      每次此輸入屬性收到新資料時，都會進行評估，以判斷警示的狀態。

   1. 針對**運算子**，選擇比較運算子。運算子會將您的輸入屬性與屬性的閾值進行比較。

      您可以從這些選項中選擇：
      + **> 大於**
      + **>= 大於或等於**
      + **< 小於**
      + **<= 小於或等於**
      + **= 等於**
      + **！= 不等於**

   1. 對於閾值****，在 AWS IoT Events input. AWS IoT Events compares 中輸入數字或選擇屬性。將此值與您選擇的輸入屬性值進行比較。

   1. （選用） 對於**嚴重性**，請使用您的團隊理解的數字來反映此警示的嚴重性。

1. （選用） 在**通知設定**區段中，設定警示的通知設定。

   您最多可以新增 10 個通知。對於**通知 1**，請執行下列動作：

   1. 針對**通訊協定**，從下列選項中選擇：
      + **電子郵件和文字** - 警示會傳送簡訊通知和電子郵件通知。
      + **電子郵件** - 警示會傳送電子郵件通知。
      + **文字** - 警示會傳送簡訊通知。

   1. 針對**寄件者**，指定可傳送此警示通知的電子郵件地址。

      若要將更多電子郵件地址新增至寄件者清單，請選擇**新增寄件者**。

   1. （選用） 針對**收件人**，選擇收件人。

      若要將更多使用者新增至收件人清單，請選擇**新增使用者**。您必須先將新使用者新增至 IAM Identity Center 存放區，才能將其新增至警示模型。如需詳細資訊，請參閱[在 中管理警示收件人的 IAM Identity Center 存取權 AWS IoT Events](sso-authorization-recipients.md)。

   1. （選用） 對於**其他自訂訊息**，輸入說明警示偵測到的內容以及收件人應採取的動作的訊息。

1. 在**執行個體**區段中，您可以啟用或停用根據此警示模型建立的所有警示執行個體。

1. 在**進階設定**區段中，執行下列動作：

   1. 對於**確認流程**，您可以啟用或停用通知。
      + 如果您選擇**已啟用**，您會在警示狀態變更時收到通知。您必須先確認通知，警示狀態才能恢復正常。
      + 如果您選擇**已停用**，則不需要採取任何動作。當測量傳回指定範圍時，警示會自動變更為正常狀態。

      如需詳細資訊，請參閱[確認流程](iotevents-alarms.md#acknowledge-flow)。

   1. 針對**許可**，選擇下列其中一個選項：
      + 您可以從** AWS 政策範本建立新的角色**，並 AWS IoT Events 自動為您建立 IAM 角色。
      + 您可以使用**現有的 IAM 角色**，允許此警示模型執行動作並存取其他 AWS 資源。

      如需詳細資訊，請參閱[適用於 AWS IoT Events的 Identity and Access Management](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>

有效回應警示是使用 管理 IoT 系統的重要層面 AWS IoT Events。探索設定和處理警示的各種方式，包括：設定通知管道、定義呈報程序，以及實作自動化回應動作。了解如何建立細微的警示條件、排定警示的優先順序，並與其他 AWS 服務整合，為您的 IoT 應用程式建置回應靈敏的警示管理系統。

如果您啟用[確認流程](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. 選擇 **Snooze 長度**或輸入**自訂 Snooze 長度**。

     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 Identity Center 存取權 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 已設定為傳送簡訊。
  + 如需詳細資訊，請參閱下列 文件：
    + 《[Amazon Simple Notification Service 開發人員指南》中的具有 Amazon SNS ](https://docs.aws.amazon.com/sns/latest/dg/sns-mobile-phone-number-as-subscriber.html)[和 Amazon SNS SMS 訊息來源身分](https://docs.aws.amazon.com/sns/latest/dg/channels-sms-originating-identities.html)的行動簡訊。 **
    + *AWS SMS 《 使用者指南*》中的[什麼是 AWS 最終使用者傳訊 SMS？](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-sms-mms.html)。
+ 如果您的警示傳送電子郵件或簡訊通知，您必須具有允許 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。如需支援的區域清單，請參閱 中的[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)*Amazon Web Services 一般參考*。

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

本教學課程使用 CloudFormation 範本來部署 Lambda 函數。此範本會自動建立 IAM 角色，允許 Lambda 函數使用 Amazon SES 和 Amazon SNS。

以下說明如何使用 AWS Command Line Interface (AWS CLI) 來建立 CloudFormation 堆疊。

1. <a name="install-cli"></a>在裝置的終端機中，執行 `aws --version` 以檢查是否已安裝 AWS CLI。如需詳細資訊，請參閱 *AWS Command Line Interface User Guide* 中的 [Installing or updating to the latest version of the 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.template.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>

透過警示通知，您可以使用 提供的 Lambda 函數 AWS IoT Events 來管理警示通知。

當您使用 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_tw/iotevents/latest/developerguide/use-alarm-notifications.html)

  若要尋找國家/地區呼叫代碼，請前往 https：//[countrycode.org](https://countrycode.org/)。

  提供的 Lambda 函數會 AWS IoT Events 檢查您是否使用 E.164 格式的電話號碼。不過，它不會驗證電話號碼。如果您確定您輸入了正確的電話號碼，但未收到簡訊通知，您可以聯絡電信業者。電信業者可能會封鎖訊息。

# 在 中管理警示收件人的 IAM Identity Center 存取權 AWS IoT Events
<a name="sso-authorization-recipients"></a>

AWS IoT Events 使用 AWS IAM Identity Center 來管理警示收件人的 SSO 存取。為 AWS IoT Events 通知收件人實作 IAM Identity Center 可以增強安全性和使用者體驗。若要啟用警示以傳送通知給收件人，您必須啟用 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 Identity Center 選擇相同的 AWS 區域。
AWS Organizations 一次僅支援一個 IAM Identity Center 區域。如果您想要在不同區域中提供 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)。