Python Amazon S3上载以HTTP 403响应:访问被拒绝

Python Amazon S3上载以HTTP 403响应:访问被拒绝,python,amazon-web-services,heroku,amazon-s3,Python,Amazon Web Services,Heroku,Amazon S3,这将是一篇很长的帖子,但由于我不知道哪里出了问题,我认为过于冗长比遗漏重要信息要好 我正在尝试按照以下指南将图像上载到我的Amazon S3存储桶: 我按如下方式设置代码: index.html <img id="preview" src="https://via.placeholder.com/320?text=Image+Upload"> <input id="file_input" class="form-control" type="file" name="image"

这将是一篇很长的帖子,但由于我不知道哪里出了问题,我认为过于冗长比遗漏重要信息要好

我正在尝试按照以下指南将图像上载到我的Amazon S3存储桶:

我按如下方式设置代码:

index.html

<img id="preview" src="https://via.placeholder.com/320?text=Image+Upload">
<input id="file_input" class="form-control" type="file" name="image" accept="image/*">
<form method="POST" action="/gallery/upload" enctype="multipart/form-data">
    <input type="hidden" name="csrfmiddlewaretoken" value="lVE...ASG">
    <input type="hidden" id="image-url" name="image-url">
    <input class="form-control" type="text" name="title" placeholder="Title">
    <input class="form-control" type="text" name="price" placeholder="Price">
    <div class="form-control">
        <input type="checkbox" name="archive" value="True">
        <label for="archive">Archive</label>
    </div>
    <input class="form-control btn-primary" type="submit">
</form>
视图.py

S3_BUCKET = os.environ.get('S3_BUCKET')
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
s3 = boto3.client(
    's3',
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)

def sign_s3(request):
    file_name = request.GET.get('file_name')
    file_type = request.GET.get('file_type')

    presigned_post = s3.generate_presigned_post(
        Bucket=S3_BUCKET,
        Key=file_name,
        Fields={"acl": "public-read", "Content-Type": file_type},
        Conditions=[
            {"acl": "public-read"},
            {"Content-Type": file_type}
        ],
        ExpiresIn=3600
    )

    return JsonResponse({
        'data': presigned_post,
        'url': 'https://%s.s3.amazonaws.com/%s' % (S3_BUCKET, file_name)
    })
当我使用文件上传器选择一个图像时,我会收到一条警告,上面写着“无法上传文件”,同时Chrome开发者控制台会显示以下输出:

acl: public-read
Content-Type: image/jpeg
key: dragon.jpg
x-amz-algorithm: AWS4-HMAC-SHA256
x-amz-credential: AKI...TRA/20190224/us-east-2/s3/aws4_request
x-amz-date: 20190224T044659Z
policy: eyJ...XX0=
x-amz-signature: 7ea...18a
file: [object File]
似乎预签名已经通过,但我从上传中得到了以下XML作为响应:

<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>5D1...AB5</RequestId>
  <HostId>cYX...WKw=</HostId>
</Error>
我的CORS政策非常宽松(我计划稍后对此进行更改,但现在,我想防止访问受到限制):

编辑2:我可以通过取消选中公共访问设置中的“阻止新公共存储桶策略”来更改我的存储桶策略。将其设置为以下值不会再导致Bucket Policy页面上出现“Access Denied”(拒绝访问)错误消息,但我仍然无法通过XHR上传文件:

{
    "Id": "Policy...237",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt...935",
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::coolwater-creations/*",
            "Principal": {
                "AWS": [
                    "...764"
                ]
            }
        }
    ]
}

我怀疑您使用的帐户与您在IAM中看到的帐户不同:

从您共享的屏幕截图中注意到,在您的屏幕截图中,IAM用户的名称与您的用户名不匹配

如果您以IAM用户的身份登录,您应该在用户名中看到相同的名称

因此,您要么以root帐户登录,在这种情况下,错误将出现在bucket的创建方式(检查)
或者您正在使用AWS合作伙伴的SSO登录,在这种情况下,您在其中的权限有点不同,并且不受您在那里看到的IAM的控制。

当您尝试编辑bucket策略时,我假设您是通过控制台而不是cli来执行操作的?如果是,您是否检查了IAM权限?它们包括s3策略吗?是的,我正在控制台上执行。只有一个用户,并且只应用了
AdministratorAccess
策略。我现在已经附加了
AmazonS3FullAccess
策略,但是我仍然从XHR和编辑bucket策略中收到一个拒绝访问的错误。您能将此用户的策略复制到问题中吗?这主要是错误所在。还要再次检查您是否与该用户一起登录,如果您具有管理员访问权限,您应该能够修改s3。如果您共享控制台的一些屏幕截图,也会有所帮助。屏幕截图不可读,但可能的解释是,您的存储桶配置了多个选项,不允许公共访问,这可能会阻止您上载带有
public read
的文件,也可能会阻止您设置过于宽松的策略。我相信我在控制台中是以root帐户登录的,但我不知道我使用SDK登录的是哪个帐户。我使用了我的
AWS\u访问密钥\u ID
AWS\u SECRET\u访问密钥
登录。我的
.aws/config
文件中也有它们,但我认为这是用于CLI的?不幸的是,你提供的链接没有帮助。它有什么帮助?您是否完成了故障排除步骤?我完成了。规范ID匹配,我的bucket策略中没有任何冲突的deny语句,我已经验证了用于访问S3的用户凭据,我没有使用EC2实例,对象没有丢失,因为我试图发布,而不是获取,我不担心KMS加密,请求者付费未启用,我没有使用AWS组织。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}
{
    "Id": "Policy...237",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt...935",
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::coolwater-creations/*",
            "Principal": {
                "AWS": [
                    "...764"
                ]
            }
        }
    ]
}