【问题标题】:Passing variable values through S3 and SQS event trigger message通过 S3 和 SQS 事件触发消息传递变量值
【发布时间】:2021-08-07 03:44:43
【问题描述】:

我已将 aws 管道设置为 S3 -> SQS -> Lambda。 S3 PutObject 事件将生成事件触发消息并将其传递给 SQS,SQS 将触发 lambda。我需要将变量值从 S3 传递给 SQS,最后作为事件消息的一部分传递给 Lambda。变量值可以是文件名或某个字符串值。

  1. 我们能否自定义 S3 事件生成的事件消息 json 数据,以便在消息中传递更多信息。
  2. SQS 是否只是将从 S3 收到的事件消息传递给 Lambda,或者对消息进行任何更改或生成自己的消息。
  3. 如何在 SQS 或 Lambda 中显示或查看 S3 生成的消息。

【问题讨论】:

  • 变量值从何而来?每个事件的值是否相同,还是以某种方式生成?如果生成,什么代码决定它的值?虽然没有与您的要求相匹配的功能,但可能有一些方法可以实现类似的结果(例如标签、消息属性),但这完全取决于值的来源。请编辑您的问题以提供此附加信息。
  • S3 存储桶将接收多个文件。每个文件都会触发事件和消息将被发送到 SQS。我想将文件名和常量值作为每个文件的事件消息的一部分传递。 lambda 函数使用来自 SQS 的消息,并且 lambda 函数需要触发事件的文件名,以便它可以为每个文件运行代码略有不同。希望这能解释得更好。
  • 但是什么决定了价值呢?每个文件都获得相同的值吗?如果是这样,Lambda 函数不能只假设该值吗?哪些输入因素决定了价值的确定方式?

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


【解决方案1】:

您无法操作 S3 事件数据。架构看起来像 this。这将被传递到 SQS 队列,该队列将添加一些它自己的元数据并将其传递给 Lambda。 This tutorial 有一个示例 SQS 记录。

【讨论】:

    【解决方案2】:

    当 Amazon S3 触发事件时,会向所需目标(AWS Lambda、Amazon SNS、Amazon SQS)发送一条消息。 消息包含触发事件的对象的存储桶名称和密钥(文件名)

    这是一个示例事件(来自Using AWS Lambda with Amazon S3 - AWS Lambda):

    {
      "Records": [
        {
          "eventVersion": "2.1",
          "eventSource": "aws:s3",
          "awsRegion": "us-east-2",
          "eventTime": "2019-09-03T19:37:27.192Z",
          "eventName": "ObjectCreated:Put",
          "userIdentity": {
            "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
          },
          "requestParameters": {
            "sourceIPAddress": "205.255.255.255"
          },
          "responseElements": {
            "x-amz-request-id": "D82B88E5F771F645",
            "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
          },
          "s3": {
            "s3SchemaVersion": "1.0",
            "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
            "bucket": {
              "name": "lambda-artifacts-deafc19498e3f2df",
              "ownerIdentity": {
                "principalId": "A3I5XTEXAMAI3E"
              },
              "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
            },
            "object": {
              "key": "b21b84d653bb07b05b1e6b33684dc11b",
              "size": 1305107,
              "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
              "sequencer": "0C0F6F405D6ED209E1"
            }
          }
        }
      ]
    }
    

    bucket可以从Records[].s3.bucket.name获取,key可以从Records[].s3.object.key获取。

    但是,由于 S3 触发事件,因此无法发送特定值。但是,您可能导出一个值。例如,如果您有来自多个不同存储桶的事件触发 Lambda 函数,则 Lambda 函数可以查看存储桶名称以确定触发它的原因,然后替换为所需的值。

    【讨论】:

    • 是的,这回答了我的问题。我正在寻找触发事件的文件名。我可以从事件消息 JSON 数据中提取它。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多