如何授予对 Amazon S3 存储桶中某些对象的公开读取访问权限?
我希望我的 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
**注意:**授予公开读取访问权限无需复制对象,具体取决于对象的前缀。
相关信息
相关内容
- 已提问 4 个月前lg...
- 已提问 4 个月前lg...
- 已提问 1 个月前lg...
- 已提问 4 个月前lg...
- 已提问 2 个月前lg...
- AWS 官方已更新 8 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前