使用CloudFront发布EC2上的应用并使用Managed prefix功能限制EC2只接受CloudFront回源流量

一、背景

CloudFront使用的一般场景是发布ALB上的应用,而ALB又是发布一组EC2应用。CloudFront也支持直接发布EC2不使用ALB。当然这是不推荐的,因为ALB会提供了更好的多机流量调度,通过目标组实现健康检查,确保要发布的应用正常对外提供服务,并具备水平扩展能力。

此前,如果希望对ALB和EC2做限制,使其只允许来自CloudFront回源流量,并且不再接受其他互联网访问,那么这个需求常见的解决方案是:

  • 方法1:在EC2前增加ALB。在CloudFront设置回源时候添加特殊Header,然后在ALB上检查必须有此Header才接受访问。详细方法参考这篇博客。
  • 方法2:下载AWS的IP地址段ip-range.json文件,然后使用jq工具扫描名为CLOUDFRONT_ORIGIN_FACING的服务的IP地址范围,可获得大约45条记录。详细查询方法见这篇博客。然后再将这些IP地址段添加到ALB和EC2使用的安全规则组中。

以上两个方法,各自有一些局限:

  • 方法1要求发布点必须是ALB才能检查Header,CloudFront直接发布EC2时候,就只能在应用层如Apache和Nginx上检查Header,相对麻烦。
  • 方法2查询出来的CloudFront回源的IP地址清单可能长达几十条,且一段时间后可能会变化,难于管理。

由此,引入一个新的功能,使用Manage prefix功能,简化ALB和EC2使用的安全组配置,只需在安全规则组中添加一条记录,即可让ALB和EC2只接受来自CloudFront回源流量。下面开始配置。

二、配置CloudFront发布EC2上的应用

使用CloudFront发布ALB后的应用相对简单,在创建CloudFront时候的Origin选项选择ALB即可。但是,在Origin的清单中,只有ALB和S3,没有EC2。直接填写EC2使用的EIP也会报错。如何配置发布EC2呢?

1、为EC2绑定EIP

进入EC2服务界面,点击左侧的Network & Security菜单下的Elastic IPs,然后在右侧点击右上角的Allocate Elastic IP address按钮。如下截图。

申请到一个新的EIP后,选中这个EIP,点击右上角的操作按钮,从下拉框中选择Assoicate Elastic IP address,将EIP绑定到EC2。如下截图。

在要绑定的对象中,根据名字选择EC2 Instance,确保绑定到正确的EC2。页面下方会自动带出本EC2使用的VPC内网IP。这个选项无须修改,使用向导自动带出来的值即可。点击右下角绑定按钮完成绑定。如下截图。

为EC2绑定EIP完成。

2、获取已经绑定了EIP的EC2对应的Public DNS Name

注意:此步骤必须在EC2绑定了EIP后执行。没有EIP的EC2可能会因为关机、硬件故障Fail-over等原因,导致Public IP地址变化。只有绑定了EIP才永远不会变化。

进入EC2界面,选择要发布的EC2,查看页面下方详情,从DNS Name位置复制本机的域名。如下截图。

这里复制下来的格式为ec2-13-251-164-11.ap-southeast-1.compute.amazonaws.com这一串的就是公有域名。

3、创建CloudFront发布点

进入CloudFront服务,开始创建CDN发布点。

在创建向导第一步,填写上一步复制出来的EC2 Public Name。此外,回源站步骤,创建向导默认是HTTPS,这里一定要修改为使用是HTTP回源站访问EC2。如果没有切换为HTTP将直接导致访问失败。如下截图。

创建CDN发布点成功,即可获得CDN发布点的名字。如下截图。

至此创建CDN加速点完成。

4、验证切断所有网络入口的EC2无法被发布

为验证Security Group和Managed prefix的配置正确,首先清空当前安全规则组,做一下没有授权许可的测试。在EC2的安全规则组中,删除所有HTTP相关规则,确保来自任何来源地址的针对HTTP协议的流量都无法进入。本步骤的操作过程略。

编辑安全规则组完成后,新打开一个浏览器匿名窗口,尝试访问CDN发布点。应该会得到如下的无法连接源站的报错。如下截图。

这个错误信息可能需要数秒钟才会返回,等待数秒的时间是在配置CloudFront发布点时候填写的源站超时参数的时长来决定。这里报告这个报错信息是因为源站EC2的安全规则组与不允许流量入栈,因此CloudFront无法回源。这里的出的错误与预期结果相符。

接下来开始配置Managed prefix。

三、配置安全规则组和Managed prefix

1、查看Managed prefix并复制下来ID

进入VPC服务界面,点击左侧菜单的Managed prefix lists,在右侧搜索框中输入cloudfront,然后在过滤条件中可以看到一条名为cloudfront.origin-facing的记录。这一条就是Managed prefix。选中这一条。如下截图。

注意:请确认当前操作的界面与源站EC2所在为同一个Region。如果查看VPC服务的Region和EC2所在的Region不相同,那么配置时候将无法正确加载Managed Prefix。

选中这一条后,将其ID复制下来。如下截图。

由此获得Managed prefix的ID。

3、编辑EC2安全规则组加入Manage prefix

进入EC2服务,选中当前作为源站的EC2,点击详情信息中的第二个标签页Security,查看当前使用的Security gruops安全规则组,点击名字(链接)即可进入查看详情。如下截图。

在查看安全组详情界面,在入栈规则Inbound rules位置,点击Edit Inbound rules按钮编辑入栈规则。如下截图。

选择允许入栈的流量类型是HTTP,来源位置选择Custom,在地址框中输入上一步复制出来的Managed prefix的ID。(注意:每个Region的Managed prefix名字不一样,请注意查看EC2所在的Region)。添加完成后点击右下角的Save rules完成编辑,保存安全规则组。如下截图。

至此给作为CloudFront源站的EC2授权Managed prefix完成。

4、测试CloudFront连接源站访问正常

再次访问CloudFront发布点的地址,可以看到页面加载正常。由于源站EC2已经允许了CloudFront的IP地址回源连接EC2的80端口,因此访问正常。如下截图。

至此使用Managed prefix的配置完成。

四、参考文档

Limit access to your origins using the AWS-managed prefix list for Amazon CloudFront (英文博客)

https://aws.amazon.com/cn/blogs/networking-and-content-delivery/limit-access-to-your-origins-using-the-aws-managed-prefix-list-for-amazon-cloudfront/