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