当前位置: 首页 > news >正文

利用 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 重定向地址。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

整体实验的架构图如下:

架构图说明:

  1. Cloudfront 是 Amazon 的 CDN 服务,可以设置源站域名,回源 header,缓存策略等。
  2. API Gateway 有两种类型可以支持 rewrite 和 redirect 测试场景,实验中采用 HTTP API,考虑到成本更低,同时不需要 Rest API 的高级功能。
  3. Lambda 实现了 rewrite 和 redirect 的测试代码,支持验证 security header。支持多种主流语言,实验中采用 Python3.9 语言实现。
  4. 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文件引入依赖&#xff1a; <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安全卫士中将被隔离的文件恢复了&#xff0c;但360并没有释放对文件的锁定 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢…...

Unity UI -- (1)概览

UI&#xff08;User Interface&#xff0c;用户接口&#xff09;&#xff0c;是让用户和计算机或计算机应用交互的接口系统。 在实时3D项目中&#xff0c;UI通常是由文本、按钮、复选框、滑动条和单选框等组合出来的界面。这些元素使用特定规则或通知和用户进行交互。 UI设计是…...

玩转 LLMs 之基础设施「利刃出鞘」

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

WPF MaterialDesign 初学项目实战(1)首页搭建

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

【纳什博弈、ADMM】基于纳什博弈和交替方向乘子法的多微网主体能源共享研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

每日学术速递5.8

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

ChatGPT时代:我们可能站到了自然语言编程的大门口

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

关于不同处理器的函数调用规则

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

Rust Wasm Linux开发环境搭建

一、Linux 镜像版本 CentOS-7-x86_64-DVD-2009.iso&#xff0c;Virtual Box 7.0 选择 GNOME Desktop 版本&#xff0c; 配置远程连接&#xff08;可选&#xff09;&#xff0c; nmtui 激活连接 enp0s3 &#xff0c;查看 ip 地址&#xff0c; 绑定端口转发&#xff0c; 通过…...

【项目设计】 负载均衡在线OJ系统

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录 一、项目介绍项目技术栈和开发环境 二、项目的宏观结构三、compile_server模块①日志模块开发&#xff0c;Util工具类&#xff0c;供所以模…...

【服务器】无公网IP,异地远程连接威联通NAS

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

在中国,年收入20W是什么水平?答案扎心了(文末附最新招聘)

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

navicat连接oracle报错 ORA-28547

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

量化指标WR:弱的确是弱,但是老Q会魔改啊!

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

生物信息学知识点

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

14.贪心算法

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

你知道营销人为什么要讲洞察吗?

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

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...