amazon-web-services - 使用 Lambda 和 API Getway 的 Rest API
问题描述
我开始使用 lambda 和 API Getway 研究 AWS 无服务器,所以我想为示例项目创建一个 REST API。我注意到在 API Getway 中,我们只能创建可以触发 lambda 函数的 http 方法,所以我不确定我是否做对了,但是每个 api 路由是否需要一个 lambda 函数?或者我们可以使用一个 lambda 函数以某种方式处理它。
例如,假设我的项目需要以下列表的 api:
- 登录
- 登记
- 获取用户数据
那么如果我要使用 API Getway 和 Lambda 来实现,我需要 3 个 Lambda 函数吗?
就像我想为上面提到的那些创建 API 一样,端点应该是这样的?
https://API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION_FOR_LOGIN
https://API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION_FOR_REGISTER
https://API_GETWAY_DOMAIN/STAGE/LAMBDA_FUNCTION_FOR_GET_USER_DATA
有没有办法向一个 lambda 函数发送多个 http 请求,并在 lambda 中处理它们中的每一个?
解决方案
可以有多个 API Gateway 路由直接指向同一个 Lambda 函数。如何设置取决于您维护基础架构的方式。
例如,如果您将 CloudFormation 与无服务器应用程序模型 (SAM) 一起使用,我建议您这样做,因为它可能是跟踪无服务器基础设施(以及基础设施即代码 = 真棒)最直接的方法,您将定义您的 AWS:: Serverless::Function 为您在 AWS::Serverless::Api 中定义的每个路由提供单独的API Gateway 源事件。
类似于以下内容:
YourApi:
Type: AWS::Serverless::Api
Properties:
...
DefinitionBody:
swagger: 2.0
...
paths:
'/Login':
post:
x-amazon-apigateway-integration:
# APIG->Lambda requests are always POST
httpMethod: post
type: aws_proxy
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations
'/Register':
post:
x-amazon-apigateway-integration:
# APIG->Lambda requests are always POST
httpMethod: post
type: aws_proxy
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations
'/GetUserData':
get:
x-amazon-apigateway-integration:
# APIG->Lambda requests are always POST
httpMethod: post
type: aws_proxy
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations
YourLambda:
Type: AWS::Serverless::Function
Properties:
...
Events:
login:
Type: Api
Properties:
Path: '/Login'
Method: post
RestApiId: {Ref: YourApi}
register:
Type: Api
Properties:
Path: '/Register'
Method: post
RestApiId: {Ref: YourApi}
getUserData:
Type: Api
Properties:
Path: '/GetUserData'
Method: get
RestApiId: {Ref: YourApi}
但请记住,将路由合并到一个 Lambda 函数中有利有弊。这个 StackOverflow 问题/答案探讨了这一点,但我想为分离的 Lambda 函数添加更多好处:
- 关于路由被调用频率的更清晰的指标- 你会得到调用/错误/等。CloudWatch 中每个 Lambda 函数开箱即用的指标,因此将它们分开可以很容易地查看人们注册和登录的频率等。
- 更精细的警报- 您可以设置不同的延迟/错误/等。不同路由的阈值,如果警报响起,您就可以确切地知道它用于哪个 Lambda 函数。
推荐阅读
- php - 如何从表结构化数据中检索复选框值?
- log4j - log4j 属性文件中的“log4j.logger.com.sivalabs=DEBUG”是什么
- c - gcc开关盒组装中的混乱
- java - 从arraylist获取绑定值
- rust - 为什么加入路径会完全取代 Rust 中的原始路径?
- selenium - Pytest Xdist 并行执行,防止重新创建数据库
- android-studio - Gradle 握手失败
- android - 无法在命令提示符(终端)中运行 android 模拟器
- android - Android 应用程序无法连接到 APN
- java - 用 Java 8 流形成一个特定的列表