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

aws apigateway 使用apigateway集成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进行重新部署
  • 非代理集成,见下文

apigateway代理集成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
}

apigateway非代理集成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 使用apigateway集成lambda

参考资料 代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...

Linux SPI 驱动实验

目录 一、Linux 下 SPI 驱动框架简介 1、SPI 主机驱动 2、SPI 设备驱动 SPI 设备数据收发处理流程 3、SPI 设备和驱动匹配过程 二、添加SPI 设备信息 1、添加 ICM20608 所使用的 IO 2、 在 ecspi3 节点追加 icm20608 子节点 三、编写 ICM20608 驱动 1、修改makefile​…...

[1.4]计算机系统概述——操作系统的体系结构

第一章 计算机系统概述 操作系统的体系结构 大内核/单内核/宏内核微内核 通过之前的学习&#xff0c;我们知道计算机系统的层次结构是这样的。 但是操作系统的内部其实还可以再进一步地划分。 一部分是内核的功能&#xff0c;一部分是非内核的功能。 操作系统最核心的功能&…...

FPGA的GigE Vision IP相机图像采集方案设计,转换为千兆UDP,支持10G MAC

1 概述 GigE Vision是一个比较复杂的协议&#xff0c;要在FPGA中完全实现具有较大的难度。如果FPGA作为接收端希望实现GigE Vision相机的配置和图像采集功能&#xff0c;则只需要实现其中小部分功能即可。本文对原有GigE Vision协议的结构进行了裁剪&#xff0c;仅保留设备搜索…...

大数据相关面试题

linux 常见linux高级命令&#xff1f; top、iotopnetstatdf -hjmap -heaptarrpmps -efshell 用过的shell工具&#xff1f; awk Awk 命令详解 - 简书 awk是行处理器: 相比较屏幕处理的优点&#xff0c;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题&#xff0c;通常用来…...

AI绘画第二步,抄作业复现超赞的效果!

上一篇&#xff0c;讲了如何安装AI绘画软件&#xff0c;但是装完后发现生成效果很渣&#xff01;而网上那些效果都很赞。真的是理想很丰满&#xff0c;现实很骨感。今天就是来聊聊如何抄作业&#xff0c;最大程度的还原那些超赞的效果。换一种说法就是&#xff0c;教大家如何使…...

Python的并发编程

我们将一个正在运行的程序称为进程。每个进程都有它自己的系统状态&#xff0c;包含内存状态、打开文件列表、追踪指令执行情况的程序指针以及一个保存局部变量的调用栈。通常情况下&#xff0c;一个进程依照一个单序列控制流顺序执行&#xff0c;这个控制流被称为该进程的主线…...

【Linux】基本系统维护命令

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享C/C相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

高数:数列的收敛

数列特点无限个数特定顺序数列和集合区别集合可以乱序&#xff0c;数列不行集合出现重复元素依然相同&#xff0c;数列出现新的重复元素就不相等[1&#xff0c;2&#xff0c;3&#xff0c;4][1&#xff0c;2&#xff0c;3&#xff0c;3&#xff0c;4]对集合来说相等&#xff0c…...

不平凡的一天——

作者&#xff1a;指针不指南吗 专栏&#xff1a;个人日常记录 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.自我介绍2.上学期3.不凡的一天4.新学期写个博客&#xff0c;简单记录一下&#xff0c;新学期加油&#xff01;&#xff01;&#xff…...

【Java基础】Map遍历的5种方式

目录 创建一个集合 方式一&#xff1a;Iterator 迭代器遍历 map.entrySet().iterator(); map.keySet().iterator(); 方式二&#xff1a;For Each方式遍历 map.forEach(BiConsumer action) 方式三&#xff1a;获取Collection集合 map.values().forEach() 方式四&#x…...

第十四届蓝桥杯三月真题刷题训练——第 2 天

目录 题目1&#xff1a;奇数倍数 代码: 题目2&#xff1a;求值 代码: 题目3&#xff1a;求和 代码: 题目4&#xff1a;数位排序 代码: 题目1&#xff1a;奇数倍数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即…...

自然语言处理历史最全预训练模型(部署)汇集分享

什么是预训练模型&#xff1f;预练模型是其他人为解决类似问题而创建的且已经训练好的模型。代替从头开始建立模型来解决类似的问题&#xff0c;我们可以使用在其他问题上训练过的模型作为起点。预训练的模型在相似的应用程序中可能不是100&#xff05;准确的。本文整理了自然语…...

csdn写文章自定义表格怎么做

前言 CSDN写文章时&#xff0c;经常会用到表格&#xff0c;不同于Word文档中直接插入表格&#xff08;自定义几行几列&#xff09;&#xff0c;使用CSDN自带的md文本编辑器时&#xff0c;很难快速插入想要的表格样式&#xff0c;追究原因&#xff0c;也是因为md的语法问题&…...

Pytorch处理数据与训练网络问题汇总(协同训练)

基础语法 模型训练 【Swin-Unet】官方代码预训练权重加载函数load_from() 实际上由于SwinUnet是一个encoder-decoder对称的结构&#xff0c;因此加载权重时&#xff0c;作者并没有像通常那样仅仅加载encoder部分而不加载decoder部分&#xff0c;而是同时将encoder的权重对称地…...

机器学习:基于神经网络对用户评论情感分析预测

机器学习&#xff1a;基于神经网络对用户评论情感分析预测 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f4…...

Vue3之组件间传值避坑指南

组件间传值的两个坑 我们都知道父组件可以把值传递到自组件中&#xff0c;但是有时候子组件需要修改这个父组件传递过来的这个值&#xff0c;我们可以想象下能修改成功吗&#xff1f;这是坑之一。我们在组件间传值的时候&#xff0c;都是一个属性名对应一个值&#xff0c;接收…...

02-问题思考维度:抓住核心用户、场景化分析、需求收集与辨别、用户故事

文章目录2.1 抓住核心用户2.1.1 为什么要抓住核心用户2.1.2 核心用户的特征根据不同维度&#xff0c;描述核心用户2.1.3 如何抓住核心用户2.2 场景化分析2.2.1 场景五要素2.2.2 场景化分析方法2.2.3 场景化分析方法的应用2.3 需求收集与辨别2.3.1 需求的定义及层次2.3.2 需求收…...

C 语言编程 — GCC Attribute 语法扩展

目录 文章目录目录Attribute 属性扩展机制__attribute__((packed))__attribute__((aligned(n)))__attribute__((noreturn))__attribute__((unused))Attribute 属性扩展机制 GCC 的特点之一就是 Attribute 语法扩展机制&#xff0c;通过使用 __attribute__ 关键字可以设置以下对…...

LeetCode 热题 C++ 399. 除法求值 406. 根据身高重建队列

LeetCode 399 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表示的问题&#xff0c;其…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

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

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...