如何在 S3 文件上传时触发 Lambda
How to trigger a Lambda on S3 file upload
我似乎无法像预期的那样触发我的 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 中使用事件通知。它与 Lambda、SNS、SQS 直接集成
转到 S3 中的属性选项卡
导航到事件通知。单击创建事件通知。
然后添加事件名称。
如果您想将事件限制在特定的文件夹或文件类型,您可以填写前缀或后缀字段,或者如果您希望它用于整个存储桶,请将这些留空。
然后是 select 事件列表。就像放一样,post.
然后选择目的地并点击保存。您将收到通知。
您可以同时使用 S3 事件或云监视事件规则为 S3 上的任何事件调用 lambda 函数。
- 下图显示了如何为 s3 putObject 操作配置云监视事件规则。
- 确保您为相应区域的数据事件启用了云跟踪。
- 确保为特定存储桶创建规则。
- 如果您提到的是所有存储桶。您将获得不必要的调用,因为云监视事件规则适用于云跟踪,它将所有日志存储到 s3。
正如我之前对您的问题的评论中提到的,您可能没有适当的权限允许 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>"
}
}
}
]
}
您需要用相应的值替换 <lambda-arn>
和 <eventbridge-rule-arn>
。
您可以在此处阅读有关 resource-based policy
的更多信息:Using resource-based policies for 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_name
和 source_arn
替换为您的具体参考资料。
感谢所有人的帮助和建议 - 如果将来有人遇到这个 post,所有好的资源都可以。结果在我的案例中@Balu Vyamajala 在评论中是正确的 - 我错误地配置了 CloudTrail。
自 2021-11-29 起,Amazon Event Bridge 现在支持 Amazon S3 事件通知而无需启用 CloudTrial。
在您要监控的 S3 存储桶的属性中,您必须启用 Amazon EventBridge。
这将允许您使用规则将消息发送到 EventBridge。
在您的 eventbridge 规则中,您可以将 lambda 配置为“目标”。我制作了一个关于如何在 AWS 中配置 eventbridge 的 step-by-step 教程,如果你想跟进的话:https://youtu.be/k-jEuNb_KBM
我似乎无法像预期的那样触发我的 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 中使用事件通知。它与 Lambda、SNS、SQS 直接集成
转到 S3 中的属性选项卡
导航到事件通知。单击创建事件通知。
然后添加事件名称。
如果您想将事件限制在特定的文件夹或文件类型,您可以填写前缀或后缀字段,或者如果您希望它用于整个存储桶,请将这些留空。
然后是 select 事件列表。就像放一样,post.
然后选择目的地并点击保存。您将收到通知。
您可以同时使用 S3 事件或云监视事件规则为 S3 上的任何事件调用 lambda 函数。
- 下图显示了如何为 s3 putObject 操作配置云监视事件规则。
- 确保您为相应区域的数据事件启用了云跟踪。
- 确保为特定存储桶创建规则。
- 如果您提到的是所有存储桶。您将获得不必要的调用,因为云监视事件规则适用于云跟踪,它将所有日志存储到 s3。
正如我之前对您的问题的评论中提到的,您可能没有适当的权限允许 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>"
}
}
}
]
}
您需要用相应的值替换 <lambda-arn>
和 <eventbridge-rule-arn>
。
您可以在此处阅读有关 resource-based policy
的更多信息:Using resource-based policies for 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_name
和 source_arn
替换为您的具体参考资料。
感谢所有人的帮助和建议 - 如果将来有人遇到这个 post,所有好的资源都可以。结果在我的案例中@Balu Vyamajala 在评论中是正确的 - 我错误地配置了 CloudTrail。
自 2021-11-29 起,Amazon Event Bridge 现在支持 Amazon S3 事件通知而无需启用 CloudTrial。
在您要监控的 S3 存储桶的属性中,您必须启用 Amazon EventBridge。
这将允许您使用规则将消息发送到 EventBridge。
在您的 eventbridge 规则中,您可以将 lambda 配置为“目标”。我制作了一个关于如何在 AWS 中配置 eventbridge 的 step-by-step 教程,如果你想跟进的话:https://youtu.be/k-jEuNb_KBM