不知道你有没有遇到过这种场景:开发环境里图片显示得好好的,一上生产就翻车——前端拿到的图片地址要么打不开,要么直接变成下载,要么干脆给你一个 403。我自己做独立项目那会儿轮流试过好几个图床方案,最后兜兜转转还是回到 Amazon S3。这篇就把我从零开始,把一张本地图片通过 S3 上传、配置成 Public,最后拿到一个能在浏览器里直接打开的 URL 的完整过程记录下来。
你要是以为“这不就是控制台里点两下的事”,那后半段你会很意外。光是 Block Public Access 这一个默认开关,就能卡住一大批人。文章会覆盖两种公开访问路线的选择、控制台和 CLI 两种上传方式、图片打开变成“下载”的坑、以及 403 报错的完整排查链路。适合第一次用 AWS 的朋友,也适合那些之前总在 S3 权限上栽跟头、这次想一次性搞明白的开发者和运维。
1. 先把思路理清:Public 公开访问的两种主要路线
很多人一上来就奔着“让链接能直接打开”去,结果把 Bucket 权限开到最大,最后又担心数据裸奔。S3 的公开访问其实不是只有“全公开”一种玩法,动手之前先得选对路线。
1.1 整个 Bucket 打开公读:适合当静态资源仓库
路线一就是让整个 Bucket 里的对象都允许匿名 GET 请求。任何人在浏览器输入 Object URL,就能直接看到图片。适合头像、商品图、文章配图、分享页素材这类本来就要给全网用户看的内容。
实现这种效果最推荐的办法,是往 Bucket 里写一条 Bucket Policy。你用不着在上面勾什么“公开读写”,只需要声明一条 s3:GetObject 允许所有人访问的策略,S3 就会把对象以“公开可读”的方式返回。
这种路线的优点是简单、直接,控制台上传完文件,外面立刻能访问;缺点是你得接受“这个 Bucket 里的任何文件都是公开的”这个事实。所以 Bucket 本身要专桶专用,别把私密资料和数据备份往里塞。
1.2 私有 Bucket + 预签名 URL:适合受限场景
路线二是反过来,Bucket 保持全私有,只有拿到有效链接的人才能访问。这靠的是 预签名 URL(Presigned URL)。你指定一个对象和过期时间,AWS 会生成一串带签名参数的临时链接,链接到期后自动失效,外面再打开就是 403。
预签名 URL 适合哪些场景?临时交付文件、给客户发几张订单截图、用户之间的隐私图片分享,还有付费内容的短时预览。它比全公开更安全,因为你可以控制有效期、只能访问指定对象,而且不需要改 Bucket 的任何权限。
这两种路线可以同时存在:同一个 Bucket 里,你想公开的图片用公有读策略,想私密的对象照样可以通过预签名链接单独分享。
| 对比项 | 整个 Bucket 公读 | 私有 Bucket + 预签名 URL |
|---|---|---|
| 适用内容 | 静态资源、公开图片 | 隐私数据、临时文件 |
| 链接有效期 | 永久有效 | 可自定义到期时间 |
| 访问控制粒度 | 整个 Bucket 匿名只读 | 指定对象、指定时长 |
| 实现成本 | 一条 Policy 搞定 | 每次生成链接需调用 API |
| 防误伤风险 | 高,别乱放文件 | 低,可控性强 |
如果你要做的是“上传图片并通过链接直接打开”,先问自己一句:这些图片是不是永远不需要收回来?如果答案是“是”,走路线一;答案不确定,走路线二更稳妥。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:账号、Bucket 创建与权限模型中的三个关键设置
路线确定后,开始搭环境。这部分的坑密度最高,我几乎每次给朋友远程排查 S3 问题,最后都能回到这三个地方。
2.1 不要用根账号操作,先建一个 IAM 用户
登录 AWS 之后,第一件事不是创建 Bucket,而是去 IAM 控制台建一个专用用户。我见过不少人在根账号下顺手点完了所有配置,后来项目交接、权限回收全都说不清。
建议创建一个 IAM 用户,分配 AmazonS3FullAccess 权限就够了。如果是做生产环境,更精确的做法是只给指定 Bucket 的读写权限。I AM 策略大概长这样:
json复制{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
这个用户创建好之后,会有一对 Access Key ID 和 Secret Access Key。后面用 AWS CLI 上传图片时要用到,下载 CSV 或自己记好,别随手发群里。
2.2 创建 Bucket 时连续踩中的三个坑
打开 S3 控制台,点 Create bucket,第一步就有一堆选项。新手最容易在这三个地方翻车。
坑一:Bucket 名称必须全局唯一。
S3 的 Bucket 名是全世界唯一的,你没法起一个叫 images 的 Bucket,因为它早被别人注册了。命名建议带上项目名和用途,比如 blog-image-public-2025。名称只能用小写字母、数字、点号和短横线。
坑二:区域选择会影响访问延迟和 URL 写法。
同理,你会想选离目标用户最近的区域。面向国内用户,东京 ap-northeast-1 或新加坡 `ap-sout
