AWS: 通过boto3(Python2)发布SNS消息以供Lambda函数使用

50

我正在尝试发布到SNS主题,然后通知一个Lambda函数和一个SQS队列。我的Lambda函数确实被调用了,但CloudWatch日志显示我的"事件"对象为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)
)

1
只有在尝试向不同类型的订阅者发送不同的消息(例如电子邮件与短信)时,才需要使用“MessageStructure”参数。您能否提供Lambda函数的代码?我假设上面显示的代码没有任何错误,对吗? - garnaat
1
如果您正在使用Python SDK在EC2实例上运行此代码,请不要忘记在客户端中添加区域,例如 client = boto3.client('sns', region_name='us-east-1')。https://bradmontgomery.net/blog/sending-sms-messages-amazon-sns-and-python/ - Kyle Bridenstine
3个回答

108

你需要向你的消息有效载荷中添加一个 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
你的例子没有包括默认值。 - Chris Johnson
13
当然可以 - 它在传递给Message参数的字典中。 - ryantuck
3
如果你正在使用Python SDK在EC2实例上运行此代码,请不要忘记在客户端内添加一个区域,例如 client = boto3.client('sns', region_name='us-east-1')。详情请见:https://bradmontgomery.net/blog/sending-sms-messages-amazon-sns-and-python/ - Kyle Bridenstine
嗨 @RyanTuck,我想知道如果我们想要将SNS消息发送到SQS,是否需要执行此操作?根据AWS的说明,我知道为了发送JSON消息,我们可能需要添加MessageStructure。但是即使没有这个,消息体的最终结果对于SQS仍然是相同的。 - addicted
1
@ryantuck 第二个 json.dumps() 有必要吗? - Moshe Rabaev
显示剩余2条评论

42

如果您想为短信和电子邮件订阅者设置不同的消息,可以这样做:

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'
)

4
如果您正在使用Python SDK在EC2实例上运行此代码,请不要忘记在客户端内添加区域,例如 client = boto3.client('sns',region_name='us-east-1')。参考链接:https://bradmontgomery.net/blog/sending-sms-messages-amazon-sns-and-python/ - Kyle Bridenstine
在我的情况下非常有帮助。 - Narendra Maru

5

如果您正在使用筛选器策略发布消息,则还应使用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'
                        }
                    },
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接