aws apigateway 使用restapi集成lambda
参考资料
- 代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html
- 非代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-lambda-non-proxy-integration.html
从上一篇文章中我们知道,apigateway集成lambda有两种方式
- 代理集成,集成所有api方法,将请求直接发往lambda函数,无需对api进行重新部署
- 非代理集成,见下文
restapi代理集成lambda
创建lambda函数,取名GetStartedLambdaProxyIntegration,执行角色保持默认即可
下面是官方问demo函数,我们精简一下把校验的逻辑去掉看看(测试没必要)
'use strict';export const handler = async (event) => {// 查看事件console.log(event)let name = "you";let city = 'World';let time = 'day';let day = '';let responseCode = 200;// 打印请求console.log("request: " + JSON.stringify(event));// 解析请求参数let name = event.name === undefined ? 'you' : event.name;let city = event.city === undefined ? 'World' : event.city;let time = event.time === undefined ? 'morning' : event.time;// 解析请求体let body = JSON.parse(event.body).timelet greeting = `Good ${time}, ${name} of ${city}.`;let responseBody = {message: greeting,input: event};// 构造响应let response = {statusCode: responseCode,headers: {"x-custom-header" : "my custom header value"},body: JSON.stringify(responseBody)};// 打印响应console.log("response: " + JSON.stringify(response))// 返回响应return response;
};
创建restapi由于resapi是资源和方法的组合,因此有以下
-
资源 /helloworld,不要勾选代理资源
代理集成和代理资源不是一个概念

-
方法 ANY(捕获所有),勾选lambda代理集成

注意这里创建方法并集成lambda后会提示自动为lambda函数添加权限
注意:如果手动创建lambda函数,并不会自动添加这个权限,即apigateway没有权限调用lambda

我们把这个权限删掉查看调用结果
创建完毕后需要手动新型部署,创建并选择test阶段,每个阶段都是一个apigateway的快照

图示实际上就是方法/集成,请求/响应之间的转换,我们可以更精细的设置这些阶段的参数。可以点击测试

在访问控制方面,我们有以下选择
-
匿名访问
-
身份访问
- apigateway基于资源的策略
- iam策略
- lambda授权方
- cognito身份池
终端请求测试,在非中国区是可以直接请求的
// 未备案无法匿名访问
$ curl https://y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn/test/helloworld
{"Message":null}// 访问错误方法
{"message":"No method found matching route helloworl for http method GET."}// 没有凭证
{"message": "Missing Authentication Token"}// 内部错误,可能是apigate无法访问lambda,可以在apigateway控制台测试
{"message": "Internal server error"}// 不知道为什么始终403
$ awscurl --service execute-api -X GET --region cn-north-1 --profile admin "https://y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn/test/helloworld?name=John&city=Seattle"
{"Message":null}
Traceback (most recent call last):File "/home/ec2-user/.local/bin/awscurl", line 8, in <module>sys.exit(main())File "/home/ec2-user/.local/lib/python3.7/site-packages/awscurl/awscurl.py", line 521, in maininner_main(sys.argv[1:])File "/home/ec2-user/.local/lib/python3.7/site-packages/awscurl/awscurl.py", line 515, in inner_mainresponse.raise_for_status()File "/home/ec2-user/.local/lib/python3.7/site-packages/requests/models.py", line 1021, in raise_for_statusraise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn/test/helloworld?name=John&city=Seattle
后来发现iam认证需要在方法上单独开启,之后仍旧需要部署一下

重新请求
$ awscurl --service execute-api -X GET --region cn-north-1 --profile admin "https://y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn/test/helloworld?name=John&city=Seattle"
{"message":"Good day, John of Seattle.","input":{"resource":"/helloworld","path":"/helloworld","httpMethod":"GET","headers":{"Accept":"application/xml","Accept-Encoding":"gzip, deflate","Content-Type":"application/json","Host":"y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn","User-Agent":"python-requests/2.28.1","x-amz-content-sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","x-amz-date":"20230305T055851Z","X-Amzn-Trace-Id":"Root=1-64042f9b-79563b285727810b2a19fe26","X-Forwarded-For":"52.81.227.226","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"multiValueHeaders":{"Accept":["application/xml"],"Accept-Encoding":["gzip, deflate"],"Content-Type":["application/json"],"Host":["y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn"],"User-Agent":["python-requests/2.28.1"],"x-amz-content-sha256":["e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"],"x-amz-date":["20230305T055851Z"],"X-Amzn-Trace-Id":["Root=1-64042f9b-79563b285727810b2a19fe26"],"X-Forwarded-For":["52.81.227.226"],"X-Forwarded-Port":["443"],"X-Forwarded-Proto":["https"]},"queryStringParameters":{"city":"Seattle","name":"John"},"multiValueQueryStringParameters":{"city":["Seattle"],"name":["John"]},"pathParameters":null,"stageVariables":null,"requestContext":{"resourceId":"wwo9nn","resourcePath":"/helloworld","httpMethod":"GET","extendedRequestId":"BSxgZHB2hTIFSmw=","requestTime":"05/Mar/2023:05:58:51 +0000","path":"/test/helloworld","accountId":"xxxxxxxxxxx","protocol":"HTTP/1.1","stage":"test","domainPrefix":"y2o41dcif7","requestTimeEpoch":1677995931863,"requestId":"38db2a8b-b5d7-4230-a3e4-3851ceada31b","identity":{"cognitoIdentityPoolId":null,"accountId":"xxxxxxxxxxx","cognitoIdentityId":null,"caller":"AIDAQRIBWRJKPC2O5EBGY","sourceIp":"52.81.227.226","principalOrgId":"o-vut99korpx","accessKey":"AKIAQRIBWRJKK45B727U","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":"arn:aws-cn:iam::xxxxxxxxxxx:user/zhaojie","userAgent":"python-requests/2.28.1","user":"AIDAQRIBWRJKPC2O5EBGY"},"domainName":"y2o41dcif7.execute-api.cn-north-1.amazonaws.com.cn","apiId":"y2o41dcif7"},"body":null,"isBase64Encoded":false}}
在cwlogs中查看lambda函数的请求事件如下
- 请求参数和请求体
- 请求发起人,控制台上为
aws-internal/3 aws-sdk-java
{resource: '/helloworld',path: '/helloworld',httpMethod: 'GET',headers: null,multiValueHeaders: null,queryStringParameters: { city: 'Seattle' },multiValueQueryStringParameters: { city: [ 'Seattle' ] },pathParameters: null,stageVariables: null,requestContext: {resourceId: 'wwo9nn',resourcePath: '/helloworld',httpMethod: 'GET',extendedRequestId: 'BSlRoGtiBTIFkGQ=',requestTime: '05/Mar/2023:04:35:22 +0000',path: '/helloworld',accountId: 'xxxxxxxxxxx',protocol: 'HTTP/1.1',stage: 'test-invoke-stage',domainPrefix: 'testPrefix',requestTimeEpoch: 1677990922153,requestId: '0754dbf7-c943-41cd-8cd0-7f23c24f72e3',identity: {cognitoIdentityPoolId: null,cognitoIdentityId: null,apiKey: 'test-invoke-api-key',principalOrgId: null,cognitoAuthenticationType: null,userArn: 'arn:aws-cn:iam::xxxxxxxxxxx:user/xxxxxx',apiKeyId: 'test-invoke-api-key-id',userAgent: 'aws-internal/3 aws-sdk-java/1.12.407 Linux/5.4.231-145.341.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.362-b10 java/1.8.0_362 vendor/Oracle_Corporation cfg/retry-mode/standard',accountId: 'xxxxxxxxxxx',caller: 'xxxxxxx',sourceIp: 'test-invoke-source-ip',accessKey: 'xxxxxxx',cognitoAuthenticationProvider: null,user: 'AIDAQxxxxxEBGY'},domainName: 'testPrefix.testDomainName',apiId: 'y2o41dcif7'},body: null,isBase64Encoded: false
}
restapi非代理集成lambda
创建名为GetStartedLambdaIntegration的函数
- 相比代理集成,非代理集成的lambda只从集成请求体中获取输入。函数可以返回任何 JSON 对象、字符串、数字、布尔值甚至二进制 blob 的输出
- 代理集成的 Lambda 函数可以从任何请求数据获取输入,但必须返回特定 JSON 对象
- 对于自定义集成需要创建映射模板完成前后端数据的转换
这里官方文档给出的是老版本lambda的写法。。。很离谱
'use strict';
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var times = ['morning', 'afternoon', 'evening', 'night', 'day'];exports.handler = async (event)=> {console.log(event);// Parse the input for the name, city, time and day property valueslet name = event.name === undefined ? 'you' : event.name;let city = event.city === undefined ? 'World' : event.city;let time = event.time ? 'morning' : event.time;let day = days.indexOf(event.day)<0 ? null : event.day;// Generate a greetinglet greeting = 'Good ' + time + ', ' + name + ' of ' + city + '. ';if (day) greeting += 'Happy ' + day + '!';// Log the greeting to CloudWatchconsole.log('Hello: ', greeting);let response = {"greeting": greeting};// Return a greeting to the callerreturn response;
};
创建restapi非代理集成lambda
-
步骤和代理集成一致,但是需要开启cors预检
-
创建方法时,不要勾选lambda代理集成
-
设置2个必须参数,time为查询参数,day为请求头参数

创建如下model完成请求体数据映射
-
schema是固定写法
-
内容类型为application/json

我们已经知道非代理集成只能从集成请求体中获取参数,因此需要对方法请求创建model映射

然后在集成请求中对参数进行解析
- time和day来自于请求参数
- callername来自于根路径

总结一下
- model定义了客户端请求规范
- mapping定义了如何从方法请求构造集成请求
在控制台测试请求

我们看看lambda函数的事件输入
- 看起来很简单实际上是apigateway帮我们处理了
- 优点是lambda函数不需要承担解析任务
- 缺点是每次修改数据模型都需要重新部署apigateway
{ city: 'Seattle', time: 'morning', day: 'Wednesday', name: 'John'
}
在终端进行请求
$ awscurl --service execute-api -X POST --region cn-north-1 "https://qzoqsj2lp4.execute-api.cn-north-1.amazonaws.com.cn/test/city?name=John&city=Seattle"
{"greeting":"Good , of Seattle. "}
相关文章:
aws apigateway 使用restapi集成lambda
参考资料 代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...
HTML基础
HTML 基础 文章目录HTML 基础列表标签无序列表有序列表自定义列表表格标签表格基本标签表格基本结构表格完整结构:合并行和合并列表单标签input 系列标签属性标签text 标签radio 标签 单选框file 标签 文件选择button 标签 按钮input系列标签总结button按钮标签sele…...
ThreadPoolExecutor参数 keepAliveTime allowCoreThreadTimeOut
/*** Timeout in nanoseconds for idle threads waiting for work.* Threads use this timeout when there are more than corePoolSize* present or if allowCoreThreadTimeOut. Otherwise they wait* forever for new work.*/ private volatile long keepAliveTime;等待工作的…...
什么是Hibernate框架?
简单介绍:Hibernate框架是当今主流的java持久层框架之一,是一个开放源码的ORM(Object Relational Mapping,对象关系映射)框架,它对JDBC进行了轻量级的封装,使得JAVA开发人员可以使用面向对象的编…...
指针面试笔试题练习
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨星光…...
docker(三)仓库的搭建、官方私有仓库的加密和认证
文章目录一、docker仓库二、仓库Registry工作原理三、搭建本地私有仓库四、配置镜像加速器五、私有仓库的加密认证1.非加密下上传拉取2.insecure registry3.仓库加密4.仓库认证一、docker仓库 什么是仓库 Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器…...
FPGA实现SDI视频编解码 SDI接收发送,提供2套工程源码和技术支持
目录1、前言2、设计思路和框架SDI接收SDI缓存写方式处理SDI缓存读方式处理SDI缓存的目的SDI发送3、工程1详解4、工程2详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片࿰…...
Android 基础知识4-3.5 RadioButton(单选按钮)Checkbox(复选框)详解
一、RadioButton(单选按钮) 1.1、简介 RadioButton表示单选按钮,是button的子类,每一个按钮都有选择和未选中两种状态,经常与RadioGroup一起使用,否则不能实现其单选功能。RadioGroup继承自LinearLayout&a…...
用代码实现解析解的方式求解_梯度下降法思路_导函数有什么用_接23节---人工智能工作笔记0026
这里24节,25节,介绍了一下人工智能高等数学要学习的一些内容,初步了解了一下,微积分中用到的知识~微分~以及导数这里... 然后接着23节,我们还是继续,走人工智能的主线,先把整体的人工智能的内容学习一遍,然后再去回去看数学知识更有目的性. 然后首先来回顾一下,这里机器学习,其…...
大数据ETL开发之图解Kettle工具
详细笔记参考:https://blog.csdn.net/yuan2019035055/article/details/120409547以下只是简单记录一下我学习过程中的心得3.1.5 JSON输入JSONPath 类似于 XPath 在 xml 文档中的定位,JsonPath 表达式通常是用来路径检索或设置Json的。其表达式可以接受“…...
docker-容器数据卷
Docker挂载主机目录访问如果出现cannot open directory.:Permission denied 解决办法:在挂载目录后多加一个--privileged=true参数即可; 一、介绍 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过Union Fil…...
【C++】类和对象补充知识点
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、再谈构造函数1.1 构造函数体赋…...
路径规划-人工势场法
一.基本思想 目标点对机器人产生吸引力,障碍物对机器人产生排斥力; 所有力的合成构成机器人的控制律 二. 主要步骤 1.构建人工势场 目标点:吸引势场 障碍物:排斥势场 2.根据人工势场计算力 对势场求偏导 3.计算合力 计…...
20230304学习笔记
1、Mybatis #{}和${}的区别是什么 a、#{}是预编辑处理、是占位符,${}是字符串拼接符。 b、#{}替换为?号,用PreparedStatement来赋值,${}直接替换变量的值,用Statement赋值。 c、#{}在DBMS中、自动加入单引号&#…...
[数据集][VOC][目标检测]河道垃圾水面漂浮物数据集目标检测可用yolo训练-1304张介绍
数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1304 标注数量(xml文件个数):1304 标注类别数:1 标注类别名称:["trash"] …...
JavaWeb--JSP案例
JSP案例8 案例8.1 环境准备8.1.1 创建工程8.1.2 创建包8.1.3 创建表8.1.4 创建实体类8.1.5 准备mybatis环境8.2 查询所有8.2.1 编写BrandMapper8.2.2 编写工具类8.2.3 编写BrandService8.2.4 编写Servlet8.2.5 编写brand.jsp页面8.2.6 测试8.3 添加8.3.1 编写BrandMapper方法8.…...
推荐系统1--Deepfm学习笔记
目录 1 keras实现Deepfm demo 2 deepctr模版 3 其他实现方式 ctr_Kera 模型 数据集 预处理 执行步骤 4何为focal loss 参考 1 keras实现Deepfm 假设我们有两种 field 的特征,连续型和离散型,连续型 field 一般不做处理沿用原值,离散型一…...
javaDoc生成方式
javaDoc生成方式 命令行生成 在cmd控制台窗口上找到需要生成文件的路径,然后执行命令。 # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding UTF-8 -charset UTF-8 Doc.java这样就生成完成了。 测试Doc.java文件 package com.jiang.base;/***…...
Armv9 registers
A64指令集包括访问system registers编码空间的指令。这些指令有: Access to System registers, including the debug registers, that provide system control, and system status information.Access to Special-purpose registers such as SPSR_ELx, ELR_ELx, an…...
套接字实现TCP
套接字 套接字的意义就是客户端与服务器进行双向通信的端点,如果有不理解点上面套接字三字更近距离了解套接字。 网络套接字与客户连接的特定网络有关的服务端口号,这个端口号允许linux进入特定的端口号的连接转到正确的服务器进程。 套接字通信的建立过…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
