以下配置是从我的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: ...
我只想部署apiHandler
和taskHandler
功能region-a
并在region-b
、region-c
和region-d
中部署alexaHandler
。
如果我执行命令sls deploy --region us-east-1
将部署所有三个功能,但我不需要它。我只需要部署 2 个函数。
- 使用
sls deploy function
不是一个选项,因为它只交换zip文件。 - 将 alexaHandler 放在具有新
serverless.yml
的子目录中不起作用,因为部署仅打包子目录,并且不会包含父目录中的代码。(许多代码在3个功能之间共享)
有什么建议来处理这个要求吗?
在浏览了所有无服务器插件列表后,我发现可以通过无服务器插件选择来实现上述要求
使用此插件,我们可以选择仅从serverless.yml部署几个函数,具体取决于stage
或region
值。在我的情况下使用区域值。
以下是修改后的无服务器.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
则函数部分中的最后一行将填充自定义变量部分中设置的文件,然后部署测试代码。