【问题标题】:How to handle an SQS event that's triggered by S3?如何处理由 S3 触发的 SQS 事件?
【发布时间】:2021-04-07 09:27:24
【问题描述】:

我有一个 S3 存储桶,它在添加对象时将消息分派到 SQS 队列。该 SQS 队列反过来会触发 Lambda,该 Lambda 尝试使用其键检索最近添加的对象。

我的 Lambda 中的 FunctionHandler 方法如下所示:

public async Task FunctionHandler(S3EventNotification evnt, ILambdaContext context) {
    // evnt.Records[0].S3 is null
}

我在这里处理正确的事件吗? 我处理 S3EventNotification 的原因是因为当我检查 SQS 队列中的消息时,它们的内容对应于 S3EventNotification 事件类型( see documentation here)。然而由于某种原因,我试图访问的属性为空。

如果我尝试处理 SQSEvent,则无法获取我需要的对象键,以便能够从我的 S3 存储桶中获取相应的对象。

有什么想法吗?

【问题讨论】:

    标签: c# amazon-web-services amazon-s3 aws-lambda amazon-sqs


    【解决方案1】:

    您可能想在此处处理SQSEvent。我相信在每个event.records 中,您都将拥有body 属性,它将举办原始S3 事件。它可能需要一些序列化。

    类似:

    public class Function
    {
        public string Handler(SQSEvent sqsEvent)
        {
            foreach (var record in sqsEvent.Records)
            {
                // record.Body has your S3 event
            }
        }
    }
    

    出于兴趣,您是否考虑过直接从 S3 -> EventBridge -> Lambda?这样你就可以跳过 SQS 队列了。

    【讨论】:

    • SQSEvent 记录上的 body 属性是否包含 S3EventNotification 或 S3Event?而且我假设由于 body 是一个字符串,这些事件将在需要序列化的原始 JSON 中,对吗?
    • 我不确定 SQSEvent 或 S3EventNotification 是否会出现在正文中。你最好的选择是调试它并检查。如果您正在努力在本地调试它,您也许可以将其记录到 CloudWatch 并查看内容是什么。我想你是正确的,字符串需要序列化到正确的类。
    • @AlexBailey 你是对的——S3 事件将作为字符串“封装”在 SQS 事件中,需要将其转换为普通对象。这可以通过直接从 S3 事件到 AWS Lambda 函数来避免。
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多