我正在尝试发布到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)
)
答案 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'
}
},
)