Lambda S3触发器无法跨账号识别目标Bucket问题排查
嘿,我遇到过好几次这种跨账号配置的坑,核心问题是跨账号S3触发器需要双向权限配置,而且Lambda控制台的下拉默认只显示同账号Bucket,光给Lambda加访问权限是不够的,下面一步步给你拆解解决办法:
1. 先明确:跨账号Bucket不会出现在下拉列表里,得手动输入
AWS Lambda的触发器配置界面里,S3 Bucket下拉只会展示当前账号(账号A)的资源。要选账号B的Bucket,你得手动填写Bucket的名称或者完整ARN,别等着下拉列表加载出来——它本来就不会显示跨账号的Bucket。不过这一步的前提是两边的权限都配置到位了,不然手动输入也会报错。
2. 必须给账号B的S3 Bucket配置跨账号调用权限
Lambda有了访问S3的权限,但S3这边得允许触发账号A的Lambda函数才行。你需要登录账号B,找到目标Bucket的「权限」-「Bucket策略」,添加如下规则(记得替换占位符):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::账号A-ID:role/你的Lambda执行角色ARN" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域ID:账号A-ID:function:你的Lambda函数名" } ] }
这里把Principal设为Lambda的执行角色ARN比用账号根用户更安全,当然如果图省事用账号A的根ARN也能行,但不推荐。
3. 确认Lambda执行角色的权限覆盖到位
你提到权限摘要已经授权了arn:aws:s3:::mybucket和arn:aws:s3:::mybucket/folder1/*的所需操作,这里要确保这些操作包含了你实际需要的S3动作——比如如果是监听文件上传,至少要有s3:GetObject、s3:ListBucket之类的权限,不然触发器触发后Lambda执行时会报错。
4. 换个思路:直接在S3控制台配置触发器(更直观)
如果在Lambda这边手动输入觉得麻烦,你可以登录账号B的S3控制台,找到目标Bucket,进入「属性」-「事件通知」,点击「创建事件通知」:
- 填写通知名称、选择触发的事件类型(比如所有对象创建事件)
- 目标选择「Lambda函数」,然后选「另一个账号」,输入账号A的Lambda函数完整ARN
- 保存后就能完成跨账号触发器配置,这种方式有时候比在Lambda那边操作更顺畅
5. 踩过的坑要注意
- 区域必须匹配:Lambda函数和S3 Bucket必须在同一个AWS区域,跨区域的话触发器根本无法生效
- ARN别写错:手动输入Bucket或者Lambda的ARN时,要检查区域、账号ID、名称有没有错,少一个字符都不行
- 不要漏了信任关系?不,这里不需要:很多人会误以为Lambda执行角色要信任S3服务,但其实是S3调用Lambda,所以只要S3的Bucket策略允许调用Lambda,Lambda的角色允许访问S3就够了
按照这些步骤走,应该就能搞定你现在的问题了。
内容的提问来源于stack exchange,提问作者DataDog

