Serverless Framework - 一个 APIGW 端点下的两个服务

Serverless Framework - Two services under one APIGW endpoint

如果我有两个服务,'Users' 和 'Products',每个服务都有几个函数,每个函数都有定义的端点(就像任何传统的 API 一样),它们是否可能在代码库中单独组织(为清楚起见)但一旦部署共享相同的 API 库 URL?例如,假设我有以下结构:

/src
-- /users
---- event.json
---- handler.js
---- serverless.yml
-- /products
---- event.json
---- handler.js
---- serverless.yml

我的 src/users/serverless.yml 定义如下:

functions:
  create:
    handler: handler.create
    events:
      - http: POST user

  read:
    handler: handler.read
    events:
      - http: GET user

和我的src/products/serverless.yml基本一样,只是把'user'换成'products'。

目前,这两项服务都将部署到截然不同的 API 端点,一个端点为 URL https://fghijklmnop.execute-api...,另一个端点为 URL https://abcdevwxyz.execute-api....

我的问题是,是否可以部署这些服务,但保留在单个 API 和单个 URL 下(因此两者都将在 URL https://abcdevwxyz.execute-api....)?

我假设答案是 'No, because Cloud Formation...',但我认为我 post 这里的问题只是为了讨论和帮助我自己理解构建无服务器应用程序。

我知道根据 the answer here 使用自定义域,但是为了加快开发周期,这并不是一个真正理想的解决方案。

到目前为止,我唯一的解决方案是简单地创建一个名为 'api' 的服务,它将包含我的 API 需要的所有端点,它将直接调用我其他服务的 Lambda 函数,而不是通过先前配置的端点。它实际上是一个抽象层,但可能会向我的应用程序添加不必要的层。同样,很想知道社区对此有何看法。

您可以将多个功能合二为一serverless.yml

/src
-- event.json
-- users.handler.js
-- products.handler.js
-- serverless.yml

我不能直接说无服务器框架支持,但这在 API 网关中肯定是可能的。

您可以为每个 "sub API" 维护多个 Swagger 文件,并使用 import?mode=merge 将两个定义导入同一个 API.

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-import-api.html

谢谢, 瑞安

您可以使用自定义域名:http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

设置自定义域名(您需要 SSL 证书)http://myapi.com/

然后映射您的 API :

http://myapi.com/users
http://myapi.com/products 

只需像这样调用您的函数即可:

http://myapi.com/users/create
http://myapi.com/users/read
http://myapi.com/products/whaterver

我对自己的代码所做的是将所有代码从 handler.js 文件中提取出来,并将其放入模块中。 handler.js 文件中需要这些模块,然后将调用一个简单的函数。

usersModule.js:

export const doSomething = () => {
    // Do something here.
};

users/handler.js:

import {doSomething} from '../.../usersModule.js';

export const handler = ( event, context, callback ) => {
    doSomething();
    // Do other stuff...
    callback( null, "Success" );
};

通过这种方式,您可以将代码的内容放在您想要的任何位置,以您认为有意义的任何方式进行组织。

但是,您仍然需要定义一个 API。或者使用 RyanG-AWS 的答案来合并 APIs.


如果您仍然希望将代码和 API 定义分开,您可以分别创建用户 API 和产品 API。然后您将有另一个组合 API 调用这些 API 中的任何一个。因此,通过这种方式,您将拥有一个服务,该服务具有您要调用的单个基 URL。您可以使用集成类型 HTTP 执行此操作。这个我没试过,不知道效果如何。

我想出了自己的解决方案来解决这个问题。我抽象了我的应用程序的集成点,以便我有特定的集成服务(API、S3、SNS 等)响应事件,然后处理这些事件并将它们委托给单独的微服务。我在上面写了一个article,有代码示例。