本博客是使用了Headless CMS框架Strapi作为后台,Markdown作为博客源格式。然后不可避免会遇到使用图片等静态资源的问题。目前的解决方案是S3+CloudFront。所以把使用CloudFront的方法以及感受记录下来。

  1. 需要注意的是,AWS国际版的CloudFront在国内是被墙的。而AWS中国区必须得公司注册,所以考虑使用迁移到阿里云的CDN上。

什么是CloudFront

CloudFront是AWS提供的一个CDN服务,通过AWS的边缘站点(edge location)来分发静态和动态的资源。

当用户读取一个资源的时候,请求会被路由到最低延迟的边缘站点,如果对象已经存在则立马返回给用户,否则CloudFront会从源请求对象返回给用户并且缓存以便下次调用。

配置CloudFront

  1. 首先创建一个S3桶。
  2. 登录CloudFront控制台创建。
  3. 源域名下拉框会列出所有的S3桶的,选择第一步创建的S3桶(xxxxxxx.s3.amazonaws.com)
  4. 源路径可以设置为S3桶下特定文件夹路径或者为空。
  5. 源ID设置唯一ID
  6. 限制桶访问选择是。这样用户只能通过CloudFront去访问S3对象,而不可以通过S3的URL去访问。(OAI)
  7. OAI可以创建一个新的,然后更新桶策略。
  8. 剩下的都可以选择默认,或者根据实际需求去配置。

更新的S3策略如下:

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity xxxxxx"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

其他

  • CloudFront可以无缝集成WAF, Shield, Route53预防攻击
  • CloudFront默认提供SSL(*.cloudfront.net), 也可以导入ACM里面的证书
  • 通过GEO-限制基于区域添加白名单或者黑名单。
  • 通过Orgin Group实现故障转移,添加多个源,当主源挂掉之后可以把请求转移到备份源中
  • 使用自定义SSL证书 (1. SNI Custom SSL 2. Dedicated IP Custom SSL)