S3 Bucket无法执行PutObject权限问题求助(Lambda+IAM场景)
解决Lambda向S3执行PutObject时的AccessDenied错误
看起来你踩了一个Lambda权限的常见误区——混淆了创建Lambda的IAM用户和Lambda运行时依赖的执行角色的权限!我来帮你拆解问题并给出具体修复步骤:
核心问题分析
你当前配置的S3桶策略是允许IAM用户cdeveloper操作S3资源,但Lambda函数运行时,是通过它自身的**执行角色(Execution Role)**来获取AWS服务访问权限的,完全不会用到创建它的cdeveloper用户身份。这就是为什么你会收到AccessDenied报错。
具体修复步骤
1. 为Lambda执行角色添加S3写入权限
这是最关键的一步:
- 打开AWS IAM控制台,找到你的Lambda函数对应的执行角色(可以在Lambda函数配置的「权限」标签下直接跳转)
- 给这个角色添加一条内联策略,赋予它向目标S3桶写入的权限:
(遵循最小权限原则,只添加你需要的操作即可,不需要给{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::ag-grid/*" } ] }s3:*这么宽泛的权限)
2. 验证S3桶策略的必要性(可选)
你当前配置的桶策略是允许cdeveloper用户操作S3,但如果Lambda已经通过执行角色获得了权限,这个桶策略其实不是必须的(除非你有跨账号访问等特殊场景需求)。如果保留的话,要确保没有冲突的Deny策略存在。
3. 排查额外限制因素
如果还是报错,可以检查以下几点:
- 确认S3桶的**公共访问阻止(Block Public Access)**设置没有限制IAM角色的写入操作(通常不影响,但可以排查)
- 检查是否有IAM边界(IAM Boundary)或AWS组织级别的服务控制策略(SCP)限制了Lambda执行角色的S3权限
- 核对Lambda代码中PutObject请求的Bucket名称、文件路径(Key)是否完全匹配
arn:aws:s3:::ag-grid/*,比如有没有拼写错误,或者尝试写入桶根目录(arn:aws:s3:::ag-grid)而不是子路径(你的策略只允许子路径操作)
举个简单的Python Lambda代码示例,确保路径匹配:
import boto3 s3_client = boto3.client('s3') def lambda_handler(event, context): # 确保Bucket和Key匹配你的策略范围 s3_client.put_object( Bucket='ag-grid', Key='data/test.json', Body='{"name": "test"}' ) return {"status": "success"}
内容的提问来源于stack exchange,提问作者user8022517
相关产品推荐
相关产品推荐

