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,有代码示例。
如果我有两个服务,'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,有代码示例。