S3桶可上传文件但无法列出,权限问题求助
为何S3能上传文件却无法列出对象?
问题场景
用Python脚本上传S3桶文件正常,但执行文件列表操作时返回Permission Denied错误。
初始IAM策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": "arn:aws:s3:::notes-sync-test/*" } ] }
对应Python代码
import boto3 s3 = boto3.resource( service_name='s3', region_name='us-east-1', aws_access_key_id='XXX', aws_secret_access_key='ZZZZ' ) bucket_name = "notes-sync-test" bucket = s3.Bucket(bucket_name) # 可正常执行 - 上传新文件 data = open('test.pdf', 'rb') s3.Bucket(bucket_name).put_object(Key='test.pdf', Body=data) # 执行失败 - 列出对象 for my_bucket_object in bucket.objects.all(): print(my_bucket_object.key)
补充:若添加对桶本身的资源权限(如下策略),则上传和列表操作均正常:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": "arn:aws:s3:::notes-sync-test/*" }, { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": "arn:aws:s3:::notes-sync-test" } ] }
原因分析
S3权限控制区分桶级别操作和对象级别操作,对应资源ARN格式不同:
- 对象级别操作(如
PutObject上传文件):目标是桶内具体对象,资源ARN为arn:aws:s3:::<bucket-name>/*,初始策略已覆盖此范围,因此上传正常。 - 桶级别操作(如
ListBucket列出对象,对应boto3的bucket.objects.all()调用):目标是桶本身,需要对桶的ARN(arn:aws:s3:::<bucket-name>)赋予权限,初始策略未包含此资源,因此列表操作被拒绝。
补充策略新增了对桶本身的资源权限,桶级别列表操作获得授权,因此功能恢复正常。
优化建议(最小权限原则)
无需授予s3:*全权限,可根据实际需求配置最小权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::notes-sync-test/*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::notes-sync-test" } ] }
内容的提问来源于stack exchange,提问作者Klian
相关产品推荐
相关产品推荐

