CDC

Place to Be & Show Yourself

用AWS S3和CloudFront部署静态文件并做CDN加速

问题的提出

我们经常有一些静态文件供客户下载,并且需要CDN加速,AWS S3和CloudFront一起提供了很好的解决方案

创建S3 Bucket

首先打开S3 Console:S3 Console, 选择“Create Bucket”,填写一个有意义的名字,在权限设置页面,勾选“Block All Public Access”。这样当设置任何文件为Public的时候,aws会进行提示。
当然如果是已经有的S3 Bucket,也可以修改相应的访问权限:
– 在Permissions->Access Control List页面将Everyone这个组的List Object权限删除
– 在Permissions->Block publick access页面,选择“Edit”,并且勾选“Block All Public Access”,这样所有文件,无论是之前上传的,还是之后上传的,都没有Public权限了

设置CloudFront做内容分发

S3 Bucket 创建好并且上传文件之后,里面的文件并不可以直接对外提供访问。可以在S3 Bucket上面增加CloudFront层,做真正的内容分发。 实际上只需要简单的3个步骤就可以完成

1.创建CloudFront “User”

通过创建CloudFront User,可以让CloudFront读取S3 Bucket中的内容。 在CloudFront Console左侧菜单中选择Security->Origin Access Identity, 然后点击“Create Origin Access Identidy”,创建一个OAI,并且记下两个ID,其中第一个较短的ID用于 Bucket 策略设置,较长的Canonical User ID用于对单个文件进行访问授权,如下图所示
《用AWS S3和CloudFront部署静态文件并做CDN加速》

2.创建CloudFront Distribution

CloudFront Console上选择“Create Distribution”,然后选择Web下面的“Get Started”, 完成接下来的表单:

  • Origin Name 是S3 bucket的名字,可以直接点击并从下拉列表中选择
  • Origin Path可, 如果要让整个Bucket都可以公开访问,则为空,否则就填一个public子目录
  • Restrict Bucket Access:请务必确保选择“Yes”,然后Origin Access Identity选择“Use an Existing Identity”,并在下拉列表中选择第一步创建好的OAI
  • Grant Read Permissions on Bucket,为了方便起见,请选择”Yes, Update Bucket Policy”,这样Bucket Policy就自动创建好了
  • Default Root Object: 建议设置为 index.html,该HTML文件中有一个link指向该website本身,这样做的好处是避免有人拿到download link,来尝试列出目录的内容。设置index.html之后,就总是看到index.html的内容而不是目录的内容

当然也可以在“Origin”这个Tab中修改已有CloudFront Distribution的设置

其他的设置都可以保留缺省值,并点击“Create Distribution”,这个过程大概需要15分钟左右,直到Status从“In Progress”变成“Deployed”
《用AWS S3和CloudFront部署静态文件并做CDN加速》

3.针对文件进行访问授权

第二步事情并没有结束,在S3 Console->Permissions->Access Control List页面,“Access for other AWS accounts” 下面,选择“Add Account”,填写第一步创建的Canonical User ID,并授予List Objects权限
重复同样的步骤,对上传到S3 Bucket中的每个需要提供Public访问权限的文件进行授权
这个时候通过http://*.cloudfront.net/filename 来进行访问的,就不仅仅是访问静态文件了,而是做过CDN加速了。

自定义域名和证书

如果这些静态文件是给公众访问的话,总不能用http://*.cloudfront.net 这样的URL吧?一是因为这个FQDN不是我们自己的域名,另外也不是HTTPS的,有一些系统(比如iOS)直接禁止访问http的静态资源。所以我们需要提供自己的域名和证书。域名和证书的申请不在本文范围。例如本文作者是通过公司的IT部门申请的CNAME, 指向*.cloudfront.net这个域名,并通过IT部门申请了一个泛域名证书。当然也可以直接在AWS上申请域名和相应的证书。

在已经有证书的情况下,进入Certificate Manager Console上,选择Import a certificate, Certificate body中填写.crt文件的内容,Certificate private key中填写.key文件的内容,Certificate chain中填写.pem文件的内容,就完成了证书的导入
然后再编辑第二步创建的Distribution,再General 页面,在“Alternate Domain Names”(CNAMEs)中填写新申请的自定义域名,并且选择“Custom SSL Certificate”, 然后在下拉列表中选择刚刚导入的证书。
这个时候就可以通过https://<自定义域名>/filename,用自定义域名和https来访问同样的文件了。

刷新CloudFront缓存

但是事情并没有这么简单。因为CDN的基本原理就是多份缓存,这样导致的结果往往就是S3 Bucket上的文件已经更新了,但是通过CDN访问的还是旧文件。如果需要更新的文件立即生效,旧需要刷新缓存了。在Distribution的Invalidations这个页面,选择“Create Invalidation”,并输入通配符*, 意思是刷新所有文件的缓存。当新invalidation 请求不再是“In Progress”状态时,再次通过CDN访问文件,可以看到文件已经是最新的了。

点赞

发表评论

电子邮件地址不会被公开。