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

上次更新日期:2021 年 7 月 8 日

我希望可以公开读取我的 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.    选择 Actions(操作),然后选择 Make public(公开)。

6.    在 Make public(公开)对话框中,确认对象列表是否正确。

7.    选择 Make public (公开)

要公开单个对象,可以重复上一过程或按照以下步骤操作:

1.    在 Amazon S3 控制台中,选择具有要更新的对象的存储桶。

2.    导航到包含该对象的文件夹。

3.    通过选择对象名称上的链接打开对象。

4.    选择 Permissions (权限)选项卡。

5.    选择 Edit(编辑)。

6.    在 Everyone(所有人)部分,选择 Objects Read(对象读取)。

7.    选择 I understand the effects of these changes on this object(我了解这些更改对此对象的影响)。

8.    选择 Save changes (保存更改)l。

使用 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

注意:授予公开读取访问权限无需复制对象,具体取决于对象的前缀。


这篇文章对您有帮助吗?


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