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

上次更新日期:2020 年 10 月 20 日

我希望可以公开读取我的 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 DOC-EXAMPLE-BUCKET --key exampleobject --acl public-read

注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

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

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

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --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:::DOC-EXAMPLE-BUCKET/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/public": "yes"
                }
            }
        }
    ]
}

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

要检查对象是否具有任何现有标签,请运行以下 AWS CLI 命令:

aws s3api get-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject

要将标签添加到没有任何现有标签的对象,请运行以下命令:

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

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

要将标签添加到有现有标签的对象,请运行以下命令。请务必在命令中包含新的对象标签以及要保留的现有标签。

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

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

aws s3api get-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject

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

警告:以下存储桶策略将对特定前缀下的所有对象授予公开读取访问权限。在您使用此存储桶策略之前,请确认您的使用案例支持前缀内的所有可公开读取对象。 

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

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

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

aws s3 cp s3://DOC-EXAMPLE-BUCKET/exampleobject s3://DOC-EXAMPLE-BUCKET/publicprefix/exampleobject

这篇文章对您有帮助吗?


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