AWS S3 Bucket写入权限异常:账户所有者无法写入日志
嘿,这个问题我之前踩过坑!虽然你是AWS账户所有者,但SageMaker Notebook运行代码时用的是专门的服务执行角色,不是你的个人IAM用户权限——哪怕你自己能读写这个S3 Bucket,角色没拿到对应的权限还是会触发AccessDenied错误。下面是具体的排查和解决步骤:
解决SageMaker写入S3 Bucket的AccessDenied问题
1. 检查SageMaker执行角色的权限
首先得确认代码里get_execution_role()拿到的那个角色有没有testingshk Bucket的写入权限:
- 打开AWS IAM控制台,搜索并找到你的SageMaker执行角色(名字一般是
AmazonSageMaker-ExecutionRole-xxxxxx这种格式) - 查看角色附加的权限策略,确保包含针对目标Bucket的
PutObject权限。正确的策略片段应该是这样的:
如果没有这个权限,就新建一个自定义策略,把上面的内容填进去(替换成你的Bucket名),然后附加到这个角色上。{ "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::testingshk", "arn:aws:s3:::testingshk/*" ] }
2. 排查Bucket的存储桶策略
有时候即使IAM角色有权限,Bucket本身的存储桶策略也会拦截访问:
- 打开S3控制台,进入
testingshkBucket的「权限」标签 - 查看「存储桶策略」,确保没有任何拒绝SageMaker执行角色进行
PutObject操作的语句。如果有冲突的拒绝规则,需要调整或者移除。
3. 验证Bucket的公有访问设置
虽然这个场景下大概率不是公有访问的问题,但还是确认下:
- 在Bucket的「权限」标签里,检查「阻止公有访问」的设置,确保没有勾选会限制内部IAM角色访问的选项(默认设置是允许IAM角色访问的,但如果有自定义修改过需要确认)。
4. 代码小核对
最后快速确认下:
- 代码里的Bucket名称
testingshk有没有拼写错误 - SageMaker Notebook实例和这个Bucket在同一个AWS区域(跨区域访问偶尔也会引发权限类报错,虽然错误信息可能不一样,但保险起见检查下)
按照上面的步骤调整后,再重新运行代码应该就能正常写入S3了!
内容的提问来源于stack exchange,提问作者Shahek




