Python S3ResponseError:403禁止使用Boto
当我尝试使用Python中的BOTO访问某些文件时,S3存储桶上存在权限问题。以下是bucket策略:Python S3ResponseError:403禁止使用Boto,python,amazon-web-services,amazon-s3,boto,Python,Amazon Web Services,Amazon S3,Boto,当我尝试使用Python中的BOTO访问某些文件时,S3存储桶上存在权限问题。以下是bucket策略: { "Version": "2008-10-17", "Id": "Policy1407346649831", "Statement": [ { "Sid": "Stmt1407346646598", "Effect": "Allow", "Principal": {
{
"Version": "2008-10-17",
"Id": "Policy1407346649831",
"Statement": [
{
"Sid": "Stmt1407346646598",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::029030651757:user/my_iam_user"
},
"Action": "s3:*",
"Resource": ["arn:aws:s3:::my_bucket/*",
"arn:aws:s3:::my_bucket"]
},
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EFUS443HMBYF"
},
"Action": "s3:GetObject",
"Resource": ["arn:aws:s3:::my_bucket/*",
"arn:aws:s3:::my_bucket"]
},
{
"Sid": "3",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EFUS443HMBYF"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my_bucket/*"
}
]
}
我有三个陈述。第一个是授权用户my_iam_user
访问bucketmy_bucket
,第二个是授权Cloudfront分发读取bucket,最后一个是授权Cloudfront分发在bucket上写入
现在,我必须在我的bucket上创建文件profile\u pictures/15/file1.jpg
和profile\u pictures/15/file2.jpg
。第一个是使用签名url和CloudFront创建的,第二个是使用Boto放到S3上的。现在我尝试使用Boto访问这些文件。这是我的密码:
import boto
from boto.s3.key import Key
s3 = boto.connect_s3(
aws_access_key_id="access_key_of_my_iam_user",
aws_secret_access_key="secret_key_of_my_iam_user"
)
bucket = s3.get_bucket("my_bucket", validate=False)
k1 = Key(bucket)
k1.key = "profile_pictures/15/file1.jpg"
k1.get_contents_as_string()
k2 = Key(bucket)
k2.key = "profile_pictures/15/file2.jpg"
k2.get_contents_as_string()
问题在于,对文件1的访问返回一个错误:
S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>8C5DE910C7B18F9E</RequestId><HostId>XiKU5Q+B0Wme3GpUNmUoD9KpUN63T3bFu/rAb/wh3rhDMkykoRsdQIFgyIp8zfAwMR1apbqUEFY=</HostId></Error>
而第二个是成功的。有什么不对劲吗
注意:运行代码的客户端上的时间很好。即使IAM用户已被第一个策略授予对bucket的完全访问权限,他们仍然不会自动访问
文件1
,因为他们不是该对象的所有者(Cloudfront是)而且他们还没有被授予对对象的显式访问权限。另外,据推测,IAM用户也不是bucket的所有者
如果查看,您将看到几乎相同的情况,并进一步解释如何使用对象上下文来确定请求是被批准还是被拒绝。您将无法访问bucket“my bucket” 整个S3生态系统中的存储桶名称必须是唯一的。
如果您尝试访问一个唯一的bucket名称,例如“MY_unique_ORG_name-MY_unique_bucket_name”,您可能会有更好的运气。IAM用户也是bucket的所有者吗?事实上,IAM用户不是bucket的所有者,也不是file1的所有者。所以问题是:我必须手动授予用户访问所有创建的文件的权限,还是有其他方式?我不是Cloudfront的专家,所以我不知道是否有办法更改预签名的PUT请求,以包括允许IAM用户访问的权限。另一种选择是使用由存储到bucket中的新对象触发的Lambda。Lambda函数可以检查新对象,并根据需要调整对象的ACL。