如何在S3文件上传时触发Lambda函数

3

我似乎不能像预期的那样触发我的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函数。

有人能告诉我错在哪里吗?


3
你是否已按照此处所述,为选定的S3存储桶启用了CloudTrail事件记录? - Balu Vyamajala
三件事情:1. 为什么不直接使用S3触发器?2. eventNames可能会缺少s3:前缀(例如s3:PutObject),3. 您是否授予EventBridge调用您的Lambda的权限? - Jens
@Jens - 我认为问题可能出在#3。你能指导我如何做吗?请给我提供相关文档的链接好吗? - maxmoore14
我已经使用CloudWatch事件测试了您的用例,对我来说可以正常工作。请查看以下解决方案。 - Siva Sumanth
S3事件通知与资源耦合,有理由优先选择EventBridge。我的问题是:我也无法使其工作,区域是否相关?我有一个us-east-1存储桶和一个us-west-2目标。需要设置事件总线吗?我很迷茫。 - Merlin
5个回答

2
截至2021年11月29日,Amazon Event Bridge现在支持Amazon S3事件通知而无需启用CloudTrial
在您要监视的S3存储桶的属性中,您必须启用Amazon EventBridge。

enter image description here

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

在您的EventBridge规则中,您可以将Lambda配置为“目标”。如果您想跟随操作,我制作了一份逐步教程,介绍如何在AWS中配置EventBridge: https://youtu.be/k-jEuNb_KBM


2
您可以在S3中使用事件通知。它与Lambda、SNS、SQS直接集成。
  • 在S3中转到属性选项卡

  • 导航到事件通知。点击创建事件通知。 enter image description here

  • 然后添加事件名称。

  • 如果您想将事件限制为特定文件夹或文件类型,可以填写前缀或后缀字段,或者如果要针对整个存储桶,则将其留空。 enter image description here

  • 然后选择一系列事件。例如put、post。enter image description here

  • 然后选择目标并单击保存。您将收到通知。 enter image description here


1
我的要求是使用EventBridge规则。 - maxmoore14
嗨,Maxmoore14, 请查看以下关于CloudWatch事件规则放置对象的答案。 - Siva Sumanth

1
您可以使用S3事件或云监控事件规则来调用Lambda函数以处理S3上的任何事件。
以下图像显示如何配置云监控事件规则以进行S3 putObject操作。
确保在相应区域启用了数据事件的云跟踪。
确保为特定存储桶创建规则。如果提及了所有存储桶,则会出现不必要的调用,因为云监控事件规则基于云跟踪工作,并将所有日志存储到S3中。 enter image description here

希望这是您期望的答案,@maxmoore14。 - Siva Sumanth
似乎OP正在尝试对事件进行存储桶前缀过滤,这在EventBridge中是否也可以配置?我找不到这个选项。 - Merlin

1
感谢所有人的帮助和建议-如果未来有人遇到这篇文章,所有好的资源都应该是有用的。事实证明,在我的情况下,@Balu Vyamajala在评论中是正确的-我错误地配置了CloudTrail。

请提供解决方案,我仍然一无所知。 - Merlin

0

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

您可以向您的 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>"
        }
      }
    }
  ]
}

您需要将<lambda-arn><eventbridge-rule-arn>替换为相应的值。

您可以在此处阅读有关基于资源的策略的更多信息:使用 AWS Lambda 的基于资源的策略

如果您使用 Terraform 等工具,则可以使用以下代码片段:

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_namesource_arn,使用您特定的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接