当前位置: 首页 > 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;因为你的营销策略不能凭空想象&#…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...