本文档适用于:不用 CloudFront,直接使用 Amazon S3 作为图床,让图片可以通过 S3 URL 公开访问,同时只允许你自己的图床工具上传文件。
提醒:S3 直连公开访问适合个人博客、小流量图床、临时分享等场景。如果访问量较大,或担心盗链和流量费用,更推荐使用 CloudFront + 私有 S3 Bucket。
1. 费用和抵扣说明
如果你的 AWS credit 覆盖 Amazon Simple Storage Service,那么 S3 相关费用通常可以被抵扣。
常见费用包括:
- S3 存储费
- PUT、GET、LIST 等请求费用
- S3 对公网下载的数据传输费用
- 跨区域复制或跨区域传输费用
- Glacier / IA 等存储类型的数据取回费用
- S3 Inventory、Storage Lens、Batch Operations、Replication 等管理功能费用
注意:
- 上传到 S3 的公网入站流量通常免费。
- 删除对象通常免费。
- 税费通常不能用 credit 抵扣。
- 如果使用 KMS、Lambda、CloudWatch、CloudFront 等其他服务,费用会归到对应服务下,是否抵扣取决于 credit 是否覆盖这些服务。
- 图片公开后,任何人都可以访问公开路径下的文件。如果被盗链,GET 请求和公网流量可能产生费用。
2. 创建 S3 Bucket
进入:
推荐配置:
说明:
- Bucket 名称必须全球唯一。
- 建议只使用小写字母、数字和短横线。
- Bucket 创建后 Region 不能修改。
Bucket owner enforced会禁用 ACL,这是现在更推荐的对象所有权模式。
3. 配置 Block Public Access
因为本文方案不用 CloudFront,而是让图片通过 S3 原始 URL 直接公开访问,所以需要允许 Bucket Policy 公开读取对象。
进入:
建议四项这样设置:
也就是:
- 继续禁止 ACL 公开。
- 允许通过 Bucket Policy 公开读取指定路径。
如果保存 Bucket Policy 后仍然无法公开访问,还需要检查账号级设置:
账号级、组织级和 Bucket 级 Block Public Access 会叠加生效,AWS 会按最严格的规则执行。
4. 配置 Bucket Policy:公开读取图片
进入:
如果只想公开
images/ 目录下的图片,使用:示例:
这个策略只允许任何人读取
images/ 下的对象,不允许上传、删除、列目录。公开访问地址格式:
示例:
如果你想公开整个 Bucket,可以把 Resource 改成:
但图床场景更建议只公开
images/ 前缀。5. 创建 IAM 用户给图床工具上传
Bucket Policy 负责公开读图片,IAM 用户负责让你的图床工具上传图片。这是两套不同权限。
进入:
创建一个专门用于图床的 IAM 用户,例如:
创建后,为这个用户添加最小权限 Policy。
如果图床只需要上传和读取对象,使用:
如果图床工具还需要列目录、检测路径或读取 Bucket 所在区域,使用这个版本:
不要给这个 IAM 用户以下权限:
如果不需要删除图片,就不要给
s3:DeleteObject。6. 创建 Access Key
进入该 IAM 用户:
创建 Access Key,并保存:
注意:
- Secret Access Key 只显示一次。
- 不要把 Access Key 放到网页前端代码里。
- 如果是 PicGo、ShareX、uPic 等本机图床工具,可以填入 Access Key。
- 如果是自己的网站上传,应使用后端上传,或由后端生成 presigned upload URL。
7. 图床工具配置
图床工具里一般填写:
示例:
上传后的图片 URL 通常是:
如果 Bucket 在
us-east-1,也建议使用带 Region 的地址:8. 图床工具中的 ACL 设置
如果图床工具有这些选项:
推荐设置为:
不要设置:
也尽量不要设置:
原因:
- 当前方案使用 Bucket Policy 公开读取,不依赖 ACL。
- Bucket 使用
Bucket owner enforced时,S3 会禁用 ACL。
- 如果图床工具上传时发送 ACL,可能会报错。
常见错误:
遇到这个错误,通常就是图床工具在上传时发送了 ACL,需要关闭 ACL 设置。
9. 测试上传和访问
- 用图床工具上传一张图片。
- 确认上传路径是
images/。
- 打开返回的图片 URL。
正确 URL 示例:
如果图片能直接在浏览器打开,说明配置成功。
10. AccessDenied 排查
如果打开图片提示:
按以下顺序检查。
10.1 图片是否在 images/ 路径下
如果 Bucket Policy 是:
那么只有这个路径能公开访问:
下面这个路径不会公开:
10.2 Block Public Access 后两项是否取消
确认 Bucket 级设置是:
如果后两项仍然开启,S3 会阻止或忽略公共 Bucket Policy。
10.3 账号级 Block Public Access 是否仍然开启
进入:
如果账号级仍然阻止公共 Bucket Policy,Bucket 里的公开策略也可能不生效。
10.4 Bucket Policy 的 bucket 名是否正确
确认:
Bucket 名称必须完全一致。
10.5 URL 的 Region 是否正确
推荐使用:
不要把所有区域都写成:
11. 上传失败排查
如果图床上传失败,优先检查以下内容。
11.1 图床路径是否是 images/
IAM Policy 如果只允许:
那图床必须上传到:
如果图床上传到根目录,会被拒绝。
11.2 Access Key 是否属于正确 IAM 用户
确认图床里填的 Access Key 是
s3-image-uploader 这个用户生成的。11.3 IAM Policy 是否附加到正确用户
进入:
确认 Policy 已经附加。
11.4 ACL 是否关闭
如果错误是:
把图床工具里的 ACL 改成:
11.5 是否需要额外客户端权限
部分 S3 客户端可能会额外调用:
如果确认 Bucket 名、Region、Access Key 都正确,但客户端仍然报权限不足,可以检查报错信息里缺少哪个 Action,再按最小权限原则补充。
12. 可选:配置 CORS
如果只是把图片用于网页展示,例如 Markdown、博客、
<img> 标签,通常不需要配置 CORS。如果你要在浏览器前端直接上传,或用 JavaScript
fetch、Canvas 读取图片,可能需要配置 CORS。进入:
示例:
如果你要前端直传 S3,需要再允许
PUT,但更推荐由后端生成 presigned upload URL。13. 建议设置预算告警
虽然 AWS credit 可能可以抵扣 S3 费用,但仍然建议设置预算告警。
进入:
建议创建月度预算,例如:
设置邮件提醒:
这样可以避免 credit 用完或配置错误造成真实扣费。
14. 最终推荐配置总结
Bucket:
Block Public Access:
Bucket Policy:
IAM 用户:
图床工具:
最终图片地址示例:
- Author:Nico
- URL:https://tangly1024.com/article/7
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!




