如何授予对我的 Amazon S3 存储桶中某些对象的公开读取访问权限?

上次更新时间:2020 年 3 月 27 日

我希望可以公开读取我的 Amazon Simple Storage Service (Amazon S3) 存储桶中的某些对象。但是,我不希望更改对同一存储桶中其他对象的权限。我该如何操作?

简短描述

通过以下方法之一,启用公开读取访问权限:

  • 使用 Amazon S3 控制台更新对象的访问控制列表 (ACL)
  • 使用 AWS 命令行界面 (AWS CLI) 更新对象的 ACL
  • 使用存储桶策略,授予对特定对象标签的公开读取访问权限
  • 使用存储桶策略,授权对特定前缀的公开读取访问权限

解决方法

重要提示:在开始之前,请确认您在账户级别存储桶级别没有任何数据块公开访问设置阻止您将对象公开。默认情况下,数据块公开访问设置在新 S3 存储桶上设置为 True

使用 Amazon S3 控制台更新对象的 ACL

要一次公开多个对象,请执行以下步骤:

警告:公开多个对象后,无法一次为多个对象撤消此操作。要删除公开访问权限,您必须进入 Amazon S3 控制台中的每个对象,然后从对象的权限选项卡中,修改公开访问权限。您必须对希望撤消所授权的公开访问权限的每个对象执行此操作。在公开对象之前,请务必仔细检查对象列表。

  1. 打开 Amazon S3 控制台
  2. 从存储桶列表中,选择具有您要更新的对象的存储桶。
  3. 导航到包含相关对象的文件夹。
  4. 在对象列表中,选择要公开的所有对象。
  5. 选择操作,然后选择公开
  6. 公开对话框中,确认对象列表正确无误。
  7. 选择公开

要公开单个对象,请执行以下步骤:

  1. Amazon S3 控制台中,选择具有要更新的对象的存储桶。
  2. 导航到包含相关对象的文件夹。
  3. 通过选择对象名称上的链接打开对象。
  4. 选择权限选项卡。
  5. 公开访问权限下,请选择任何人
  6. 任何人对话框中,对于对该对象的访问权限,选择读取对象
  7. 选择保存

使用 AWS CLI 更新对象的 ACL

对于已存储在 Amazon S3 中的对象,您可以运行此命令来更新公开读取访问权限的 ACL:

aws s3api put-object-acl --bucket awsexamplebucket --key exampleobject --acl public-read

或者,您也可以运行此命令来授予 AWS 账户拥有者对于对象的完全控制权,并授予其他任何人读取访问权限:

注意:对于授予完全控制权的值,请输入账户的规范用户 ID

aws s3api put-object-acl --bucket awsexamplebucket --key exampleobject --grant-full-control id="008exampleA45666666668889999008853" --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers

使用存储桶策略,授予对特定对象标签的公开读取访问权限

重要提示:在开始之前,请务必查看 S3 对象标签定价

首先,添加一个存储桶策略,该策略允许公开读取具有特定标签的任何对象。例如,此策略允许公开读取具有键值对 public=yes 标签的任何对象:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::awsexamplebucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/public": "yes"
                }
            }
        }
    ]
}

然后,将该标签添加到您要公开读取访问权限的对象。您可以使用 Amazon S3 控制台添加对象标签。或者,也可以使用 AWS CLI。

要查看某个对象是否具有标签,请运行以下 AWS CLI 命令: 

aws s3api get-object-tagging --bucket awsexamplebucket --key exampleobject

要向没有标签的对象添加标签,请运行以下命令:

警告:此命令将覆盖对象的任何现有标签。 

aws s3api put-object-tagging --bucket awsexamplebucket --key exampleobject --tagging 'TagSet={Key=public,Value=yes}'

要向具有标签的对象添加标签,请运行以下命令。请务必包含新的对象标签,以及您要保留的现有标签。 

aws s3api put-object-tagging --bucket awsexamplebucket --key exampleobject --tagging 'TagSet=[{Key=public,Value=n},{Key=exampletag1,Value=one},{Key=exampletag2,Value=two}]'

在添加对象标签后,请运行以下命令,以查看所有对象的标签: 

aws s3api get-object-tagging --bucket awsexamplebucket --key exampleobject

使用存储桶策略,授权对特定前缀的公开读取访问权限

要授予对特定对象前缀的公开读取访问权限,请添加类似以下内容的存储桶策略: 

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

然后,将该对象复制到具有公开读取访问权限的前缀中。您可以通过运行与以下类似的命令,将对象复制到前缀中:

aws s3 cp s3://awsexamplebucket/exampleobject s3://awsexamplebucket/publicprefix/exampleobject

这篇文章对您有帮助吗?


您是否需要账单或技术支持?