【问题标题】:boto3 publish message in SNSboto3 在 SNS 中发布消息
【发布时间】:2019-12-03 11:37:35
【问题描述】:

我想运行一个脚本来向我的 sns 主题发布消息。我遵循了文档,我的代码是这样的:

import boto3

client = boto3.client('sns')

response = client.publish(
    TopicArn='my topic arn',    
    Message='ptt message '
)
print("Response: {}".format(response))

它会打印响应 json,但在我的 AWS SNS 控制台中没有看到任何消息。作为这个 sns 的订阅者,我有一个非常基本的 lambda 函数。

lambda 代码:

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
         'body': json.dumps('Hello from Lambda!') 
    }

如何确定我的消息“ptt message”已成功发布?如何查看?

【问题讨论】:

    标签: amazon-web-services amazon-sns


    【解决方案1】:

    对于集成测试,您可以为您的 SNS 主题配置交付状态日志记录。在 SNS 的 GUI 中有一个简单的设置。这会将订阅触发器的日志导出到 CloudWatch。

    其次,您的 Lambda 没有对事件执行任何操作,因此您的“ptt 消息保留在“事件”字典中。例如,您可以记录您的事件并查看实际消息正文所在的结构。

    import logging
    
    def lambda_handler(event, context):
        logging.info(event)
        ...
    

    为了查看 Lambda 是由订阅触发的,您可以打开 CloudWatch Logs,找到 AWS 为您的 Lambda 自动创建的 LogGroup(其中包含函数的名称)并搜索 Log Group。 “最后 X 分钟” 有舒适的过滤器。

    为了测试这种集成,如果感觉比运行脚本更方便,您还可以从 Web 界面将测试消息发布到 SNS 主题。

    【讨论】:

    • 所以我从 Cloudwatch 日志中选择了我的订阅者 lambda 函数,并看到每次发布消息时都会调用 lambda。那是一种解脱。我在我的 lambda 中添加了 logging.info(event)。这个 lambda 函数是否应该通过每次发布消息时触发来显示事件日志?还是我必须自己运行这个功能?
    • 阅读文档后,我了解到订阅者 Lambda 将自行触发并在其中显示日志记录信息或任何其他打印消息,每当我在其上发布消息时。我说的对吗?
    • 你是对的!日志不关心是谁以及如何调用 Lambda:一些触发器(例如 SNS)、Web 界面、boto3 调用或任何其他事件。在日志中,您将看到所有数据。请记住,您需要搜索整个LogGroup,而不是任何特定的LogStream。 Stream 表示您的函数在其中执行的 Lambda 容器,但它由 AWS 管理,因此您永远(几乎永远)不知道您的函数将在哪里运行。任何代码更改(新版本)都会在第一次调用时自动生成新容器。
    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2019-03-19
    • 2018-10-31
    • 2018-04-09
    • 2020-07-08
    相关资源
    最近更新 更多