【问题标题】:Forbidden error 403 get in console while direct uploading to S3禁止错误 403 在直接上传到 S3 时进入控制台
【发布时间】:2020-09-23 10:44:27
【问题描述】:

我通过服务器将图像上传到 s3,但由于上传速度快,我想使用直接上传到 S3。 我使用django-s3direct 包直接上传。 我遵循所有步骤,但仍然出现此错误。

上传时控制台出现错误:

POST https://s3-ap-south-1.amazonaws.com/collegestudentworld-assets/img/mainpost/amar.jpg?uploads 403 (Forbidden)

initiate error: collegestudentworld-assets/img/mainpost/amar.jpg AWS Code: AccessDenied, Message:Access Deniedstatus:403

settings.py:

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME =os.environ.get('AWS_STORAGE_BUCKET_NAME')

AWS_S3_ENDPOINT_URL = 'https://s3-ap-south-1.amazonaws.com'
#'http://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/' #"https://collegestudentworld-assets.s3-website.ap-south-1.amazonaws.com/"
AWS_S3_REGION_NAME = 'ap-south-1'
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

STATIC_URL = 'http://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
S3DIRECT_DESTINATIONS = {
    'primary_destination': {
        'key': 'uploads/',
        'allowed': ['image/jpg', 'image/jpeg', 'image/png', 'video/mp4'],
    },
    'mainpost':{
        'key':'img/mainpost/',
        'auth': lambda u:u.is_authenticated
    },
}

存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads",
                "s3:ListBucketVersions"
            ],
            "Resource": "arn:aws:s3:::collegestudentworld-assets/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:*Object*",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::collegestudentworld-assets/*"
        }
    ]
}

CORS 配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://127.0.0.1:8000</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>*.collegestudentworld.com</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

在我的浏览器控制台中,我得到了这个:

    Starting img/mainpost/amar.jpg reason: first file

    initiate getPayloadSha256Content: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

initiate V4 CanonicalRequest: POST
/collegestudentworld-assets/img/mainpost/amar.jpg
uploads=
content-type:image/jpeg
host:s3-ap-south-1.amazonaws.com
x-amz-acl:public-read
x-amz-date:20200604T125344Z
content-type;host;x-amz-acl;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
V4 stringToSign: AWS4-HMAC-SHA256
6f90e1d9b91a3e557fe7f531fd735b407e29cc7f28f30655322ab5ad9ae17940
initiate signature: ebd6d06d109fff2ac35f49314a429e57019c48288073e4549d6d4c1b7ec2a10b
initiate getPayloadSha256Content: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

POST https://s3-ap-south-1.amazonaws.com/collegestudentworld-assets/img/mainpost/amar.jpg?uploads 403 (Forbidden)

initiate error: collegestudentworld-assets/img/mainpost/amar.jpg AWS Code: AccessDenied, Message:Access Deniedstatus:403

编辑:

当我将阻止公共访问(存储桶设置)设置为 **OFF 时。然后一切正常。**

但我有私人的用户信息。我不想公开。 可以公开吗..任何想法都比x

【问题讨论】:

  • 403 表示您无权访问。您的代码看起来好像没有向任何东西提供AWS_SECRET_ACCESS_KEY。您是否查看过 API 文档以了解发送请求的正确方法?
  • 您能否发布该用户的 IAM 政策?
  • 感谢快速回复...在直接上传之前它正在工作。 “AWS_SECRECT_ACCESS_KEY”是正确的。我将再次查看文档。我从这里link@SvenWritesCode
  • @jellycsc IAM 策略我在问题存储桶策略中显示。请检查一下。谢谢

标签: javascript django amazon-web-services amazon-s3 file-upload


【解决方案1】:

如果用户的 IAM 政策设置正确,那么您可以尝试以下这些建议。您可以尝试在存储桶策略中添加 principal 值,而不是 IAM 策略。还要确保Block public access (account settings) 已关闭并且您的存储桶具有公共访问权限。

你可以试试这个解决方案:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3Permissions",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::collegestudentworld-assets/*"
        }
    ]
}

您还可以从CORS 设置中删除&lt;AllowedOrigin&gt;http://127.0.0.1:8000&lt;/AllowedOrigin&gt;,也可以尝试您的网站或EB 环境名称的完整路径。

 <?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*.collegestudentworld.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>

【讨论】:

  • 从这里link.. 他们提供两个选项,一个是 IAM ,第二个是 EC2 。请查看link 一次。我使用 django-s3direct 直接上传
  • 在 django-s3direct.all 之前一切都很完美。我通过服务器上传了图像,但是上传需要很多时间。然后我使用 django-s3direct 直接上传。但我得到了那个错误。我按照 django-s3direct link 的文档做了所有事情
【解决方案2】:

这是我使用的 IAM 政策。我会确保附加到上传策略的 IAM 用户附加了正确的 IAM 策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:HeadBucket"
            ],
            "Resource": "arn:aws:s3:::collegestudentworld-assets/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:*Object*",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": "arn:aws:s3:::collegestudentworld-assets/*"
        }
    ]
}

【讨论】:

  • 问题是公共访问被阻止。我的政策是正确的。但我不想公开访问,因为用户的信息是私人的。有什么办法
  • 我不太确定我理解你的意思。您能否确认您编写的策略已附加到具有相应AWS_ACCESS_KEY_ID 的用户?
  • AWS_ACCESS_KEY_ID 已附加到用户。当我关闭公共访问权限时,它就可以工作了。但是当我打开阻止公共访问时,我会收到禁止错误。但我的访问密钥 ID 和用户已连接。没有直接上传它正在工作(使用阻止公共访问)只是需要很多时间。所以我尝试直接上传,但出现上述错误。
  • 对不起,如果我是多余的。我试图弄清楚AWS_ACCESS_KEY_ID 定义的用户是否具有您创建的附加到该用户的策略。如果我不清楚,这里有一个可能会有所帮助的网址:docs.aws.amazon.com/AmazonS3/latest/dev/… 如果它公开有效,那么您就快到终点了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2013-06-27
  • 2023-01-30
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多