【问题标题】:AWS S3 pre-signed POST access deniedAWS S3 预签名 POST 访问被拒绝
【发布时间】:2021-06-25 07:49:40
【问题描述】:

我正在尝试生成一个签名的 url,以便前端可以在上传照片时使用它,但是当我尝试生成的 url 时,它一直给我以下错误

 <Code>AccessDenied</Code>
 <Message>Invalid according to Policy: Policy Condition failed: ["eq", "$acl", "public-read"]</Message>

我生成预签名网址的后端代码

const params ={
        Bucket:'bucket-name',
        Fields:{
            key:'key-name',
            acl: 'public-read'
        },
        Expires:30*600,
        Conditions:[
            {"acl": "public-read"},
        ]
    }
    ;
    s3.createPresignedPost(params,(error,data) =>{
        console.log(error)
        res.send(data)
    })

还有我的 IAM 用户政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}

我的 CORS 政策

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE",
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

注意:我公开了 s3 存储桶,但同样的错误仍然存​​在

【问题讨论】:

  • 您的客户端是否包含 acl=public-read 的 POST 表单字段?
  • @jarmod 哦,我完全错过了,非常感谢,现在消息被拒绝访问,你知道为什么吗?
  • URL无所谓,body包含什么?
  • 您是说现在您添加了 acl=public-read,但您遇到了不同的错误消息?还是“拒绝访问”但是不再抱怨acl了?
  • 我认为您的意思是,如果您在 arn:aws:s3:::bucket-name/* 上使用允许 s3:* 的 IAM 策略,它现在可以工作,但它不适用于同一资源 ARN 上的 s3:PutObject。您可能还需要s3:PutObjectAcl,因为您提供了 ACL。

标签: node.js amazon-web-services amazon-s3


【解决方案1】:

这里有几个小问题:

  1. 在创建预签名 URL 时,您指明了 acl=public-read 的条件,因此您的客户必须在发布请求时包含 acl=public-read 的表单字段
  2. 由于您的客户端指示 ACL,与创建预签名 URL 的凭证关联的 IAM 策略必须同时允许 s3:PutObject 和 s3:PutObjectAcl。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 2018-07-20
    • 2015-09-22
    • 2022-01-28
    • 2019-08-30
    • 2019-02-03
    • 2017-07-28
    • 2018-02-07
    相关资源
    最近更新 更多