目的
生产环境中出于安全和并发的考虑,一般会用 CDN 和 LB 为后端服务/资源进行加速和并发防护,在 AWS 中,CDN 服务是 CloudFront,为了从根源上避免直接访问到源,需要通过安全组的方式组织非 CloudFront 边缘节点的访问。
思路
根据官方博客 How to Automatically Update Your Security Groups for Amazon CloudFront and AWS WAF by Using AWS Lambda中所属步骤,创建好 Lambda 函数和相关安全组,并监听 IP 更新的 SNS 即可。
对应代码仓库:aws-cloudfront-samples
原理就是每次在AWS更新 CloudFront 的IP时都会触发 Lambda 函数的执行,Lambda 里边获取 IP ranges,找出里边 CloudFront 的 Global IP 和 Region IP,保存到对应的安全组去。
注意:如果服务器在多个区或同一个区不同的 VPC,需要每个区都执行安全组创建+lambda,同区的不同 VPC 只要创建好安全组即可。
注意:如果运行过程中提示你每个安全组规则数量不可超过 50 导致无法更新成功,需要在 AWS 控制台申请扩大单个安全组规则最大限制,100~200即可。
操作过程
创建安全组
首先把需要CloudFront IP 访问控制的安全组创建起来,由于 Global 和 Region 是分两个组存的,HTTP 和 HTTPS 也是分两个组存的,所以我们需要创建四个安全组,名称和标签如下表所示。
安全组名称 | 描述 | 协议 | 类型 | Tag:Name | Tag:Protocol | Tag:AutoUpdate |
---|---|---|---|---|---|---|
HTTP_CLOUDFRONT_IP_ONLY | HTTP for cloudfront global ip. | HTTP | Global | cloudfront_g | http | true |
HTTP_CLOUDFRONT_IP_ONLY_R | HTTP for cloudfront region ip. | HTTP | Region | cloudfront_r | http | tr |