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

AWS: Publish SNS message for Lambda function via boto3 (Python2)

我正在尝试发布到 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)
)

您需要将 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'
)

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

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

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

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

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