无服务器离线:处理多个 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:3001
和 http://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"
查看此包:https://github.com/edis/sls-multi-gateways
它在您的本地环境中模拟 AWS API 网关的 API 映射。
它允许您 运行 多个 API 单个端口下的网关(在您的本地),根据您配置的基本路径将请求转发到每个服务。
例如,如果您有两个无服务器应用程序——一个用于身份验证,一个用于产品。您可以为每个无服务器应用分配不同的基本路径。因此,当您收到对 localhost:3000/auth/* 的请求时,它会将请求发送到 auth 无服务器应用程序。当您收到对 localhost:3000/products/* 的请求时,它会将请求发送到产品无服务器应用程序。
当您只有一个时,您可以使用 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:3001
和 http://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"
查看此包:https://github.com/edis/sls-multi-gateways
它在您的本地环境中模拟 AWS API 网关的 API 映射。
它允许您 运行 多个 API 单个端口下的网关(在您的本地),根据您配置的基本路径将请求转发到每个服务。
例如,如果您有两个无服务器应用程序——一个用于身份验证,一个用于产品。您可以为每个无服务器应用分配不同的基本路径。因此,当您收到对 localhost:3000/auth/* 的请求时,它会将请求发送到 auth 无服务器应用程序。当您收到对 localhost:3000/products/* 的请求时,它会将请求发送到产品无服务器应用程序。