AWS企业账号购买 亚马逊云S3存储桶策略编写与图片防盗链配置指南
先给出决策要点(适合忙碌的运维/负责人)
- 要做图片防盗链,优先考虑“CloudFront + OAC + WAF 规则”。S3 直接用 Referer 条件可行但容易误伤与被绕过。
- 新账号直连公网高流量容易触发风控审查,先接入 CDN、设置预算与告警,再逐步放量。
- 支付方式以绑定信用卡为主。虚拟卡、预付卡成功率不稳定,高峰期更容易失败。预算、账单告警和成本标签要先配好。
- AWS企业账号购买 企业使用建议:根账号只做财务与安全,创建独立管理员用户,开启MFA、SCP限制公开Bucket,避免误公开。
- 跨平台分享(微信、iOS App、隐私浏览)Referer 可能缺失或被清洗,CloudFront 签名URL/WAF 规则需要“空Referer放行白名单”策略。
- 成本:直连S3出网计费通常高于通过CloudFront且无缓存。图片业务强烈建议CDN缓存+合适TTL,常规可降30%—70%出网成本。
账号开通、实名认证、支付与风控要点
1) 账号开通与实名认证
- AWS企业账号购买 全球站(aws.amazon.com):注册邮箱验证、手机号验证、绑定信用卡。无统一“实名认证”,但大额用量或风险触发时会二次核验身份。
- 中国区(由光环新网/西云数据运营):需要企业/个人实名认证、域名备案,CloudFront(中国)与S3(中国)为独立计费。
- 不建议购买“二手账号”。多数存在付款资料不一致、风控历史、信用受限,一旦审查很难申诉成功。
2) 支付方式与续费
- 信用卡最稳;借记卡成功率看发卡行支持的国际支付通道。3D Secure 开启更稳。
- 账单为后付费月结,按用量记费。无“充值续费”概念,若需要预算锁定,可通过“预付Credits/代金券”或第三方采购抵扣(注意来源合规与发票)。
- 常见支付失败:风控拒付、额度不足、卡BIN禁用、地址/姓名不一致。新账号高并发出网也会导致额外核验。
3) 风控审核触发与缓解
- 触发典型:新账号48小时内大量公网出网、频繁创建公开Bucket、账单异常激增、跨国登录异常。
- 缓解:先接入CloudFront、设置Budgets与Cost Anomaly Detection、按业务域名分发、逐步放量并保留接入日志。
- 被风控暂停:准备公司营业执照/官网/业务说明、域名所有权、样例链接与用途说明,走工单渠道解释用例与合规性。
三种常见防盗链路线(按业务场景选择)
-
仅用S3存储桶策略(Referer条件)
- 适合:小流量、内部工具、临时资源。
- AWS企业账号购买 优点:配置快。
- 风险:Referer 可被清洗/伪造;社交平台、小程序、隐私模式常无Referer;需要调整公共访问设置,误操作易公开数据。
-
CloudFront + OAC(或OAI)+ WAF 规则
- 适合:对外图片分发的主流业务。
- 做法:S3保持私有,仅允许CloudFront取源;在CloudFront做Referer或Token校验,并用WAF落规则。
- 优点:缓存降本、可细粒度规则、HTTPS与HTTP/2支持、观察命中率与误伤。
-
私有内容:签名URL(Pre-signed URL 或 CloudFront Signed URL/Cookie)
- 适合:付费资源、短期授权、下载原图。
- 优点:强控制;缺点:需要应用侧发放与刷新。
实操:S3 存储桶策略与图片防盗链配置
步骤A:创建与加固存储桶
- 新建Bucket时,保持“阻止所有公共访问”开启(默认)。这用于走“CloudFront + OAC”。
- 开启版本化(误删回滚)、启用服务器端加密SSE-S3或SSE-KMS(合规要求)。
- 按目录划分前缀:img/, thumb/, origin/,便于生命周期与缓存策略分层。
步骤B:CloudFront + OAC(推荐)
- 创建CloudFront分配,Origin选择S3的“REST端点”(不要选Website端点)。
- 启用OAC(Origin Access Control),签署请求并将策略附加到Bucket。
- 在S3存储桶策略中仅允许来自该分配的读取:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontOACRead",
"Effect": "Allow",
"Principal": { "Service": "cloudfront.amazonaws.com" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::YOUR_ACCOUNT_ID:distribution/YOUR_DISTRIBUTION_ID"
}
}
}
]
}
- 确保Bucket仍为私有(阻止公共访问=开启)。CloudFront能取源,外部无法直连S3。
- 在CloudFront设置缓存策略:图片建议默认TTL 1天—7天;热门目录更长,易变资源更短。
步骤C:CloudFront 层做防盗链
- 方案1:WAF基于Referer的规则(兼容空Referer放行的白名单)。示例逻辑:
- 如果Referer包含 yoursite.com 或 img.yoursite.com -> 允许;
- 如果Referer为空且UA在白名单(如微信/自家App)-> 允许;
- 其他 -> 阻断或返回自定义占位图(用自定义错误响应)。
- 方案2:CloudFront Signed URL/Cookie(强控制)。对原图/大图只允许签名访问,对缩略图开放Referer/WAF策略。
步骤D:仅S3策略Referer(不推荐为主线,仅供小场景)
- 需要在Bucket上允许公共读取但限制Referer;必须关闭“阻止公共访问”中的相应选项,风险较高,操作需有审计与回滚。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyIfBadReferer",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"*://yoursite.com/*",
"*://*.yoursite.com/*"
]
}
}
},
{
"Sid": "AllowRead",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
}
]
}
注意:Referer可被伪造;部分场景Referer缺失会被拒绝。务必灰度测试并准备回滚。
步骤E:预签名URL(应用后端)
// 以Node.js AWS SDK v3为例(伪代码)
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
const client = new S3Client({ region: "us-east-1" });
const command = new GetObjectCommand({ Bucket: "YOUR_BUCKET", Key: "path/image.jpg" });
const url = await getSignedUrl(client, command, { expiresIn: 300 }); // 5分钟
// 将url下发给前端展示
步骤F:CORS与跨域
- 若前端域名与图片域名不同,S3/CloudFront默认展示图片无需CORS,但若前端要读像素或Canvas操作,需要GET允许。
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET"],
"AllowedOrigins": ["https://img.yoursite.com", "https://www.yoursite.com"],
"ExposeHeaders": []
}
]
AWS企业账号购买 常见错误与排障清单
- AccessDenied: 响应来自S3而非CloudFront,通常是OAC未生效、源站选择了Website Endpoint、或Bucket策略缺少AWS:SourceArn。
- 图片403:启用了“阻止公共访问”,却又用公共策略放行Referer;两者冲突导致拒绝。
- 小程序/微信内无法显示:Referer缺失被拦;在WAF中对特定UA与空Referer放行,或改用签名URL。
- 命中率低、成本升高:缓存TTL过短、路径带随机查询参数、未做尺寸分层缓存(原图直出)。
- 社交抓取失败(OG/Twitter):爬虫Referer与UA不在白名单,需给主流爬虫例外或用备用图。
- 预签名URL过期:移动端缓存URL失败,请求重试逻辑需区分403过期与真正拒绝。
成本测算与对比(以us-east-1为例,价格以官方为准)
AWS企业账号购买 假设:月存储300GB,日请求200万次,月对外出网5TB。
| 方案 | 出网 | 请求 | 存储 | 合计估算 | 备注 |
|---|---|---|---|---|---|
| 直连S3(无CDN) | 5TB x $0.09 ≈ $450 | 200万 GET/月,按$0.0004/千次 ≈ $0.8 | 300GB x $0.023 ≈ $6.9 | ≈ $458 | 无缓存,峰值抖动大 |
| CloudFront + S3(命中率70%) | CloudFront出网:5TB x $0.085 ≈ $425 | 回源30%请求至S3:60万 x $0.0004/千次 ≈ $0.24 | 同上 ≈ $6.9 | ≈ $432 | S3→CloudFront取源免费;命中率越高越省 |
| CloudFront 命中率90% + 缩略图 | 5TB x $0.085 ≈ $425 | S3请求10%:20万 ≈ $0.08 | 存储略增(含缩略图+1/3体量)≈ $9.2 | ≈ $434 | 图像处理前置后稳定且更抗抖 |
- 大部分业务提升命中率后,综合成本会继续下降,且带来更稳定的性能。
- 若区域选择东京/悉尼等,出网单价更高;可结合主要用户区域选择分布和定价。
不同地区与合规模块差异
- 全球站:无需备案,跨境流量;适合海外用户。中国大陆访问走跨境链路,延迟与丢包受网络波动影响,建议使用CloudFront全球加速。
- 中国区:需要备案与实名认证;CloudFront(中国)节点与全球分开计费,域名需在工信部备案。Referer/WAF策略同理,但支付与合同在境内。
- 数据合规:涉及用户上传图库,建议KMS管理密钥与日志留存,满足内部审计。
实际案例:电商图片外链被薅带宽,如何压住成本
背景:某跨境电商,日PV 300万,图片多域名散布,S3直出。一天内被第三方论坛批量引用,出网瞬间翻倍。
- 48小时止血:接入CloudFront,默认TTL 1天,S3保持私有+OAC;立刻把流量从S3直出切到CDN。
- 72小时规则:WAF上线Referer白名单(站点域名)、空Referer+微信UA放行,其他返回自定义占位图。
- 两周优化:原图仅签名URL访问,页面只用WebP/JPEG压缩版本;命中率提升到92%。
- 结果:出网账单较异常前下降约38%,S3请求数下降约80%,误伤率低于0.3%(通过日志识别误拦后补充白名单)。
FAQ(基于一线问题)
- Q: 必须关掉“阻止公共访问”才能做防盗链吗?
A: 用CloudFront + OAC 不需要。仅用S3 Referer策略才需要开放公共读取,风险更高。 - Q: 微信/小程序图片加载失败?
A: Referer可能为空或被清洗。WAF需允许空Referer且匹配UA;或对该场景改用短期签名URL。 - AWS企业账号购买 Q: 预签名URL被二次转发怎么办?
A: 缩短过期时间+绑定IP/UA(CloudFront自定义签名策略);对高价值资源只放缩略图公开。 - Q: 新账号当月猛增带宽会不会被限制?
A: 可能会触发风控核验。提前开工单说明业务、准备域名证明、合理放量并有日志佐证,通常可平稳放开。 - Q: 信用卡被拒付导致服务中断?
A: 绑定两张独立卡,开启账单告警,设置低额备用Credits。被拒付72小时内未恢复,可能影响服务。 - Q: 静态网站托管是否能配OAC?
A: S3 Website Endpoint不支持OAC。若要OAC,请用S3 REST Endpoint做源,静态路由重写在CloudFront完成。
AWS企业账号购买 落地与审计建议(可直接照做)
- 安全基线:Root账户MFA;使用IAM Identity Center或最小权限;SCP阻止创建Public Bucket策略。
- 成本管控:按环境/业务打上成本标签;Budgets分域名/分区域;每周看一次CloudFront命中率与Top路径。
- 灰度与回滚:先对10%流量启用WAF防盗链规则,观察误伤;准备一键回滚到“仅缓存不拦截”的备份行为。
- 可观测性:开启CloudFront访问日志(S3或Kinesis Firehose)、WAF日志、S3 Server Access Logging,用于取证与白名单迭代。
- 合规:对于用户上传图片,设置对象锁与版本化;敏感目录用KMS CMK并限制解密权限。
