【问题标题】:AWS - Read SQS Message via LambdaAWS - 通过 Lambda 读取 SQS 消息
【发布时间】:2020-06-16 10:17:03
【问题描述】:

以下代码复制自 AWS 文档,但我的代码几乎相同,除了队列 URL 定义部分。

我想以 JSON 格式打印出消息体,但它似乎有一些额外的东西。如何在不使用子字符串的情况下摆脱它们?

# Create SQS client
# blah blah

# Receive message from SQS queue
response = sqs.receive_message(
    QueueUrl=queue_url,
    AttributeNames=[
        'SentTimestamp'
    ],
    MaxNumberOfMessages=1,
    MessageAttributeNames=[
        'All'
    ],
    VisibilityTimeout=0,
    WaitTimeSeconds=0
)

message = response['Messages'][0]
receipt_handle = message['ReceiptHandle']

print('Received and deleted message: %s' % message)

此打印消息具有以下格式:

START RequestId: fe107bc8-3829-4600-9bfc-df89f59b0c70 Version: $LATEST
{JSON body}
END RequestId: fe107bc8-3829-4600-9bfc-df89f59b0c70
REPORT RequestId: fe107bc8-3829-4600-9bfc-df89f59b0c70  Duration: 914.38 ms Billed Duration: 1000 ms    Memory Size: 128 MB Max Memory Used: 71 MB  Init Duration: 247.03 ms

我真正想要的只是 {JSON 正文}。我怎样才能摆脱其余的?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-sqs


    【解决方案1】:

    很遗憾您无法删除

    START RequestId: fe107bc8-3829-4600-9bfc-df89f59b0c70 Version: $LATEST
    END RequestId: fe107bc8-3829-4600-9bfc-df89f59b0c70
    REPORT RequestId: fe107bc8-3829-4600-9bfc-df89f59b0c70  Duration: 914.38 ms Billed Duration: 1000 ms    Memory Size: 128 MB Max Memory Used: 71 MB  Init Duration: 247.03 ms
    

    来自 CloudWatch 日志。这是 lambda 函数的标准打印输出行为。

    但是,您可以在控制台中使用log event filters,这有助于定位特定的感兴趣的{JSON body}。不过,它是最基本和最快的解决方案。

    也可以对您的日志进行更复杂的过滤,但我认为这不是您所追求的。

    【讨论】:

    • 感谢您的评论!顺便说一句,我并没有明确使用 CloudWatch。我在这里尝试做的是: 1. 在 PUT 操作上生成 S3 事件通知,并将通知发布到 SQS 队列。 2. 定期触发 Lambda 函数以读取该 SQS 队列。通过这样做,我想确保确实生成了事件(例如文件确实按时上传)。如果没有,Lambda 将发送电子邮件警报。因此,我不确定 CloudWatch 日志事件过滤器在这种情况下将如何帮助我?
    • @Henrix lambda 的日志输出不会阻止你做任何这些事情。从您的问题来看,目前尚不清楚当前的 lambda 日志结构有什么问题。我认为很难搜索您的打印输出?
    • 我想使用 Lambda 来解析 {JSON body},以便识别 JSON body 中包含的 S3 事件详细信息。现在,JSON 正文被我上面提到的字符串包围,其中包含那些 START/END RequestId 等。我发现很难从这个长字符串中获取 S3 事件详细信息。如果它是简单的 {JSON body},我可以很容易地解析它,比如 body['s3']['bucketname']。
    • @Henrix 你可以试试print(json.dumps(message, default=str))。这可以使 json 在 CW 日志中更易于阅读。
    • “现在,JSON 主体被我上面提到的字符串包围,其中包含那些 START/END RequestId 等。” @Hendrix 不,不是。您的示例输出不包含您的代码指示的字符串 Received and deleted message,因此看起来您的代码实际上并未创建此输出。
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 2016-04-13
    • 2018-09-24
    • 2019-02-02
    • 2018-08-03
    • 2019-11-07
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多