我正在为我的电子商务应用程序创建设计。它将有多个由AWS Lambdas支持的服务。Orderservice、InventoryService、PaymentService、logingservice、dashboardService就是其中的一些服务。我不能给出确切的服务数量,但肯定会超过15个。根据这个链接微服务,一个好的微服务架构应该有一个路由到相应服务的网关。带有订单Lambda函数的AWS apiggateway的代码如下所示。
我的问题是,Orderservice、inventoryservice、paymentservice等每个服务都可以有多个get、post、delete、put路由。它们中的大多数都有嵌套的资源。在这种情况下,我应该在同一个SAM模板中为所有这些服务包括api路由和lambda函数吗?如果是的话,它不是一个单体模板吗?如果我需要更改任何服务,我就必须部署整个模板,这就违背了微服务原则。理想情况下,我希望独立部署所有这些服务,同时共享ApiGateway。这可能吗?如果没有,我是否应该在不同的SAM模板中为每个服务创建单独的apiggateway,以便它们可以单独部署?这将导致身份验证、授权、监控在所有网关中重复,这听起来也不像是可行的方法。
请建议怎么做才是正确的。
AWSTemplateFormatVersion: "2010-09-09"
Transform: "AWS::Serverless-2016-10-31"
Description: ApiGateway for the Ecommerce
Resources:
EcomApi:
Type: AWS::Serverless::Api
Properties:
DefinitionBody:
swagger: "2.0"
info:
title: Ecommerce Api
schemes:
- "https"
x-amazon-apigateway-request-validator: Validate body and params
paths:
/order:
get:
summary: Get the orders
consumes:
- "application/json"
produces:
- "application/json"
responses:
"200":
description: "200 response"
schema:
$ref: "#/definitions/Empty"
headers:
Access-Control-Allow-Origin:
type: "string"
security:
- Auth: []
x-amazon-apigateway-integration:
type: "AWS_PROXY"
httpMethod: "POST"
uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetOrders.Arn}/invocations
responses:
default:
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Origin: "'*'"
passthroughBehavior: "when_no_match"
contentHandling: "CONVERT_TO_TEXT"
GetOrders:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Handler: src/handlers/getOrders.handler
Role:
Fn::GetAtt:
- TestRole
- Arn
Events:
List:
Type: Api
Properties:
Path: /orders
Method: get
RestApiId: !Ref EcomApi
正如您所提到的—创建一个单独的API网关,并与您的API共享它。根据AWS的说法,建议使用一个单独的API网关来服务多个Lambda函数。
我承认我不是一个精通AWS SAM的人,但是用无服务器框架做这件事真的很容易。