2026年9月30日 · 阅读约 6 分钟
如何公开 Amazon S3 存储桶
新建的 S3 存储桶会阻止所有公开访问,并且默认禁用 ACL,所以以前每个对象上的“设为公开”按钮已经不起作用了。现在,公开读取需要通过存储桶策略实现。
第 1 步:允许公开的存储桶策略
- 在 S3 控制台中打开存储桶,进入 Permissions 选项卡。
- 在 Block public access (bucket settings) 下选择 Edit。
- 取消勾选与 bucket and access point policies 相关的两项设置。两项 ACL 设置可以保持开启,因为该策略不使用 ACL。
- 保存并确认。
如果账号级别也开启了该设置(S3 侧边栏中的 Block Public Access settings for this account),它的优先级高于存储桶设置,也必须允许策略。
第 2 步:添加公开读取的存储桶策略
仍在 Permissions 中,编辑 Bucket policy,粘贴以下内容,并替换为你的存储桶名称:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/*"
}
]
}
该策略允许读取对象,但不允许列出存储桶。如果只想公开一个文件夹,请缩小资源范围,例如 arn:aws:s3:::your-bucket/public/*。
使用 AWS CLI 完成同样的两步:
aws s3api put-public-access-block --bucket your-bucket \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=false,RestrictPublicBuckets=false
aws s3api put-bucket-policy --bucket your-bucket --policy file://policy.json第 3 步:找到公开 URL
现在可以通过虚拟主机式 URL 访问对象:
https://your-bucket.s3.eu-central-1.amazonaws.com/2026/09/report.pdf
请使用你的存储桶所在的区域。如果该地址返回 AccessDenied,说明 Block Public Access 设置仍在阻止该策略,或者策略中的存储桶名称有拼写错误。
更安全的方案:CloudFront 加私有存储桶
如果你不想开放存储桶本身,可以保持 Block Public Access 开启,创建一个以该存储桶为源站并使用 Origin access control (OAC) 的 CloudFront 分配。CloudFront 会给出一条只允许该分配读取对象的存储桶策略。这样你既能在自己的域名上使用 HTTPS 和缓存,存储桶也保持私有。参见为存储桶链接使用自定义域名。
常见问题
为什么“Make public using ACL”不再起作用了?
自 2023 年 4 月起,新建存储桶的 Object Ownership 默认设为 Bucket owner enforced,这会禁用 ACL。公开访问必须通过存储桶策略或 CloudFront 实现。
公开存储桶会让别人列出我的文件吗?
使用上面的策略不会。它只允许 s3:GetObject。列出文件需要对存储桶本身的 s3:ListBucket 权限,而这个权限不应该公开授予。
公开存储桶会增加我的 AWS 账单吗?
别人下载文件时,你需要为请求和出站数据传输付费。对于分享量很大的文件,CloudFront 或没有出站流量费的服务商(例如 Cloudflare R2)通常更便宜。