使用boto3+MinIO上传S3对象遇AccessDenied错误排查求助
问题:MinIO中使用Service Account通过boto3上传S3对象时出现AccessDenied错误
问题背景
使用boto3通过自定义的具备读写权限的service account,向作为S3兼容存储的MinIO上传对象。已确认存储桶和前缀路径正确,使用管理员凭证可正常完成操作,但切换到该service account凭证时触发权限错误。
已配置的IAM策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::*" ] } ] }
报错信息
boto3.exceptions.S3UploadFailedError: Failed to upload /tmp/tmpfnkhwptw/model/requirements.txt to ml-artifacts/1/02e5b8a81a834b6e83a3412745f4ff6a/artifacts/sklearn-model/requirements.txt: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.
原因分析
- MinIO与AWS的ARN匹配逻辑差异:MinIO对S3 ARN的解析规则和AWS原生不同,
arn:aws:s3:::*这种宽泛的匹配规则无法正确覆盖桶内对象的权限,需要明确指定桶和对象层级的ARN。 - Bucket Policy的优先级限制:若目标MinIO桶配置了Bucket Policy,其拒绝规则会优先于IAM策略生效,可能限制了service account的写入权限。
- 策略绑定未生效:service account可能未正确关联到配置的IAM策略,或是MinIO的策略缓存未刷新,导致权限未同步。
- 路径大小写不匹配:MinIO默认大小写敏感,若代码中指定的存储桶或对象路径与实际存在的路径大小写不一致,也会触发权限类报错。
解决方法
- 修正IAM策略的Resource格式:明确指定目标桶及桶内对象的ARN,以
ml-artifacts桶为例:
该配置同时授权桶级操作和桶内所有对象的操作。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::ml-artifacts", "arn:aws:s3:::ml-artifacts/*" ] } ] } - 检查并调整Bucket Policy:登录MinIO控制台,查看
ml-artifacts桶的Bucket Policy,确保不存在拒绝该service account执行PutObject操作的规则,必要时添加允许权限的规则。 - 重新绑定IAM策略:使用MinIO命令行工具重新关联策略与service account,确保权限生效:
mc admin policy attach <minio-别名> --user <service-account名称> <策略名称> - 核对路径大小写:确认代码中指定的存储桶名称
ml-artifacts及对象路径的大小写,与MinIO中实际存在的完全一致。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

