在如今这个快节奏的互联网时代,用户的耐心越来越有限,网页加载速度成为了网站成功与否的关键因素,如何确保内容迅速、无延迟地传递到全球用户面前已经成为每个网络工程师和开发者必须面对的挑战,而在众多内容分发网络(CDN)服务中,Amazon CloudFront凭借其卓越的性能和全球化的基础设施成为了提升用户体验和加速网站访问的强大工具。
目录
[初识Amazon CloudFront](#初识Amazon CloudFront)
[使用Amazon CloudFront](#使用Amazon CloudFront)
初识Amazon CloudFront
Amazon CloudFront:是一个旨在加速向用户分发静态和动态Web内容(如.html、.css、.js和图像文件)的高效Web服务,当用户希望您使用CloudFront提供的内容时,他们会要求您将内容路由到具有最小延迟(即时间延迟)的边缘站点,以便以最优的性能传输这些内容。
我们可以来到亚马逊云科技的 亚马逊云科技 可以看到,亚马逊云科技提供了很多的云服务内容,这里我们可以看到今天博主讲解的Amazon CloudFront也赫然其中:

Amazon CloudFront的优势在于通过全球分布的多个边缘节点,显著提升内容传输速度和网站响应时间,降低延迟,同时通过集成的安全功能(如 DDoS 防护、SSL 加密等)保障数据安全,并支持灵活的缓存管理和自动扩展,帮助企业在全球范围内提供高效、可靠和安全的内容分发服务,如下是其优势所在:

CloudFront支持静态和动态内容的分发,提供实时分析和日志记录功能能够自动扩展以应对高流量需求,此外CloudFront还集成了多层安全防护措施,如 DDoS 防护、SSL/TLS 加密和访问控制,帮助确保数据传输的安全性和可靠性,其 边缘站点通过完全冗余的网络骨干无缝连接到全球各个区域,主干网由遍布全球的多条400GbE并行光纤组成并与数以万计的网络连接,以改进原始数据获取和动态内容加速,如下所示:

对于Amazon CloudFront博主也不可能讲解的面面俱到,本文博主就举一个简单的示例进行讲解,作为一个抛砖引玉的作用而已,如果有感兴趣的朋友可以随时阅读官方文档,里面也是详细介绍了该服务的具体服务内容及其搭建使用教程,也是能够帮助大家可以对该服务进行快速入门的,可以点击 地址 进行查看:

亚马逊云科技账号注册
如果是第一次使用亚马逊云科技服务的人,第一步肯定是要先注册账号了,这里我将注册账号的流程简单的分享一下给大家,如下所示:
首先打开亚马逊云科技的 官网 ,然后点击右上角的创建用户按钮,创建新的账户:


然后输入要创建的邮箱地址,然后点击验证邮箱地址,在邮箱中找到验证码然后输入即可:


然后验证通过之后输入一下要创建用户的密码即可,如下所示:

下一步就是输入一些相应的个人信息即可:

然后下一步就是输入自己的账号信息即可,一般都是visa卡就可以:

后面就是要确认一下输入的信息,然后进行一个身份的验证,这里选择短信验证然后地区选择中国就行,下一步就是进行短信验证了:

下一步就是选择自己的支持计划,根据自身情况,个人开发就选择第一个,企业的话选择后面两个都可以:

点击完成注册之后,等待一段时间亚马逊云科技会进行一些验证,验证通过然后我们转到登录页面,输入我们刚才创建好的账户即可,然后就进入到管理控制台进行相关操作,如下控制台我们就可以使用不同的亚马逊云科技提供的各种服务进行使用了:

使用Amazon CloudFront
亚马逊云科技以往Amazon CloudFront采用Lambda@Edge或利用重定向等功能,动态地选择源站;现在支持对源站服务器进行动态的修改,在CloudFront Functions平台上也可以写个性化的逻辑代码,以便将请求转发至亚马逊云科技的源站,例如S3/API gateway/ELB,此外还可以将这些请求转发至任何公共HTTP终端,从而实现更优越的性能和性价比:
CloudFront Functions是运行在Amazon CloudFront服务之上的边缘脚本,当来自客户端的HTTP请求进入CloudFront(Viewer Request),或者HTTP响应从CloudFront发往客户端时(Viewer Response),我们都有能力通过设置CloudFront Function来执行某些特定代码,例如客户端鉴权/HTTP header改写/URI改写/自定义响应等功能,下面的图示展示了如何在CloudFront Functions中利用updateRequestOrigin方法将路由发送到不同的源站的具体结构:

该方法提供一个新的机制来管理源站和目的站之间的通信过程,使得用户可以通过简单的方式实现对目标站进行控制,而不需要了解具体的网络拓扑结构。在这种方法里,我们能够定义回源的各种特性,例如源站的域名、请求的路径、请求的协议以及超时的时长等,接下来我们演示如何根据客户端地址动态指定源站:
1)创建CloudFront Functions:新创建的CloudFront Functions均建议使用Runtime2.0,它提供了更丰富的功能和更完善的开发体验:

2)部署Nginx服务作为源站:在每台EC2上部署NGINX和带有亚马逊云科技region信息的页面:
sudo yum install nginx
sudo systemctl start nginx
cd /usr/share/nginx/html/
vi index.html --修改不同源站的内容,以区分地区
curl http://localhost/index.html --判断Nginx是否可以访问以及是否生效
在安全组放开 80 端口,此处因为是 Demo,所以未使用 HTTPS,生产环境建议使用 HTTPS 协议。

3)CloudFront Functions测试:当前CloudFront Functions未发布到线上先完成测试,CloudFront → 函数 → <函数名> → 测试:

因为未发布到线上,所以"阶段"选择 Development,由于我们所需的 Header 头是 CloudFront 在 Viewer 收到请求后添加的,在测试阶段需要显示指定对应 Header。 由于 Functions 部署在 Viewer Request,所以执行结果输出无法提供具体的回源信息。可以在 CloudFront Functions 里打印最终的回源 domain,根据打印日志,确认代码逻辑是否正常, 根据 Viewer Country 为 CN,最终选择的源站为 ap-southeast-1,符合预期:

4)为CloudFront分发创建缺省源站: 需要在分发中配置一个缺省源站,才能进行 Step5 Behavior 里的相关配置。此处源站可随意选择上述三个区域的源站之一,也可以是任意其他地址:

5)修改CloudFront分发行为:将第 4 步创建的缺省源站关联到行为中

为该行为配置缓存键和源请求策略 , 模拟的业务场景为动态请求,需要回源,所以在缓存策略处配置"CachingDisabled";如果源站配置了和终端访问域名(CloudFront 备用域名)相同的 Servername,则源请求策略建议选择"AllViewer";如果不是的话,选择"AllViewerExceptHostHeader

6)关联并发布CloudFront Functions:通过以下来选择函数类型和函数每次的行为实现函数关联:

CloudFront Functions实现的逻辑代码如下所示:
javascript
import cf from 'cloudfront'; //启用对源站服务器进行修改需要引入的模块
function handler(event) {
const request = event.request;
const headers = request.headers;
const country = headers['cloudfront-viewer-country'] &&
headers['cloudfront-viewer-country'].value;
console.log(`Viewer Country: ${country}`); //打印CloudFront判断的country信息
const clientIp = headers['cloudfront-viewer-address'] && headers['cloudfront-viewer-address'].value;
console.log(`Client IP: ${clientIp}`); //打印CloudFront收到的客户端IP,确认和上述country是否匹配
let domainName;
if (country === 'US') { //当country为US时,配置源为US的地址
domainName = 'ec2-54-236-28-210.compute-1.amazonaws.com';
} else if (country === 'CN' || country === 'SG' || country === 'IN') { //当country为CN或SG或IN时,配置源为新加坡的地址
domainName = 'ec2-47-129-137-148.ap-southeast-1.compute.amazonaws.com';
} else if (country === 'DE' || country === 'IE' || country === 'GB' || country === 'FR') { //当country为DE/IE/GB等欧洲地区时,配置源为法兰克福的地址
domainName = 'ec2-23-129-16-28.eu-central-1.compute.amazonaws.com';
} else {
domainName = 'default.compute-1.amazonaws.com';
}
console.log(`Domain Name: ${domainName}`); //打印对应的原服务器信息
cf.updateRequestOrigin({
"domainName": domainName
});
return request;
}
如下模拟HTTP访问,根据Functions逻辑应访问 ap-southeast-1 的服务器。

写在最后
Amazon CloudFront 是一项强大的全球内容分发网络(CDN)服务,提供了高效、低延迟的内容分发能力。最近,Amazon CloudFront 发布了新的功能------CloudFront Functions,这一更新进一步提升了其灵活性和性能,特别是在请求路由和源站服务器修改方面。 如果感兴趣的朋友也可以去体验一番:亚马逊云科技 :

CloudFront Functions 的主要优势体现在两个方面。首先,性能得到了显著提升。与 Lambda@Edge 相比,CloudFront Functions 运行在边缘节点层面,能够更高效地处理大量请求,并大幅降低延迟。其次,成本效益也得到了优化。在动态路由场景下,CloudFront Functions 的成本仅为 Lambda@Edge 的六分之一,为用户提供了更加经济的解决方案。

然而,用户在选择 CloudFront Functions 还是 Lambda@Edge 时,仍需根据具体的业务需求进行权衡。如果业务场景中涉及高度可缓存的内容,Lambda@Edge 可能更加适合;而在需要动态路由且请求量较大的情况下,CloudFront Functions 将会是更优选择。

总的来说,CloudFront Functions 的推出为 Amazon CloudFront 增添了更多的功能选项,进一步增强了其作为全球化、高性能应用基础设施的能力。这一更新使得用户能够更加灵活地处理请求分发,并为构建高效、经济的应用提供了更多可能性。