我希望我的 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