利用AWS cdn服务CloudFront进行数据分发
生物研究的数据量巨大,利用S3桶进行数据分发能很好地保证安全性,但并不物美价廉(9毛3/GB),利用AWS的CDN服务进行数据分发,能够降低成本(3毛/GB),大约是S3标价的3折,但是安全性需要格外注意,在文末有提到。
-- D.C
名词解释:
S3 --- AWS上的对象存储服务
CDN --- CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
前提条件
-
首先你得需要一个ICP备案过的域名,比如
cdn.xxx.com.cn
,这个备案可以在阿里,也可以在aws。 -
在AWS的管理console界面右上角点击
支持
,创建并提交案例,给到后台域名和备案号,并要求开放80/443端口。(GOV的要求) -
准备一个S3存储桶比如
share
,在share里新建一个folder为lovevideo
,然后把要share的小片子放进去,存储桶权限设为公开,里面的数据也要设置为公开,简单的验证就是点击下图中的URL地址,能通过浏览器下载就代表OK啦。
开启cloudfront服务
- 登录AWS console,搜索栏搜索 cloudfront,进去以后点击 新建分配。
源设置
源域名
:在字段中单击并为源指定域名 - Amazon S3 存储桶、AWS MediaPackage 通道终端节点、AWS MediaStoreContainer 终端节点或您希望 CloudFront 从中获取 Web 内容的 Web 服务器。下拉列表枚举了与当前 AWS 账户关联的 AWS 资源。要使用其他 AWS 账户中的资源,请键入资源的域名。例如,对于 Amazon S3 存储桶,请用格式 bucketname.s3.amazonaws.com 键入名称。源中的文件必须公开可读。
此例中选择对应的S3桶: share.s3.cn-northwest-1.amazonaws.com.cn
源路径
: 可选。如果您希望 CloudFront 从 Amazon S3 存储桶或自定义源的目录中请求内容,请在此处输入目录路径名称(以 / 开头)。在将请求转发到源时,CloudFront 会将目录名追加到“源域名”的值,例如 myawsbucket/production。请勿在目录名称末尾包含 /。
此例中选择要share的文件夹,不写就代表整个桶,根目录: /lovevideo
限制存储桶访问
: 如果您希望要求用户始终使用 CloudFront URL 而非 Amazon S3 URL 访问您的 Amazon S3 内容,请单击“是”。当您使用签名的 URL 或签名的 Cookies 来限制对您的内容的访问时,这会很有用。请参阅“帮助”中的“通过 CloudFront 提供私有内容”。
此例中设定为: 是
默认缓存行为设置
对象缓存
:如果源服务器正在添加 Cache-Control 标头来控制对象在 CloudFront 缓存中的保留时间,则选择“使用源缓存标头”。选择“自定义”可指定对象在 CloudFront 缓存中保留的最短时间,而不管 Cache-Control 标头如何。
[默认] 最小TTL:0; 最大TTL:一年;默认TTL: 24小时
名词解释:TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4报头的一个8 bit字段。
- 其他选项保持默认。
分配设置
-
推荐
使用有边缘站点(最佳性能)
,这样就利用了AWS分布在中国东西南北的边缘站点,为客户提供最近的下载站点。如果选择“全部”之外的价格级别,则某些用户可能会遇到较长的延迟。 -
[重要]备用域名: 您必须列出使用的任何自定义域名(例如 www.example.com)以及您文件的 URL 的 CloudFront 域名(例如 d1234.cloudfront.net)。指定最多 100 个 CNAMEs,使用逗号将其分隔开或将每个 CNAME 放在一个新行中。您还必须使用 DNS 服务创建 CNAME 记录,以便将针对 www.example.com 的查询路由到 d1234.cloudfront.net。
此例中填入已经备过案的域名: cdn.xxx.com.cn,其他保持默认,点击创建分配
。
创建cloudfront后查看状态
- copy 图中的域名
xxxx.cloudfront.cn
,进到备案过的域名管理页面(以阿里为例),添加CNAME解析。如下图:
主机记录:cdn
记录类型:CNAME
记录值: xxxx.cloudfront.cn
- 回到cloudfront界面可以看到这个域名已经处于
活跃
状态了.
测试下载
-
使用这个规则下载:
http://<域名>/<文件名>
, 比如在本文中就是http://cdn.xxx.com.cn/小泽.avi
。 -
CloudFront 第一次下载是回源到S3拿到数据存在最近的cdn节点,第二次开始就是直接从最近的cdn点下载了,当然下载要发生在数据得TTL内。
需注意的地方
-
cdn本身是为了分享内容给public的,桶和文件都要设定为公开,虽然指定了只有通过cloudfront的方式才能访问,但在传输数据的安全性方面,还是需要配合AWS的WAF(Web Application Firewall)使用,可以做到指定IP才能下载。而WAF目前在国内还没launch,消息称在2021Q1.
-
cdn是针对单个object文件的,因此需要大批量文件通过cdn的方式分享,还需要有一部分的开发工作,一种是提前打包成一个压缩文件并设为公开,在用http下载,一种是不打包,通过一些开发,批量设定文件的公开权限,同时在下载时批量执行下载命令,并要做好文件是否遗漏的检查机制,比如获取文件列表,监控http下载的web-log记录来排查(http 200/403 code)
-
S3能提供强大的api,sdk等支持,全文件夹的同步功能(s3 sync),桶安全策略等,因此是更理想的数据分享方式。
总结一句,内部使用或者经费奇缺,用cdn + WAF, 且注意不要泄露下载链接给无关人员。对外交付敏感数据建议还是用S3, 毕竟data leak给公司带来的名誉和经济处罚,不是那点成本节约所能cover的,切记不要捡了芝麻丢了西瓜!
醉卧沙场君莫笑,我在云端我骄傲。