AWS:通过boto3发布Lambda函数的SNS消息(Python2)

时间:2015-12-01 20:11:49

标签: python-2.7 amazon-sns aws-lambda boto3

我正在尝试发布到SNS主题,然后通知Lambda函数以及SQS队列。我的Lambda函数会被调用,但CloudWatch会记录我的“event”对象是None。 boto3文档声明使用kwarg MessageStructure ='json'但会抛出ClientError。

希望我提供了足够的信息。

示例代码:

import json
import boto3

message = {"foo": "bar"}
client = boto3.client('sns')
response = client.publish(
    TargetArn=arn,
    Message=json.dumps(message)
)

3 个答案:

答案 0 :(得分:50)

您需要在消息有效内容中添加default密钥,并指定MessageStructure

import json
import boto3

message = {"foo": "bar"}
client = boto3.client('sns')
response = client.publish(
    TargetArn=arn,
    Message=json.dumps({'default': json.dumps(message)}),
    MessageStructure='json'
)

答案 1 :(得分:13)

以防您希望为短信和电子邮件订阅者提供不同的消息:

import json
import boto3

message = {"foo": "bar"}
client = boto3.client('sns')
response = client.publish(
    TargetArn=arn,
    Message=json.dumps({'default': json.dumps(message),
                        'sms': 'here a short version of the message',
                        'email': 'here a longer version of the message'}),
    Subject='a short subject for your message',
    MessageStructure='json'
)

答案 2 :(得分:0)

如果您使用过滤器策略发布消息,您还应该使用 MessageAttributes 参数添加您的 SNS 过滤器。

要使用此 SNS 订阅过滤器策略 {"endpoint": ["distance"]} 调用您的 Lambda:

import json
import boto3

message = {"foo": "bar"}
client = boto3.client('sns')
response = client.publish(
    TargetArn=arn,
    Message=json.dumps({'default': json.dumps(message)}),
    MessageStructure='json',
    MessageAttributes={
                        'foo': {
                            'DataType': 'String',
                            'StringValue': 'bar'
                        }
                    },
)