aws api gateway & lambda:多端点/函数与单端点

2024-04-16

我有一个代理 lambda 函数的 AWS api。我目前使用不同的端点和单独的 lambda 函数:

api.com/getData --> getData
api.com/addData --> addData
api.com/signUp --> signUp

管理所有端点和功能的过程变得很麻烦。当我使用一个 lambda 函数的单一端点来根据查询字符串决定要做什么时,有什么缺点吗?

api.com/exec&func=getData --> exec --> if(params.func === 'getData') { ... }

将多个方法映射到单个 lambda 函数是完全有效的,现在许多人都在使用这种方法,而不是为每个离散方法创建 api 网关资源和 lambda 函数。

您可能会考虑将所有请求代理到单个函数。查看以下有关创建 API Gateway => Lambda 代理集成的文档:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource

他们的例子在这里很好。类似如下的请求:

POST /testStage/hello/world?name=me HTTP/1.1
Host: gy415nuibc.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
headerName: headerValue

{
    "a": 1
}

最终会将以下事件数据发送到您的 AWS Lambda 函数:

{
  "message": "Hello me!",
  "input": {
    "resource": "/{proxy+}",
    "path": "/hello/world",
    "httpMethod": "POST",
    "headers": {
      "Accept": "*/*",
      "Accept-Encoding": "gzip, deflate",
      "cache-control": "no-cache",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "US",
      "Content-Type": "application/json",
      "headerName": "headerValue",
      "Host": "gy415nuibc.execute-api.us-east-1.amazonaws.com",
      "Postman-Token": "9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f",
      "User-Agent": "PostmanRuntime/2.4.5",
      "Via": "1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==",
      "X-Forwarded-For": "54.240.196.186, 54.182.214.83",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "queryStringParameters": {
      "name": "me"
    },
    "pathParameters": {
      "proxy": "hello/world"
    },
    "stageVariables": {
      "stageVariableName": "stageVariableValue"
    },
    "requestContext": {
      "accountId": "12345678912",
      "resourceId": "roq9wj",
      "stage": "testStage",
      "requestId": "deef4878-7910-11e6-8f14-25afc3e9ae33",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "apiKey": null,
        "sourceIp": "192.168.196.186",
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "PostmanRuntime/2.4.5",
        "user": null
      },
      "resourcePath": "/{proxy+}",
      "httpMethod": "POST",
      "apiId": "gy415nuibc"
    },
    "body": "{\r\n\t\"a\": 1\r\n}",
    "isBase64Encoded": false
  }
}

现在,您可以访问所有标头、url 参数、正文等,并且可以使用它们在单个 Lambda 函数中以不同方式处理请求(基本上实现您自己的路由)。

作为一种意见,我看到了这种方法的一些优点和缺点。其中许多取决于您的具体用例:

  • 部署:如果每个 lambda 函数都是离散的,那么您可以独立部署它们,这可能会降低代码更改的风险(微服务策略)。相反,您可能会发现需要单独部署功能会增加复杂性并且很麻烦。
  • 自我描述:API Gateway 的界面使您可以极其直观地查看 RESTful 端点的布局 - 名词和动词一目了然。实现您自己的路由可能会以牺牲这种可见性为代价。
  • Lambda 大小和限制:如果您代理全部,那么您最终需要选择一个实例大小、超时等来容纳您的所有 RESTful 端点。如果您创建离散函数,那么您可以更仔细地选择最能满足特定调用需求的内存占用、超时、死信行为等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

aws api gateway & lambda:多端点/函数与单端点 的相关文章

  • 无法为 api 路由 laravel 设置 cookie

    使用后端 laravel 和前端 SPA vue js vue cli 3 进行服务 我需要通过 httpOnly cookie 不是 localStorage 进行身份验证 我用tymondesigns jwt auth https gi
  • 如何配置适用于 Node.JS 的 AWS S3 SDK 以与 localhost 一起使用?

    我正在尝试使用fakes3 https github com jubos fake s3作为我编写的一些简单 S3 代码的端点 但我无法超越连接阶段 当前的错误是 NetworkingError getaddrinfo ENOTFOUND
  • AWS ECS架构

    我有一个 React 前端和 Flask 后端 我想用 ECS 部署它们 我想让反应应用程序面向公众 并将烧瓶服务器隐藏起来 无法从外界访问 根据我的阅读 该方法应该如下 为 Flask 服务器创建公共子网和私有子网 并在公共子网上创建 N
  • 如何使用 github actions OIDC 功能在 github actions 中使用无服务器框架

    我已经关注了这个问题如何在不使用密钥的情况下将 GitHub 操作与 AWS 部署连接起来 https stackoverflow com questions 69243571 how can i connect github action
  • AWS lambda 基本身份验证,无需自定义授权者

    我在为用 Node js 编写的 AWS lambda 函数设置基本身份验证时遇到问题 问题 AWS lambda 函数是附加服务的代理 该函数仅转发整个请求并向用户提供整个响应 这就是为什么我需要强制使用Authentication标题
  • 使用 JavaScript 以编程方式更新 Google 电子表格?

    是否可以使用 JavaScript 从网页更新 Google 电子表格 设想 1 用户登陆网页 2 JS脚本执行 修改Google Spreadsheet 如何才能做到这一点 这是可能的 尽管我发现这很困难 请参阅此处了解所有详细信息 ht
  • Android - API 级别 21 中的日期 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你好 我对 Android 还很陌生 目前我对本地日期 或我尝试过的任何其他日期格式 有一个大问题 L
  • Angular 4 中的多个顺序 API 调用

    我有一系列图像对象 console info gallery galleryArray 该数组的长度可以不同 我必须对该数组的每个项目发出 POST 请求 只有在前一个请求完成后 才能执行下一个请求 所以我尝试发出一系列可观察的请求 如下所
  • 如何将带有子查询的 JPQL 转换为 Criteria API 等效项?

    有一个由 5 个实体组成的简单对象模型 Company 组织 Address Club Group 公司与单个组织相关联 团体和俱乐部也与单个组织相关联 它们是单向的 这意味着组织不包含对其所有者的引用 一个组织可以有 0 个或多个地址 子
  • 应用程序负载均衡器的 SurgeQueueLength 等效项

    我希望为 AWS ECS 上运行的服务设置自动缩放 来自ECS弹性伸缩文档 https docs aws amazon com AmazonECS latest developerguide service auto scaling htm
  • AudioPlayer Alexa 技能套件的“PlaybackNearlyFinished”请求无法正常工作

    我编写了一个 Alexa Skill 它使用 Lambda 函数来播放给定 URL 中的独特音频 名为 PlayAudio 的 Intent 正在运行 并播放来自 JSON 格式 API 的第一个音频项目 名为 PlaybackNearly
  • 如何在 Amazon Linux 上安装最新版本的 GDAL?

    我想安装GDAL https gdal org 在运行 Amazon Linux 的 EC2 实例上 我认为它基于 RHEL 6 如果可能的话 我想避免从源代码编译 EPEL Yum 存储库中包含的 GDAL 版本对于我的目的来说太旧了 g
  • Ionic 3 Uncaught(承诺):[object Object]

    我是 Ionic 3 和移动开发的新手 我正在尝试将 MySQL DB 连接到我的 Ionic 应用程序和 PHP Restful API 我用 Postman 测试了 API 它工作得很好 为了在 Ionic 中实现它 我做了以下操作 我
  • 如何使用 json 谷歌翻译 api?

    我正在尝试使用来自 python 的 google 翻译和 utf 8 文本 如何调用json api 他们有一个将其嵌入 html 的文档 但我在任何地方都找不到合适的 API 或 wsdl 谢谢 拉斐尔 这是最终对我有用的代码 使用没有
  • 如何在亚马逊云(AWS EC2)中安装firefox?

    我有一个拥有所有权限的 AWS 账户 我想在环境中安装 Firefox 因为我的应用程序将启动 Firefox 并对 Web 应用程序运行一些测试 如何安装火狐浏览器 执行以下命令解决了问题 sudo apt get install xvf
  • 使用 api php 使用通配符从 S3 中删除

    我有这个工作代码可以从 s3 中删除文件和文件夹 如何使用通配符 进行删除 s3 new AmazonS3 bucket mybucket folder myDirectory this doesnt work response s3 gt
  • 由于配置错误,执行失败:Java 中的 Lambda 代理响应格式错误

    我的函数是通过代理 API 网关调用的 该函数执行正常 但 API 调用返回 502 错误 Mon Dec 30 18 16 25 UTC 2019 Endpoint response body before transformations
  • generate_presigned_post 中的 Boto3 InvalidAccessKeyId

    我正在使用 Python 的 Chalice 库创建 AWS Lambda 和 API 我的 AWS 凭证是使用 github 工作流程 aws actions 注入的 它能够chalice deploy 端点正在运行 并且正在完美部署到
  • 国际天气 API (PHP) [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找最好的 免费 便宜 国际天气 PHP API 有什么建议么 看看这个答案 https sta
  • 使用 Python API 2.0.0.1 运行 Ansible Playbook

    安塞布尔版本 2 0 0 1 我现在已经四处寻找了很多 我发现的大多数文档要么不完整 要么已弃用 这篇文章适用于1 8 4版本 即 https stackoverflow com questions 27590039 running ans

随机推荐