【问题标题】:How to trigger a Lambda on S3 file upload如何在 S3 文件上传时触发 Lambda
【发布时间】:2022-01-24 21:24:45
【问题描述】:

我似乎无法按预期触发我的 lambda。在 AWS EventBridge 中,我使用以下自定义事件模式创建了一个规则:

{
  "source": ["aws.s3"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["s3.amazonaws.com"],
    "eventName": [
      "CopyObject",
      "CompleteMultipartUpload",
      "PutObject"
    ],
    "requestParameters": {
      "bucketName": ["my-bucket"],
      "key": [{"prefix": "folder1/folder2/"}]
    }
  }
}

但是当我将文件上传到“目录”时,规则不会触发 lambda。

谁能告诉我哪里出错了?

【问题讨论】:

  • 您已为选定的 s3 存储桶启用了 cloudtrail 事件,如文档所述 here?
  • 三件事:1.为什么不直接使用S3触发器? 2. eventNames 可能会错过 s3: 前缀(例如 s3:PutObject)和 3. 您是否授予 EventBridge 调用您的 Lamdba 的权限?
  • @Jens - 我认为#3 可能是问题所在。你能指点我解释如何做到这一点的文档的方向吗?
  • 我已经用云观察事件测试了你的用例,它对我有用。请找到以下解决方案
  • 1. s3 事件通知加上资源,有理由更喜欢 eventbridge。我的问题:我也不能让我的工作,地区相关吗?我有 us-east-1 存储桶和 us-west-2 目标。是否需要事件总线设置?我迷路了。

标签: amazon-web-services amazon-s3 aws-lambda aws-event-bridge


【解决方案1】:

您可以在 S3 中使用事件通知。它与 Lambda、SNS、SQS 直接集成

  • 转到 S3 中的属性选项卡

  • 导航到事件通知。单击创建事件通知。

  • 然后添加事件名称。

  • 如果您想将事件限制在特定文件夹或文件类型,您可以填写前缀或后缀字段,或者如果您希望整个存储桶都使用这些字段,请将其留空。

  • 然后选择一个事件列表。喜欢放,发帖。

  • 然后选择目的地并点击保存。您将收到通知。

【讨论】:

  • 我的要求是使用 EventBridge 规则。
  • 嗨 Maxmoore14 请找到以下答案,了解云观看事件规则放置对象
【解决方案2】:

自 2021 年 11 月 29 日起,Amazon Event Bridge 现在支持 Amazon S3 事件通知无需启用 CloudTrial。

在您要监控的 S3 存储桶的属性中,您必须启用 Amazon EventBridge。

这将允许您使用规则向 EventBridge 发送消息。

在您的 eventbridge 规则中,您可以将 lambda 配置为“目标”。如果您想继续学习,我制作了一个关于如何在 AWS 中配置 eventbridge 的分步教程:https://youtu.be/k-jEuNb_KBM

【讨论】:

    【解决方案3】:

    您可以同时使用 S3 事件或云观察事件规则来为 S3 上的任何事件调用 lambda 函数。

    • 下图展示了如何为 s3 putObject 操作配置云观察事件规则。
    • 确保为相应区域的数据事件启用云跟踪。
    • 确保为特定存储桶创建规则。
    • 如果你提到的是所有的桶。您将获得不必要的调用,因为云监视事件规则适用于云跟踪,它将所有日志存储到 s3。

    【讨论】:

    • 希望这是您所期待的答案@maxmoore14
    • 似乎 OP 正在尝试过滤事件的存储桶前缀,这是否也可以在 EventBridge 中配置?我找不到这个。
    【解决方案4】:

    感谢大家的帮助和建议——如果有人在未来看到这篇文章,所有好的资源。事实证明,@Balu Vyamajala 在 cmets 中是正确的——我错误地配置了 CloudTrail。

    【讨论】:

    • 请提供解决方案,我这里还是一头雾水。
    【解决方案5】:

    正如我之前对您的问题的评论中提到的,您可能没有适当的权限来允许 EventBridge 到 Invoke 您的 Lambda。

    您可以将以下Resource-based policy 添加到您的Lambda:

    {
      "Version": "2012-10-17",
      "Id": "default",
      "Statement": [
        {
          "Sid": "AllowExecutionFromEventBridge",
          "Effect": "Allow",
          "Principal": {
            "Service": "events.amazonaws.com"
          },
          "Action": "lambda:InvokeFunction",
          "Resource": "<lambda-arn>",
          "Condition": {
            "ArnLike": {
              "AWS:SourceArn": "<eventbridge-rule-arn>"
            }
          }
        }
      ]
    }
    

    您需要将&lt;lambda-arn&gt; 和&lt;eventbridge-rule-arn&gt; 替换为各自的值。

    您可以在此处阅读有关resource-based policy 的更多信息:Using resource-based policies for AWS Lambda。

    如果你使用 Terraform 之类的工具,可以使用以下 sn-p:

    resource "aws_lambda_permission" "example" {
      statement_id  = "AllowExecutionFromCloudWatch"
      action        = "lambda:InvokeFunction"
      function_name = aws_lambda_function.example.function_name
      principal     = "events.amazonaws.com"
      source_arn    = aws_cloudwatch_event_rule.example.arn
    }
    

    您还需要将此处的function_name 和source_arn 替换为您的具体引用。

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 2021-10-10
      • 2021-08-27
      • 2019-08-03
      • 2020-02-09
      • 2023-03-18
      • 1970-01-01
      • 2021-06-24
      • 2019-04-28
      相关资源
      最近更新 更多