2026年9月30日 · 阅读约 6 分钟

如何公开 Amazon S3 存储桶

新建的 S3 存储桶会阻止所有公开访问,并且默认禁用 ACL,所以以前每个对象上的“设为公开”按钮已经不起作用了。现在,公开读取需要通过存储桶策略实现。

第 1 步:允许公开的存储桶策略

  1. 在 S3 控制台中打开存储桶,进入 Permissions 选项卡。
  2. 在 Block public access (bucket settings) 下选择 Edit。
  3. 取消勾选与 bucket and access point policies 相关的两项设置。两项 ACL 设置可以保持开启,因为该策略不使用 ACL。
  4. 保存并确认。

如果账号级别也开启了该设置(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)通常更便宜。