跨账号PutObject事件无法触发AWS Lambda问题求助
跨账号S3 PutObject无法触发Lambda的解决方案
核心问题分析
跨账号操作场景下,S3代表源账号(账号A)调用目标账号(账号B)的Lambda时,会被Lambda默认的资源策略拦截,这是导致事件无法触发的核心原因——同账号上传时调用方是账号B自身,权限不受限制,但跨账号调用需要额外配置权限放行。
具体修复步骤
1. 更新Lambda的资源策略
在账号B的Lambda函数资源策略中,添加允许账号A的S3服务触发调用的规则,示例策略如下:
{ "Version": "2012-10-17", "Id": "S3InvokeLambdaPermission", "Statement": [ { "Sid": "AllowCrossAccountS3Trigger", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:REGION:ACCOUNT_B_ID:function:YOUR_LAMBDA_NAME", "Condition": { "StringEquals": { "AWS:SourceAccount": "ACCOUNT_A_ID" }, "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::YOUR_ACCOUNT_B_BUCKET_NAME" } } } ] }
- 替换占位符:
REGION为你的AWS区域,ACCOUNT_B_ID为账号B的ID,YOUR_LAMBDA_NAME为目标Lambda函数名,ACCOUNT_A_ID为账号A的ID,YOUR_ACCOUNT_B_BUCKET_NAME为账号B的接收桶名。
2. 验证S3事件通知的触发类型
如果Glue Job使用的是CopyObject而非直接PutObject操作,S3会触发s3:ObjectCreated:Copy事件而非PutObject。此时需要在账号B的S3桶事件通知中,补充勾选ObjectCreated:Copy事件类型,确保覆盖跨账号操作的事件类型。
3. 排查过滤规则
检查账号B的S3事件通知是否配置了前缀/后缀过滤规则,确认跨账号上传的对象路径符合触发条件,避免因过滤规则导致事件被忽略。
4. 日志排查定位
- 查看账号B的CloudTrail日志,确认S3是否尝试触发Lambda,若存在
Lambda.InvalidPermission类错误,说明资源策略配置仍有问题。 - 查看Lambda的CloudWatch日志,若没有调用记录则说明事件未送达,若有错误日志则根据提示调整配置。
内容的提问来源于stack exchange,提问作者sparkcoderlv
相关产品推荐
相关产品推荐

