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

2 分钟阅读
0

我希望我的 Amazon Simple Storage Service(Amazon S3)桶中的某些对象可以被公开读取。但是,我不想更改同一桶中其他对象的权限。

简短描述

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

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

重要事项: 通过桶和对象 ACL 授予公共访问权限不适用于将 S3 对象所有权设置为强制桶所有者的桶。在大多数情况下,无需 ACL 向对象和桶授予权限。而是使用 AWS Identity Access and Management(IAM)策略和 S3 桶策略向对象和桶授予这类权限。

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

解决方法

**重要事项:**在开始之前,请确认您在账户级别桶级别层面不存在任何阻止公共访问设置。您的设置不得阻止您公开这些对象。默认情况下,新 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.选择我了解这些更改对该对象的影响

8.选择保存更改

使用 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 账户所有者授予对该对象的完全控制权,并向其他所有人授予读取权限:

**注意:**对于 --grant-full-control 的值,请输入账户的规范用户 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 官方已更新 2 年前