

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

# 使用 Step Functions 将消息发布到 Amazon SNS 主题
<a name="connect-sns"></a>

了解如何使用 Step Functions 将消息发布到 Amazon SNS 主题。本页列出了支持的 Amazon SNS API 操作，并提供了向 Amazon SNS 发布消息的示例 `Task` 状态。

要了解如何在 Step Functions 中与AWS服务集成，请参阅[集成 服务](integrate-services.md)和[在 Step Functions 中将参数传递给服务 API](connect-parameters.md)。

**经优化的 Amazon SNS 集成的主要功能**  
没有针对[请求响应](connect-to-resource.md#connect-default)或[等待具有任务令牌的回调](connect-to-resource.md#connect-wait-token)集成模式的特定优化。

下面包括一个向 Amazon Simple Notification Service (Amazon SNS) 主题发布的任务状态。

```
{
 "StartAt": "Publish to SNS",
 "States": {
   "Publish to SNS": {
     "Type": "Task",
     "Resource": "arn:aws:states:::sns:publish",
     "Arguments": {
       "TopicArn": "arn:aws:sns:region:account-id:myTopic",
       "Message": "{% states.input.message %}",
       "MessageAttributes": {
         "my_attribute_no_1": {
           "DataType": "String",
           "StringValue": "value of my_attribute_no_1"
         },
         "my_attribute_no_2": {
           "DataType": "String",
           "StringValue": "value of my_attribute_no_2"
         }
       }
     },
     "End": true
    }
  }
}
```

**传递动态值**。您可以修改上面的示例，以动态传递来自此 JSON 有效负载的属性：

```
{
  "message": "Hello world",
  "SNSDetails": {
    "attribute1": "some value",
    "attribute2": "some other value",
  }
}
```

以下内容使用`StringValue`字段的 JSONata 表达式来设置值：

```
"MessageAttributes": {
  "my_attribute_no_1": {
      "DataType": "String",
      "StringValue": "{% $states.input.SNSDetails.attribute1 %}"
  },
  "my_attribute_no_2": {
      "DataType": "String",
      "StringValue": "{% $states.input.SNSDetails.attribute2 %}"
  }
```

以下内容包括发布 Amazon SNS 主题，然后等待返回任务令牌的 `Task` 状态。请参阅[等待具有任务令牌的回调](connect-to-resource.md#connect-wait-token)。

```
{  
   "StartAt":"Send message to SNS",
   "States":{  
      "Send message to SNS":{  
         "Type":"Task",
         "Resource":"arn:aws:states:::sns:publish.waitForTaskToken",
         "Arguments":{  
            "TopicArn":"arn:aws:sns:region:account-id:myTopic",
            "Message":{  
               "Input":"{% states.input.message %}",
               "TaskToken": "{% $states.context.Task.Token %}"
            }
         },
         "End":true
      }
   }
}
```

## 优化 Amazon SNS APIs
<a name="connect-sns-api"></a>
+ [https://docs.aws.amazon.com/sns/latest/api/API_Publish.html](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)

**中的Step Functions参数表示为 PascalCase**  
即使原生服务 API 在 camelCase 中（例如 API 操作）`startSyncExecution`，您也可以在中指定参数 PascalCase，例如:。`StateMachineArn`

**输入或结果数据的配额**  
在服务之间发送或接收数据时，任务的最大输入或结果为 256 KiB，且需以 UTF-8 编码字符串形式呈现。请参阅[与状态机执行相关的配额](service-quotas.md#service-limits-state-machine-executions)。

## 用于调用 Amazon SNS 的 IAM 策略
<a name="sns-iam"></a>

以下示例模板展示了如何根据状态机定义中的资源AWS Step Functions生成 IAM 策略。有关更多信息，请参阅[Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)和[探索 Step Functions 中的服务集成模式](connect-to-resource.md)。

*静态资源*

****  

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

*基于路径，或发布到 `TargetArn` 或 `PhoneNumber` 的资源*

****  

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