如何在不使用预签名 URL 的情况下在 s3 私有存储桶中创建 s3 对象 public

How to make an s3 object public in s3 private bucket without using presigned URLs

我有一个具有以下策略的 s3 存储桶

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

}

存储桶 public 访问也被阻止。这是存储桶策略的快照

基本上我希望存储桶是私有的,以防止未经授权的用户上传文件,但我想授予任何用户public读取存储桶内对象的权限

您似乎希望允许 任何人 检索对象,但不应允许他们做任何其他事情。

有两种方法可以实现:

1.使用 ACL

您可以将 public-read ACL 分配给各个对象。这还需要为两个 ACL 相关选项停用 S3 Block Public 访问权限。

这样,您的存储桶将保持私有,但如果对象的名称已知,则可以访问这些对象。 (列表未启用。)

2。使用存储桶策略

此策略将允许任何人访问存储桶中的对象:

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

它将允许任何获取对象的尝试,但不允许列出、删除等

对于上述两个选项,如果您希望“授权”用户能够执行上传和删除对象等操作,那么这些权限应该直接分配给 IAM 用户(不使用 S3 存储桶策略)。