利用 Amazon API Gateway 和 Amazon Lambda 处理 Cloudfront 的内容请求
概述
国内 Amazon Cloudfront 目前不支持 Lambda@edge 功能,不能实现基于 CDN 的 A/B 测试、rewrite、redirect、token 认证和产生 response 等功能,本文介绍如何利用 API Gateway 和 Lambda 实现 Lambda@edge 的功能。下面实验介绍通过 request header 参数值,实现 redirect 和 rewrite 的测试场景,根据 header(test_version)参数值,回源到指定目录的文件,根据 header(redirect)参数值,返回 302 重定向地址。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库! |
整体实验的架构图如下:
架构图说明:
- Cloudfront 是 Amazon 的 CDN 服务,可以设置源站域名,回源 header,缓存策略等。
- API Gateway 有两种类型可以支持 rewrite 和 redirect 测试场景,实验中采用 HTTP API,考虑到成本更低,同时不需要 Rest API 的高级功能。
- Lambda 实现了 rewrite 和 redirect 的测试代码,支持验证 security header。支持多种主流语言,实验中采用 Python3.9 语言实现。
- S3 保存测试的 html 和 png 文件。
详细步骤说明
1.新建 S3 Bucket
比如:bucket name:lambda-api-2022
上传文件列表:
index.html – 欢迎页
v1/test.html – A 测试页
v1/test.png – A 测试图片
v2/test.html – B 测试页
v2/test.png – B 测试图片
2.新建 Lambda 程序
1)新建 IAM Role,执行 Lambda 程序,比如 Role name:RoleForLambda
需要的权限如下:
{"Version": "2012-10-17","Statement": [{"Sid": " s3get","Effect": "Allow","Action": "s3:GetObject","Resource": "arn:aws:s3:::lambda-api-2022/*"},{"Sid": " putlogs","Effect": "Allow","Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource": "*"}]
}
2)创建 Lambda 程序
采用下列的参数和配置:
Function name:lambdaapi
Runtime:Python 3.9
Execution role:RoleForLambda(上一步创建的)
修改 Configuration 的配置:
添加 Environment variables
添加 Key=bucket,Value=lambda-api-2022
添加 Key=lambda_auth,Value=lambdaapi_test
添加 Key=redirect_path,Value=https://xxx.cloudfront.net,value 来自下面创建的 Cloudfront distribution
General configuration
修改 Timeout 为20秒
Lambda Source Code:
import boto3
import base64
import oss3_client = boto3.client('s3')def lambda_handler(event, context):print(event)# check security headerif 'lambda_auth' in event['headers'] and event['headers']['lambda_auth'] == os.environ['lambda_auth']:bucket = os.environ['bucket']key = event['rawPath'][1:] # request URIprint(key)if len(key) == 0:key = 'index.html'# rewrite urlif 'test_version' in event['headers']:key = event['headers']['test_version']+'/'+key# redirect if 'redirect' in event['headers'] and event['headers']['redirect'] == 'true':return {'statusCode': 302,'statusDescription': 'Found','headers': { 'Location': os.environ['redirect_path'] + '/' + key }}# return content body - rewritetry:response = s3_client.get_object(Bucket = bucket, Key = key)responseBody = response['Body'].read() # return bytes from S3responseContentType = response['ResponseMetadata']['HTTPHeaders']['content-type']return {'headers': { "Content-Type": responseContentType },'statusCode': 200,'body': base64.b64encode(responseBody).decode('utf-8'),'isBase64Encoded': True}except Exception as e:print('error message - ', e.__class__.__name__, ' : ', e)return {'statusCode': 200,'body': 'no file: '+key}else:# auth failedreturn {'statusCode': 403,'body': 'request is forbidden'}
Lambda Source Code 说明:
在 Cloudfront 回源时,添加 lambda_auth header,用于 Lambda 认证请求,当认证失败时,返回 403 错误。
当请求根目录时,返回 index.html
当 request header 包含 test_version 时,转向到指定目录下的文件。
将返回的 body 通过 base64 编码,以支持 binary 对象。
当 request header 包含 redirect=true 时,返回 302 重定向信息。
3.新建 API Gateway
在 API Gateway 中,新建 HTTP API,比如 API Name:lambdaapi
新建 Lambda integration,选择上一步创建的 Lambda(lambdaapi)
在 Configure routes 时,Resource path 设置为 “/{proxy+}”
在 Deploy Stages中,找到 $default stage 的 Invoke URL,如https://xxx.execute-api.xxx.amazonaws.com,此为 API Gateway 的请求地址。
测试 API gateway:
- 测试 security header
测试命令:curl https://xxx.execute-api.xxx.amazonaws.com
返回结果:request is forbidden
- 测试访问根路径,传入 lambda_auth header
测试命令:curl -v -H “lambda_auth:lambdaapi_test” https://xxx.execute-api.xxx.amazonaws.com
返回结果:statusCode=200
- 访问 B 测试页,传入 lambda_auth header和test_version header
测试命令:curl -H “lambda_auth:lambdaapi_test” -H “test_version:v2” https://xxx.execute-api.xxx.amazonaws.com/test.html
返回 v2/test.html 的内容
- 访问B测试图片,传入 lambda_auth header 和 test_version header
测试命令:curl -H “lambda_auth:lambdaapi_test” -H “test_version:v2” https://xxx.execute-api.xxx.amazonaws.com/test.png > test.png
将 response 保存为 test.png 图片。
- 测试 redirect,传入 redirect header
测试命令:curl -v -H “lambda_auth:lambdaapi_test” -H “test_version:v1” -H “redirect:true” https://xxx.execute-api.xxx.amazonaws.com/test.html
返回 302 重定向信息
4.配置 Cloudfront
1)创建 Origin request policy,Amazon Cloud Global支持该功能
在 Cloudfront Policies 中,新建 origin request policy,例如 Name:lambdaapi
配置如下:
Headers:选择 Include the following headers,并手工添加 header:test_version和redirect
Query strings: All
Cookies:All
2)创建 Cloudfront Distribution
在 Cloudfront 中,新建 Distribution,例如 Description:lambdaapi
配置如下:
Origin domain:xxx.execute-api.xxx.amazonaws.com,上面创建的 HTTP API 域名
Protocol:HTTPS only
Add custom header:
Header name = lambda_auth,Value = lambdaapi_test
在 Amazon Cloud Global,支持 Cache policy and origin request policy (recommended),配置下面两个参数:
Cache policy:CachingDisabled
Origin request policy:Custom lambdaapi
或者在 Amazon Cloud China,支持 Legacy cache settings,配置下面 3 个参数:
Headers:选择 Include the following headers,并手工添加header:test_version和redirect。
Query strings: All
Cookies:All
如果不需要 Cloudfront 缓存内容时,需要设置 Object caching 为Customize,同时将 Minimum TTL、Maximum TTL 和 Default TTL 都设为 0.
注:需新建 origin 和 behavior,配合 redirect 后 Cloudfront 地址。
5.测试 Cloudfront
1.在 Cloudfront Distributions (Lambdaapi)的 General Details 中,找到 Distribution domain name,例如 cloudfront.net
2.访问 A 测试页,传入 test_version header
测试命令:curl -H “test_version:v1” https://xxx.cloudfront.net/test.html
返回 v1/test.html 的内容
3.测试 redirect,传入 test_version 和 redirect header
测试命令:curl -I -H “test_version:v1” -H “redirect:true” https://xxx.cloudfront.net/test.html
返回 302 重定向的内容
结论
在这篇文章中,介绍了如何利用 API Gateway 和 Lambda 处理Cloudfront 的内容请求,实现 Lambda@edge 的功能,在实验中,介绍了 Amazon S3、Lambda、API Gateway 和 Cloudfront 的配置方法,实现了 rewrite 和 redirect 的测试场景。
参考资料
- Getting started with Amazon S3 - Amazon Simple Storage Service
- Creating a role to delegate permissions to an AWS service - AWS Identity and Access Management
- Getting started with Lambda - AWS Lambda
- Tutorial: Build a CRUD API with Lambda and DynamoDB - Amazon API Gateway
- Getting started with a simple CloudFront distribution - Amazon CloudFront
- Controlling origin requests - Amazon CloudFront
本篇作者
薛召兵
Amazon 解决方案架构师,负责帮助客户进行上云架构的设计和咨询。同时致力于 Amazon 容器服务、媒体服务和机器学习服务在国内和全球商业客户的应用和推广,推进企业服务迁移上云进程。有 10 年以上的软件开发、售前技术支持、系统架构设计等经验。
文章来源:利用 Amazon API Gateway 和 Amazon Lambda 处理 Cloudfront 的内容请求
相关文章:

利用 Amazon API Gateway 和 Amazon Lambda 处理 Cloudfront 的内容请求
概述 国内 Amazon Cloudfront 目前不支持 Lambdaedge 功能,不能实现基于 CDN 的 A/B 测试、rewrite、redirect、token 认证和产生 response 等功能,本文介绍如何利用 API Gateway 和 Lambda 实现 Lambdaedge 的功能。下面实验介绍通过 request header 参…...

Parasoft和TASKING联手提供卓越的汽车软件开发和自动化测试
Parasoft与TASKING宣布建立合作 2023年4月26日,全球嵌入式软件测试解决方案领导者Parasoft宣布与汽车嵌入式软件开发工具行业领导者TASKING建立合作伙伴关系。Parasoft和TASKING的合作为汽车行业提供了一套完整的软件全生命周期解决方案,通过CI/CD工…...

java读取word文档内容
首先在pom文件引入依赖: <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version> </dependency> <dependency><groupId>org.apache.poi</groupId&g…...

使用Process Monitor排查因dll库被锁定导致C++程序启动报“0xc0000022”错误问题
目录 1、问题描述 2、查找到异常值0xc0000022对应的标识STATUS_ACCESS_DENIED 3、使用Process Monitor定位到哪个dll库被隔离了 4、在360安全卫士中将被隔离的文件恢复了,但360并没有释放对文件的锁定 VC常用功能开发汇总(专栏文章列表,欢…...
Unity UI -- (1)概览
UI(User Interface,用户接口),是让用户和计算机或计算机应用交互的接口系统。 在实时3D项目中,UI通常是由文本、按钮、复选框、滑动条和单选框等组合出来的界面。这些元素使用特定规则或通知和用户进行交互。 UI设计是…...

玩转 LLMs 之基础设施「利刃出鞘」
LLMs 时代已经到来,这个由 ChatGPT 开始的全球化技术浪潮,所经之处,风起云涌。LLMs 之于当下,更像是 iOS 、Android 之于移动互联网时代。开发者沸腾,投资机构争抢,与赛道相关的基础设施建设自然也成为整个…...

WPF MaterialDesign 初学项目实战(1)首页搭建
前言 最近在学WPF,由于人比较烂,有一个星期没怎么动代码了。感觉有点堕落。现在开始记录WPF项目,使用MaterialDesignInXamlToolkit。 环境搭建 如果没下载MaterialDesign 的源码 github源码运行 在Nuget里面引入MaterialDesign Materia…...

【纳什博弈、ADMM】基于纳什博弈和交替方向乘子法的多微网主体能源共享研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

每日学术速递5.8
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Personalize Segment Anything Model with One Shot 标题:一键个性化细分任何模型 作者:Renrui Zhang, Zhengkai Jiang, Ziyu Guo, Shilin Yan, Junting Pa…...

ChatGPT时代:我们可能站到了自然语言编程的大门口
ChatGPT大火,我现在有种感觉:我们可能站到了自然语言编程的门口,一脚下去,也许能把门踹开。 当然,也可能会踢到一块铁板。 回顾我们的编程之路,基本上就是一个编程门槛不断降低的历史。 最早的一批前辈们…...

关于不同处理器的函数调用规则
关于不同处理器的函数调用规则 接前面一篇变长参数调用的记录,这次从原理上进行了进一步研究。 不同调用规则对对于编译出来的汇编影响很大的,这里之前的理解比较粗浅,尤其是一般教科书或者网上能看到的内容都比较老,这里记录一下…...

Rust Wasm Linux开发环境搭建
一、Linux 镜像版本 CentOS-7-x86_64-DVD-2009.iso,Virtual Box 7.0 选择 GNOME Desktop 版本, 配置远程连接(可选), nmtui 激活连接 enp0s3 ,查看 ip 地址, 绑定端口转发, 通过…...

【项目设计】 负载均衡在线OJ系统
🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录 一、项目介绍项目技术栈和开发环境 二、项目的宏观结构三、compile_server模块①日志模块开发,Util工具类,供所以模…...

【服务器】无公网IP,异地远程连接威联通NAS
Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 前言 1. 威联通安装cpolar内网穿透 2. 内网穿透 2.1 创建隧道 2.2 测试公网远程访问 3. 配置固定二级子域名 3.1 保留二级子域名 3.2 配置二级子域名 4. 使用固定二级子…...

在中国,年收入20W是什么水平?答案扎心了(文末附最新招聘)
最近关于“年薪20万算什么水平?”冲上了热搜。对此,许多网友纷纷表示自己的看法,有的认为这个收入属于中高收入人群了。 因为按照最近某招聘网站发布的《中国企业招聘薪酬报告》来看,今年一季度38城企业平均招聘薪酬为10101元&…...

navicat连接oracle报错 ORA-28547
报错 原因 Navicat自带的oci.dll并不支持oracle11g 具体操作 1. 先用idea连接oracle,查看oracle版本 select * from v$version; 2. 去官网下载 Instant Client 地址: Oracle Instant Client Downloads 下载 选择对应的版本(下载时&#x…...

量化指标WR:弱的确是弱,但是老Q会魔改啊!
WR指标是一个极其简单的指标,跟我们前边讲过的KDJ有着千丝万缕的联系。原本不打算讲这个指标的,但是有粉丝一直想了解一下,那今天老Q就再专门说一下。 顺便把KDJ那篇文章就提到的魔改思路给大家实现一下——毕竟,WR这种指标,不魔改一下实在是坑人啊。 文末附魔改公式。 …...

生物信息学知识点
生物信息学知识点 1. 序列比对:1.1 基本概念:1.2 全局比对和局部比对:1.3 空位罚分的改进:1.4 同源性和相似性:1.5 相似性矩阵:1.5.1 PAM:1.5.2 BLOSUM: 2. BLAST算法:2.…...

14.贪心算法
一、算法内容 1.简介 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,而不考虑后续可能造成的影响。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优…...

你知道营销人为什么要讲洞察吗?
用户洞察,是制定品牌和产品战略的基础,基于深刻的用户洞察,才能谈价值发现,目标规划,产品设计,全方位运营等。 可以这么说,没有洞察就没有营销,因为你的营销策略不能凭空想象&#…...

Neovim-配置教程
环境:Ubuntu 20.04 宿主机:windows (windows terminal)WSL2 NVIM:v0.10.0-dev 配置Neovim 需要保证流畅的github环境(以便于快速拉取插件),可以使用代理或是配置Github SSH key 本文…...

Windows管理内存的3种方式——堆、虚拟内存、共享内存
一、操作系统管理内存概述 在 Windows 操作系统中,每个进程都被分配了 4GB 的虚拟地址空间,这被称为进程的虚拟地址空间。虚拟地址空间提供了一个抽象的地址空间,使得每个进程都可以认为它拥有自己的独立内存空间。这个虚拟地址空间被分为两…...

PCM/FM解调原理与Matlab算法仿真
调制的作用是将调制信息的频谱从低频搬移到高频,以适合信道传输。关于调制的原理,在上一节中已经讲过了。在这一节中,主要讲解FM的解调原理。与调制相对应的是在接收端需要解调过程将调制信息复原,所以解调是影响通信系统性能的重要技术。 解调方法按照是否需要载波恢复的…...

我的『1024』创作纪念日
目录 ◐机缘 ◑收获 ◐日常 ◑成就 ◐憧憬 记得,2020年07月22日我撰写了第1篇技术博客:《遗传算法实例解析》在这平凡的一天,我赋予了它不平凡的意义也许是立志成为一名专业T作者、也许是记录一段刚实践的经验但在那一刻,我已…...

Python ---> 衍生的数据技术
我的个人博客主页:如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客:《我在VScode学Python》 随着人工智能技术的发展,挖掘和分析商业运用大数据已经成为一种推动应用, 推动社会发展起着…...

【27】linux进阶——rpm软件包的管理
大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…...

HTTP第六讲——键入网址再按下回车,后面究竟发生了什么?
使用 IP 地址访问 Web 服务器 首先我们运行 www 目录下的“start”批处理程序,启动本机的 OpenResty 服务器,启动后可以用“list”批处理确认服务是否正常运行。 然后我们打开 Wireshark,选择“HTTP TCP port(80)”过滤器,再鼠标…...

layui目录和项目引入
1.目录结构如下 ├─css //css目录 │ │─modules //模块css目录(一般如果模块相对较大,我们会单独提取,比如下面三个:) │ │ ├─laydate │ │ ├─layer │ │ └─layim │ └─layui.css //核心样式文件…...

Ubuntu22.04 将EFI启动分区迁移到另一块硬盘
机器上有两块硬盘, 一块已经安装了Win10, 另一块新装Ubuntu22.04, 在新硬盘上划分分区的时候, 有分出256M给 BOOT EFI, 但是安装的时候没注意, 启动分区不知道怎的跑到 Windows 所在的硬盘上了 记录一下将 /boot/efi 分区迁移至 Ubuntu 所在硬盘, 并创建 Grub 的记录. 预留的…...

只要学会这些AI工具,一个人就是一家营销咨询公司
本教程收集于:AIGC从入门到精通教程 只要学会这些AI工具,一个人就是一家营销咨询公司 随着AI工具的不断涌现,您只需掌握市面上热门的AI工具,便可独自开展营销咨询公司。通过一系列AI工具,您可以为企业提供全案服务,收获丰厚回报。 例如,在协助一家美妆初创公司出海时,…...