用AWS S3做博客图床
2023年4月20日更新:已根据官方指南「限制对 Amazon S3 源的访问」将CloudFront向S3发送身份验证的请求的方式从源访问身份(OAI)迁移到源访问控制(OAC)。
去年六月,因为Bitcron对于音频视频的限制,我把图床1搬到了Blot。Blot用的是AWS所以特别快,但是最近他们把图片全部搬回自己的主机了,别问理由,问就是太贵。我心想反正放静态文件,虽然当然用Dropbox同步仍旧是最轻松的方式,但文件类更改频率并不高,存放方式的差异也不大,那要不我自己直接放AWS好了。花了好些天查资料,终于跟上了时代的潮流,大概了解了对象储存是啥玩意儿,也终于知道大家口中的bucket的含义了。武装好理论知识后好像世界又变大了一些,对象储存真香!啥都能干!
其实很多大厂都有提供对象储存服务,比如阿里云OSS2、腾讯云COS3,还有今天我要说的亚马逊S34。我也想投入社会主义怀抱,网上攻略看来国内产品更贴心,但是无奈备案太繁琐,我也不想备案。又说S3是鼻祖被各种借鉴,那本着对第一个吃螃蟹的勇气的好感,我就先会一会S3吧!
图床要求
- 支持图片
jpg, gif
、音频mp3
、视频mp4
- 自定义域名
cdn.shuiba.co
- 支持https
- 防盗链
- 价格合理
- 最好有CDN加速
现在都是按需付费,用多少付多少,收费模式还是比较合理的。
搭建步骤
-
1) 在S3创建存储桶bucket,命名为自定义域名,比如我的是
cdn.shuiba.co
,选择一个亚洲区域理论上会快一些(我选的是亚太地区 (东京) ap-northeast-1
);
2) 稍后会启用CDN,所以这里不需要关闭“阻止所有公有访问”,保持存储桶和对象不是公有的更安全。同理,存储桶策略也不需要修改;
3) 上传静态文件,此时每个文件都会生成一个支持https的对象URL,例如https://s3-区域名.amazonaws.com/bucket名/文件名.jpg
,但因为设置为非公开,所以无法访问。 -
1) 在CloudFront上创建Web分配;
2) 源配置:源域名下拉选择对应S3 bucket;“限制存储桶访问”选择“是”并创建新身份;“授予对存储桶的读取权限”选择“是”的话会在bucket权限的“存储桶策略”中自动写入授权命令;
3) 默认缓存行为设置:“查看器协议策略”选择“将 HTTP 重定向到 HTTPS”;
4) 分配设置:“价格级别”选择“使用美国、加拿大、欧洲、亚洲、中东和非洲”能省点钱;先不写“备用域名(CNAMEs)”,“SSL 证书”选默认,稍后设置;
5) 分配部署好之后,会指定一个一串数值.cloudfront.net
域名,将此域名替换掉对象URL的前缀——https://一串数值.cloudfront.net/文件名.jpg
——便能公开访问对象文件。 -
1) 打开刚刚在CloudFront上创建的分配,编辑“常规”;
2) 在“SSL证书”下方点击“使用ACM请求或导入证书”,跳转到对应页面。这里注意区域一定要是美国东部 (弗吉尼亚北部) us-east-1
,否则证书无效;
3) 输入自定义域名,选择DNS验证,在域名商处按要求修改DNS,等待验证通过;
4) 继续在域名商处为自定义域名创建CNAME指向一串数值.cloudfront.net
;
5) 刷新CloudFront编辑页面,“备用域名(CNAMEs)”里填上自定义域名;选择“自定义SSL证书”,下拉选择刚刚生成的证书,保存修改;
6) 现在你可以通过自定义域名来访问对象文件了,比如我的文件URL就变成了https://cdn.shuiba.co/文件名.jpg
。
遗留问题
记忆力好的旁友们相信已经发现了,咋没有防盗链呢?亚马逊官方提供的signed URL和signed cookie我一点看不懂,真的,为了能至少多那么一点儿理解力,我看了几个小时开发者文档,除了了解到机器翻译还不错这件事以外可以说颗粒无收了。总之我先用着,反正S3和CloudFront有一年免费期,到期后再转到Cloudflare吧。
2023年4月25日更新:研究了好久终于用AWS WAF给图床加上防盗链功能了,但Cloudflare似乎更经济实惠一些,正好我也想试试Cloudflare,准备改日转过去。
参考文章