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进入特定的端口号的连接转到正确的服务器进程。 套接字通信的建立过…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...