使用 Lambda 和 API 网关休息 API
Rest API using Lambda and API Getway
我开始使用 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
有没有办法将多个 http 请求发送到一个 lambda 函数,并在 lambda 中处理每个请求?
可以有多个 API 网关路由指向同一个 Lambda 函数。如何设置取决于您维护基础设施的方式。
例如,如果您将 CloudFormation 与无服务器应用程序模型 (SAM) 结合使用,我推荐这样做,因为它可能是跟踪无服务器基础设施(以及基础设施即代码 = 很棒)的最直接方式,您会为您在 AWS::Serverless::Api.
中定义的每条路线使用单独的 API Gateway source event 定义您的 AWS::Serverless::Function
类似于以下内容:
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 函数中有利也有弊。 探讨了这一点,但我想为分离的 Lambda 函数添加更多好处:
- 关于您的路线被调用频率的更清晰指标 - 您得到 invocations/errors/etc。 CloudWatch 中针对每个开箱即用的 Lambda 函数的指标,因此将它们分开可以很容易地了解人们注册与登录的频率等。
- 更精细的警报 - 您可以设置不同的 latency/error/etc。不同路线的阈值,如果警报响起,您确切知道它适用于哪个 Lambda 函数。
我开始使用 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
有没有办法将多个 http 请求发送到一个 lambda 函数,并在 lambda 中处理每个请求?
可以有多个 API 网关路由指向同一个 Lambda 函数。如何设置取决于您维护基础设施的方式。
例如,如果您将 CloudFormation 与无服务器应用程序模型 (SAM) 结合使用,我推荐这样做,因为它可能是跟踪无服务器基础设施(以及基础设施即代码 = 很棒)的最直接方式,您会为您在 AWS::Serverless::Api.
中定义的每条路线使用单独的 API Gateway source event 定义您的 AWS::Serverless::Function类似于以下内容:
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 函数中有利也有弊。
- 关于您的路线被调用频率的更清晰指标 - 您得到 invocations/errors/etc。 CloudWatch 中针对每个开箱即用的 Lambda 函数的指标,因此将它们分开可以很容易地了解人们注册与登录的频率等。
- 更精细的警报 - 您可以设置不同的 latency/error/etc。不同路线的阈值,如果警报响起,您确切知道它适用于哪个 Lambda 函数。