【问题标题】:AWS: Publish SNS message for Lambda function via boto3 (Python2)AWS:通过 boto3 (Python2) 为 Lambda 函数发布 SNS 消息
【发布时间】:2016-03-05 21:33:08
【问题描述】:

我正在尝试发布到 SNS 主题,然后该主题将通知 Lambda 函数以及 SQS 队列。我的 Lambda 函数确实被调用,但 CloudWatch 日志表明我的“事件”对象为无。 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)
)

【问题讨论】:

  • 如果您尝试向不同类型的订阅者发送不同的消息(例如电子邮件与 SMS),则只需要 MessageStructure 参数。您能否包含您的 Lambda 函数的代码?我假设上面显示的代码没有任何错误,对吧?
  • 如果您在 EC2 实例上使用 Python SDK 运行它,请不要忘记在客户端内添加区域,例如 client = boto3.client('sns', region_name='us-east-1') bradmontgomery.net/blog/…

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


【解决方案1】:

您需要在消息负载中添加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'
)

【讨论】:

  • 您的示例不包含默认值
  • 确定是这样 - 它在传递给 Message arg 的字典中。
  • 我不明白你的消息对象在 foo bar 方面是什么。什么是真实的例子? message = {"body": "Hello World!"}?
  • 如果您在 EC2 实例上使用 Python SDK 运行它,请不要忘记在客户端内添加区域,例如 client = boto3.client('sns', region_name='us-east-1') bradmontgomery.net/blog/…
  • 嗨@RyanTuck,我想知道如果我们想向SQS 发送SNS 消息是否需要这样做?我知道根据 AWS 指令,为了发送 json 消息,我们可能需要添加 MessageStructure。但即使没有这个,消息体的最终结果对于 SQS 仍然是一样的。
【解决方案2】:

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

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

【讨论】:

  • 如果您在 EC2 实例上使用 Python SDK 运行此程序,请不要忘记在客户端内添加区域,例如 client = boto3.client('sns', region_name='us-east-1')bradmontgomery.net/blog/…
  • 在我的情况下提供完整的帮助
【解决方案3】:

如果您使用过滤策略发布消息,您还应该使用 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'
                        }
                    },
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 2021-10-18
    • 2023-03-18
    • 2019-01-28
    • 2015-10-12
    • 2020-03-27
    • 2021-09-14
    • 2015-11-16
    相关资源
    最近更新 更多