

终止支持通知：2026 年 10 月 7 日， AWS 将停止对的支持。 AWS IoT Greengrass Version 1 2026 年 10 月 7 日之后，您将无法再访问这些 AWS IoT Greengrass V1 资源。如需了解更多信息，请访问[迁移自 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# SNS 连接器
<a name="sns-connector"></a>

SNS [连接器](connectors.md)将消息发布到 Amazon SNS 主题。这使 Web 服务器、电子邮件地址和其他消息订阅者能够响应 Greengrass 组中的事件。

该连接器接收关于 MQTT 主题的 SNS 消息信息，然后将消息发送到指定的 SNS 主题。您可以视情况使用自定义 Lambda 函数对消息实施筛选或格式化逻辑，然后再将消息发布到该连接器。

此连接器具有以下版本。


| 版本 | 进行筛选 | 
| --- | --- | 
| 4 | `arn:aws:greengrass:{{region}}::/connectors/SNS/versions/4` | 
| 3 | `arn:aws:greengrass:{{region}}::/connectors/SNS/versions/3` | 
| 2 | `arn:aws:greengrass:{{region}}::/connectors/SNS/versions/2` | 
| 1 | `arn:aws:greengrass:{{region}}::/connectors/SNS/versions/1` | 

有关版本更改的信息，请参阅[更改日志](#sns-connector-changelog)。

## 要求
<a name="sns-connector-req"></a>

此连接器具有以下要求：

------
#### [ Version 3 - 4 ]
+ <a name="conn-req-ggc-v1.9.3"></a>AWS IoT Greengrass 核心软件 v1.9.3 或更高版本。
+ <a name="conn-req-py-3.7-and-3.8"></a>[Python](https://www.python.org/) 版本 3.7 或 3.8 已安装在核心设备上，并已添加到 PATH 环境变量中。
**注意**  <a name="use-runtime-py3.8"></a>
要使用 Python 3.8，请运行以下命令来创建从默认 Python 3.7 安装文件夹到已安装的 Python 3.8 二进制文件的符号链接。  

  ```
  sudo ln -s {{path-to-python-3.8}}/python3.8 /usr/bin/python3.7
  ```
这会将设备配置为满足 AWS IoT Greengrass的 Python 要求。
+ <a name="conn-sns-req-sns-config"></a>配置的 SNS 主题。有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[创建 Amazon SNS 主题](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)。
+ <a name="conn-sns-req-iam-policy"></a>配置为允许在目标 SNStopic亚马逊上`sns:Publish`执行操作的 [Greengrass 组](group-role.md)角色，如以下示例 IAM 策略所示。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "Stmt1528133056761",
              "Action": [
                  "sns:Publish"
              ],
              "Effect": "Allow",
              "Resource": [
              "arn:aws:sns:{{us-east-1}}:{{123456789012}}:{{topic-name}}"
              ]
          }
      ]
  }
  ```

------

  利用该连接器，您可以动态覆盖输入消息负载中的默认主题。如果您的实施使用此功能，IAM policy 必须允许对所有目标主题的 `sns:Publish` 权限。您可以授予对资源的具体或条件访问权限（例如，通过使用通配符\*命名方案）。

  <a name="set-up-group-role"></a>对于组角色要求，您必须将角色配置为授予所需权限，并确保角色已添加到组中。有关更多信息，请参阅[管理 Greengrass 组角色（控制台）](group-role.md#manage-group-role-console)或[管理 Greengrass 组角色 (CLI)](group-role.md#manage-group-role-cli)。

------
#### [ Versions 1 - 2 ]
+ <a name="conn-req-ggc-v1.7.0"></a>AWS IoT Greengrass 核心软件 v1.7 或更高版本。
+ [Python](https://www.python.org/) 版本 2.7 已安装在核心设备上，并已添加到 PATH 环境变量中。
+ <a name="conn-sns-req-sns-config"></a>配置的 SNS 主题。有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[创建 Amazon SNS 主题](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)。
+ <a name="conn-sns-req-iam-policy"></a>配置为允许在目标 SNStopic亚马逊上`sns:Publish`执行操作的 [Greengrass 组](group-role.md)角色，如以下示例 IAM 策略所示。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "Stmt1528133056761",
              "Action": [
                  "sns:Publish"
              ],
              "Effect": "Allow",
              "Resource": [
              "arn:aws:sns:{{us-east-1}}:{{123456789012}}:{{topic-name}}"
              ]
          }
      ]
  }
  ```

------

  利用该连接器，您可以动态覆盖输入消息负载中的默认主题。如果您的实施使用此功能，IAM policy 必须允许对所有目标主题的 `sns:Publish` 权限。您可以授予对资源的具体或条件访问权限（例如，通过使用通配符\*命名方案）。

  <a name="set-up-group-role"></a>对于组角色要求，您必须将角色配置为授予所需权限，并确保角色已添加到组中。有关更多信息，请参阅[管理 Greengrass 组角色（控制台）](group-role.md#manage-group-role-console)或[管理 Greengrass 组角色 (CLI)](group-role.md#manage-group-role-cli)。

------

## 连接器参数
<a name="sns-connector-param"></a>

该连接器提供以下参数：

------
#### [ Version 4 ]

`DefaultSNSArn`  <a name="sns-DefaultSNSArn"></a>
要将消息发布到的默认 SNS 主题的 ARN。目标主题可由输入消息负载中的 `sns_topic_arn` 属性覆盖。  
该组角色必须允许对所有目标主题的 `sns:Publish` 权限。有关更多信息，请参阅 [要求](#sns-connector-req)。
在 AWS IoT 控制台中显示名称：**默认 SNS 主题 ARN**  
必需：`true`  
类型：`string`  
有效模式：`arn:aws:sns:([a-z]{2}-[a-z]+-\d{1}):(\d{12}):([a-zA-Z0-9-_]+)$`

`IsolationMode`  <a name="IsolationMode"></a>
此连接器的[容器化](connectors.md#connector-containerization)模式。默认值为`GreengrassContainer`，这意味着连接器在 AWS IoT Greengrass 容器内的隔离运行时环境中运行。  
组的默认容器化设置不适用于连接器。
 AWS IoT 控制台中的显示名称：**容器隔离模式**  
必需：`false`  
类型：`string`  
有效值：`GreengrassContainer` 或 `NoContainer`  
有效模式：`^NoContainer$|^GreengrassContainer$`

------
#### [ Versions 1 - 3 ]

`DefaultSNSArn`  <a name="sns-DefaultSNSArn"></a>
要将消息发布到的默认 SNS 主题的 ARN。目标主题可由输入消息负载中的 `sns_topic_arn` 属性覆盖。  
该组角色必须允许对所有目标主题的 `sns:Publish` 权限。有关更多信息，请参阅 [要求](#sns-connector-req)。
在 AWS IoT 控制台中显示名称：**默认 SNS 主题 ARN**  
必需：`true`  
类型：`string`  
有效模式：`arn:aws:sns:([a-z]{2}-[a-z]+-\d{1}):(\d{12}):([a-zA-Z0-9-_]+)$`

------

### 创建连接器示例 (AWS CLI)
<a name="sns-connector-create"></a>

以下 CLI 命令创建一个 `ConnectorDefinition`，其初始版本包含 SNS 连接器。

```
aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{
    "Connectors": [
        {
            "Id": "MySNSConnector",
            "ConnectorArn": "arn:aws:greengrass:{{region}}::/connectors/SNS/versions/4",
            "Parameters": {
                "DefaultSNSArn": "arn:aws:sns:{{region}}:{{account-id}}:topic-name",
                "IsolationMode" : "GreengrassContainer"
            }
        }
    ]
}'
```

在 AWS IoT Greengrass 控制台中，您可以从群组的 “连接器” 页面添加**连接器**。有关更多信息，请参阅 [Greengrass 连接器入门（控制台）](connectors-console.md)。

## 输入数据
<a name="sns-connector-data-input"></a>

此连接器接受关于 MQTT 主题的 SNS 消息信息，然后将信息按原样发布到目标 SNS 主题。输入消息必须采用 JSON 格式。

<a name="topic-filter"></a>**订阅中的主题筛选条件**  
`sns/message`

**消息属性**    
`request`  
有关要发送到 SNS 主题的消息的信息。  
必需：`true`  
类型：包含以下属性的 `object`：    
`message`  
字符串或 JSON 格式的消息内容。有关示例，请参阅[示例输入](#sns-connector-data-input-example)。  
要发送 JSON，必须将 `message_structure` 属性设置为 `json`，并且消息必须是包含 `default` 密钥的字符串编码的 JSON 对象。  
必需：`true`  
类型：`string`  
有效模式：`.*`  
`subject`  
消息主题。  
必需：`false`  
类型：ASCII 文本，最多 100 个字符。必须以字母、数字或标点符号开头。不得包含换行符或控制字符。  
有效模式：`.*`  
`sns_topic_arn`  
要将消息发布到的 SNS 主题的 ARN。如果指定，则连接器将发布到该主题，而不是默认的主题。  
该组角色必须允许对任何目标主题的 `sns:Publish` 权限。有关更多信息，请参阅 [要求](#sns-connector-req)。
必需：`false`  
类型：`string`  
有效模式：`arn:aws:sns:([a-z]{2}-[a-z]+-\d{1}):(\d{12}):([a-zA-Z0-9-_]+)$`  
`message_structure`  
消息结构。  
必需：`false`。要发送 JSON 消息，必须指定此属性。  
类型：`string`  
有效值：`json`  
`id`  
请求的任意 ID。此属性用于将输入请求映射到输出响应。如果指定，响应对象中的 `id` 属性将设置为该值。如果您不使用此功能，可以忽略此属性或指定空字符串。  
必需：`false`  
类型：`string`  
有效模式：`.*`

**限制**  
消息大小受最大 SNS 消息大小 (256 KB) 的限制。

**示例输入：字符串消息**  <a name="sns-connector-data-input-example"></a>
此示例发送一条字符串消息。它指定可选的 `sns_topic_arn` 属性，该属性会覆盖默认目标主题。  

```
{
    "request": {
        "subject": "Message subject",
        "message": "Message data",
        "sns_topic_arn": "arn:aws:sns:{{region}}:{{account-id}}:topic2-name"
    },
    "id": "request123"
}
```

**示例输入：JSON 消息**  
此示例以包含 `default` 密钥的字符串编码的 JSON 对象形式发送消息。  

```
{
    "request": {
        "subject": "Message subject",
        "message": "{ \"default\": \"Message data\" }",
        "message_structure": "json"
    },
    "id": "request123"
}
```

## 输出数据
<a name="sns-connector-data-output"></a>

此连接器将状态信息发布为 MQTT 主题的输出数据。

<a name="topic-filter"></a>**订阅中的主题筛选条件**  
`sns/message/status`

**示例输出：成功**  

```
{
    "response": {
        "sns_message_id": "f80a81bc-f44c-56f2-a0f0-d5af6a727c8a",
        "status": "success"
    },
    "id": "request123"
}
```

**示例输出：失败**  

```
{
   "response" : {
        "error": "InvalidInputException",
        "error_message": "SNS Topic Arn is invalid",
        "status": "fail"
   },
   "id": "request123"
}
```

## 用法示例
<a name="sns-connector-usage"></a>

<a name="connectors-setup-intro"></a>使用以下概括步骤设置可用于尝试连接器的示例 Python 3.7 Lambda 函数。

**注意**  <a name="connectors-setup-get-started-topics"></a>
如果要使用其他 Python 运行时，您可以创建从 Python3.x 到 Python 3.7 的符号链接。
[连接器入门（控制台）](connectors-console.md) 和 [连接器入门 (CLI)](connectors-cli.md) 主题包含详细步骤，说明如何配置和部署示例 Twilio 通知连接器。

1. 确保满足连接器的[要求](#sns-connector-req)。

   <a name="set-up-group-role"></a>对于组角色要求，您必须将角色配置为授予所需权限，并确保角色已添加到组中。有关更多信息，请参阅[管理 Greengrass 组角色（控制台）](group-role.md#manage-group-role-console)或[管理 Greengrass 组角色 (CLI)](group-role.md#manage-group-role-cli)。

1. <a name="connectors-setup-function"></a>创建并发布将输入数据发送到连接器的 Lambda 函数。

   将[示例代码](#sns-connector-usage-example)保存为 PY 文件。<a name="connectors-setup-function-sdk"></a>下载并解压[适用于 Python 的AWS IoT Greengrass Core 软件开发工具包](lambda-functions.md#lambda-sdks-core)。然后，创建一个 zip 包，其中在根级别包含 PY 文件和 `greengrasssdk` 文件夹。此 zip 包是您上传到 AWS Lambda的部署包。

   <a name="connectors-setup-function-publish"></a>创建 Python 3.7 Lambda 函数后，请发布函数版本并创建别名。

1. 配置 Greengrass 组。

   1. <a name="connectors-setup-gg-function"></a>通过别名来添加 Lambda 函数（推荐）。将 Lambda 生命周期配置为长时间生存（或在 CLI 中设置为 `"Pinned": true`）。

   1. 添加连接器并配置其[参数](#sns-connector-param)。

   1. 添加允许连接器接收[输入数据](#sns-connector-data-input)并针对支持的主题筛选条件发送[输出数据](#sns-connector-data-output)的订阅。
      + <a name="connectors-setup-subscription-input-data"></a>将 Lambda 函数设置为源，将连接器设置为目标，并使用支持的输入主题筛选条件。
      + <a name="connectors-setup-subscription-output-data"></a>将连接器设置为源，将 AWS IoT Core 设置为目标，并使用支持的输出主题筛选条件。您可以使用此订阅在 AWS IoT 控制台中查看状态消息。

1. <a name="connectors-setup-deploy-group"></a>部署组。

1. <a name="connectors-setup-test-sub"></a>在 AWS IoT 控制台的 “**测试**” 页面上，订阅输出数据主题以查看来自连接器的状态消息。示例 Lambda 函数是长时间生存的，并且在部署组后立即开始发送消息。

   完成测试后，您可以将 Lambda 生命周期设置为按需（或在 CLI 中设置为 `"Pinned": false`）并部署组。这会阻止函数发送消息。

### 示例
<a name="sns-connector-usage-example"></a>

以下示例 Lambda 函数向连接器发送一条输入消息。

```
import greengrasssdk
import time
import json

iot_client = greengrasssdk.client('iot-data')
send_topic = 'sns/message'

def create_request_with_all_fields():
    return  {
        "request": {
            "message": "Message from SNS Connector Test"
        },
        "id" : "req_123"
    }

def publish_basic_message():
    messageToPublish = create_request_with_all_fields()
    print("Message To Publish: ", messageToPublish)
    iot_client.publish(topic=send_topic,
        payload=json.dumps(messageToPublish))

publish_basic_message()

def lambda_handler(event, context):
    return
```

## 许可证
<a name="sns-connector-license"></a>

SNS 连接器包含以下第三方软件/许可：<a name="boto-3-licenses"></a>
+ [适用于 Python (Boto3) 的 AWS SDK](https://pypi.org/project/boto3/)/Apache 许可证 2.0
+ [botocore](https://pypi.org/project/botocore/)/Apache 许可证 2.0
+ [dateutil](https://pypi.org/project/python-dateutil/1.4/)/PSF 许可证
+ [docutils](https://pypi.org/project/docutils/)/BSD 许可证，GNU 通用公共许可证 (GPL)，Python 软件基金会许可证，公共领域
+ [jmespath](https://pypi.org/project/jmespath/)/MIT 许可证
+ [s3transfer](https://pypi.org/project/s3transfer/)/Apache 许可证 2.0
+ [urllib3](https://pypi.org/project/urllib3/)/MIT 许可证

该连接器在 [Greengrass Core 软件许可协议](https://greengrass-release-license.s3.us-west-2.amazonaws.com/greengrass-license-v1.pdf)下发布。

## 更改日志
<a name="sns-connector-changelog"></a>

下表介绍每个版本连接器的更改。


| 版本 | 更改 | 
| --- | --- | 
| 4 | <a name="isolation-mode-changelog"></a>增加了用于配置连接器容器化模式的 `IsolationMode` 参数。 | 
| 3 | <a name="upgrade-runtime-py3.7"></a>已将 Lambda 运行时升级到 Python 3.7，这会更改运行时要求。 | 
| 2 | 进行了修复，以减少过多的日志记录。 | 
| 1 | 初始版本。  | 

<a name="one-conn-version"></a>Greengrass 组在一个时间上只能包含一个版本的连接器。有关升级连接器版本的信息，请参阅[升级连接器版本](connectors.md#upgrade-connector-versions)。

## 另请参阅
<a name="sns-connector-see-also"></a>
+ [使用 Greengrass 连接器与服务和协议集成](connectors.md)
+ [Greengrass 连接器入门（控制台）](connectors-console.md)
+ [Greengrass 连接器入门 (CLI)](connectors-cli.md)
+ Boto 3 文档中的[发布操作](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#SNS.Client.publish)
+ *《Amazon Simple Notification Service 开发人员指南》*中的[什么是 Amazon Simple Notification Service？](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)