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

2 分钟阅读
0

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

简短描述

通过以下方式之一授予公开读取访问权限:

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

重要提示:通过存储桶和对象 ACL 授予公开访问权限不适用于将“S3 Object Ownership”(S3 对象所有权)设置为 Bucket Owner Enforced(强制存储桶拥有者)的存储桶。在大多数情况下,不需要通过 ACL 授予对对象和存储的权限,而是使用 AWS 身份访问和管理 (IAM) 策略和 S3 存储桶策略授予对象和存储桶这类权限。

默认情况下,新的存储桶、访问点和对象不允许公开访问。如果为账户内的所有存储桶激活了阻止公开访问,则会显示消息 “存储桶和对象不公开”。要了解更多信息,请参阅为您的账户配置阻止公开访问设置

解决方法

**重要提示:**在开始之前,请确认您在账户级别存储桶级别没有任何数据块公开访问设置。您的设备不得阻止您将对象公开。默认情况下,数据块公开访问设置在新 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

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

**警告:**以下存储桶策略将对特定前缀下的所有对象授予公开读取访问权限。在您使用此存储桶策略之前,请确认您的使用案例支持前缀内的所有可公开读取对象。此策略不会授予列示的该前缀的访问权限。仅当对象路径已知时,用户才能访问该对象。访问该前缀中不存在的对象时,用户会收到 403 错误。

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

{
  "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

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


相关信息

配置 ACL

相关视频

AWS 官方
AWS 官方已更新 8 个月前