无服务器离线:处理多个 API 网关

Serverless Offline: handle multiple API gateways

当您只有一个时,您可以使用 Serverless Framework 和 Serverless Offline Plugin 轻松调试您的无服务器应用程序,但是当您有多个 API Gateways/services 时如何处理?

我是否应该 运行 serverless offline 为每个服务配置不同的端口 .yml
并在环境变量中对该端口进行硬编码,以便在 process.env.offline 为真时我可以访问该端口?

如果您想 运行 两个或多个无服务器 API 网关同时在本地使用 --port 参数可以轻松实现。

基本上,打开两个命令行 windows,在第一个 window 中,转到您的第一个服务目录和 运行:

sls offline start --port 3001

在另一个 window 中,转到您的第二个服务 运行:

sls offline start --port 3002

这样您将有两个服务侦听两个端口(在本示例中为 http://localhost:3001http://localhost:3002)。

如果您还使用 serverless-dynamodb-local 插件,那么(目前)有一个问题:

如果你不使用 DynamoDB 插件那么你没关系,现在可以停止阅读:)

DynamoDB 插件使用相同的 --port 参数,这导致 java.net.BindException: Address already in use

看到这个问题:https://github.com/99xt/serverless-dynamodb-local/issues/135

解决方法是在一项服务中启用serverless-offline-local插件(如果您有两项或更多)。

例如, 在 my-service-1 中,您将所有 dynamodb 配置保存在 serverless.yaml 文件中,并使用默认端口启动此服务:sls offline start --migrate true。在下一个服务中,我们称它为 my-service-2 you remove serverless-dynamodb-local from plugins in serverless.yaml(不需要任何其他更改),然后您可以使用以下命令启动服务:sls offline start --port 3001

第一个服务将启动 DynamoDB,第二个服务将能够使用它。

我所做的是创建另一个具有其他服务所有功能的服务。下面是我的文件夹结构。

main/
├── service1/
│   ├── ...
│   └── serverless.yml 
├── service2/
│   ├── ...
│   └── serverless.yml
├── serverless.yml # offline service with serverless-offline plugin
├── node_modules # 1 node_modules for every services
└── ...

您可以删除 service1 和 service2 上的 serverless-offline 插件。

更新!

我开发了一个离线生成脚本serverless.yml。在此处查看示例:https://github.com/Necromancerx/serverless-offline-template

2022 年接受 的更新

根据 documentation--port 不再可用 使用 --httpPort 代替,如下面的代码

sls offline --httpPort 3001

或任何 CLI 选项都可以添加到您的 serverless.yml。例如:

custom:
  serverless-offline:
    httpsProtocol: "dev-certs"
    httpPort: 4000
    stageVariables:
      foo: "bar"

来自 official documentation

查看此包:https://github.com/edis/sls-multi-gateways

它在您的本地环境中模拟 AWS API 网关的 API 映射。

它允许您 运行 多个 API 单个端口下的网关(在您的本地),根据您配置的基本路径将请求转发到每个服务。

例如,如果您有两个无服务器应用程序——一个用于身份验证,一个用于产品。您可以为每个无服务器应用分配不同的基本路径。因此,当您收到对 localhost:3000/auth/* 的请求时,它会将请求发送到 auth 无服务器应用程序。当您收到对 localhost:3000/products/* 的请求时,它会将请求发送到产品无服务器应用程序。