Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python S3ResponseError:403禁止使用Boto_Python_Amazon Web Services_Amazon S3_Boto - Fatal编程技术网

Python S3ResponseError:403禁止使用Boto

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": {

当我尝试使用Python中的BOTO访问某些文件时,S3存储桶上存在权限问题。以下是bucket策略:

{
    "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
访问bucket
my_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。