按区域划分的无服务器条件函数部署



以下配置是从我的serverless.yml中提取

service: test-svc
provider:
name: aws
...
functions:
apiHandler:
handler: index.handler
events:
- http: ANY /
- http: 'ANY {proxy+}'
taskHandler:
handler: task.handler
events:
- sqs:
...
alexaHandler:
handler: alexa.handler
events:
- alexaSmartHome: ...

我只想部署apiHandlertaskHandler功能region-a

并在region-bregion-cregion-d中部署alexaHandler

如果我执行命令sls deploy --region us-east-1将部署所有三个功能,但我不需要它。我只需要部署 2 个函数。

  1. 使用sls deploy function不是一个选项,因为它只交换zip文件。
  2. 将 alexaHandler 放在具有新serverless.yml的子目录中不起作用,因为部署仅打包子目录,并且不会包含父目录中的代码。(许多代码在3个功能之间共享)

有什么建议来处理这个要求吗?

在浏览了所有无服务器插件列表后,我发现可以通过无服务器插件选择来实现上述要求

使用此插件,我们可以选择仅从serverless.yml部署几个函数,具体取决于stageregion值。在我的情况下使用区域值。

以下是修改后的无服务器.yml。plugins部分添加,并在每个函数中添加regions键。

service: test-svc

plugins:
- serverless-plugin-select
provider:
name: aws
...
functions:
apiHandler:
...
regions:
- us-west-2
taskHandler:
...
regions:
- us-west-2
alexaHandler:
...
regions:
- eu-west-1
- us-east-1
- us-west-2

使用上述配置,我使用以下 bash 脚本为所有区域进行部署。

#!/usr/bin/env bash
serverless deploy --region eu-west-1
serverless deploy --region us-east-1
serverless deploy --region us-west-2

您可以通过将条件函数存储在自定义变量中来有条件地选择 serverless.yml 中的值,例如

### serverless.yml
provider:
name: << aws or your provider >>
runtime: << your runtime, eg nodejs8.10 >>
region: << your aws region >>
stage: ${opt:stage, 'dev'}
custom:
extraCode:
dev:
testing: ${file(testing_only/testing_endpoints.yml)}
prod:
...
## and then at the functions section of serverless.yml
functions:
- ${file(functions/someFunctionsInAFile.yml)}
- ${file(functions/someMoreFunctions.yml)}
- ${self:custom.extraCode.${self:provider.stage}}

部署无服务器时,应传入命令行选项--stage=myStageName以便在传入--stage=dev--stage=prod时,函数部分中的最后一行将为空,并且不会部署任何内容。

如果传入--stage=testing则函数部分中的最后一行将填充自定义变量部分中设置的文件,然后部署测试代码。

最新更新