使用无服务器框架的人是否知道如果底层代码能够使用相同的无服务器部署文件来部署到所有三个云提供商?
或者是特定于每个云提供商的无服务器文件?
由于
答案 0 :(得分:1)
假设您的所有功能代码都与提供商无关......
每个提供商都有自己定义和配置事物的特定方式,因此您可能希望每个提供商的serverless.yml
文件的低级详细信息不同。
话虽如此,serverless.yml
的高级属性对于大多数(如果不是全部)提供商来说都是非常常见的。
service:
provider:
plugins:
functions:
这将允许您根据环境变量为所有仅引用其他YAML文件的提供程序提供一个serverless.yml
。假设您的提供商特定配置有serverless-aws.yml
,serverless-azure.yml
和serverless-google.yml
,您应该可以在serverless.yml
中使用此功能,
service: ${file(serverless-${env:PROVIDER}.yml):service}
plugins: ${file(serverless-${env:PROVIDER}.yml):plugins}
provider: ${file(serverless-${env:PROVIDER}.yml):provider}
functions:
getSomething: ${file(serverless-${env:PROVIDER}.yml):functions.getSomething}
createSomething: ${file(serverless-${env:PROVIDER}.yml):functions.createSomething}
updateSomething: ${file(serverless-${env:PROVIDER}.yml):functions.updateSomething}
deleteSomething: ${file(serverless-${env:PROVIDER}.yml):functions.deleteSomething}
无论何时部署,您都可以通过指定PROVIDER
环境变量来选择要使用的提供程序。
$ PROVIDER=aws sls deploy # Deploys to AWS
$ PROVIDER=azure sls deploy # Deploys to Azure
$ PROVIDER=google sls deploy # Deploys to GCP
答案 1 :(得分:0)
@dashmug的答案应该有效,但无效。如果您尝试包含整个提供者部分,则不会对其进行评估-即srs print
只会吐出未评估的表达式:
provider: ${file(serverless-${env:PROVIDER}.yml):provider}
尝试参数化每个键不起作用,因为它会更改顺序,这似乎会导致部署失败:
//serverless.yml
...
provider:
name: ${file(serverless-${env:PROVIDER}.yml):provider.name}
runtime: ${file(serverless-${env:PROVIDER}.yml):provider.runtime}
stage: ${file(serverless-${env:PROVIDER}.yml):provider.stage}
...
结果:
> sls print
service: my-crossplatform-service
provider:
stage: prod
name: aws
runtime: nodejs8.10
我最终只维护了单独的serverless.yml
文件,并使用了一个bash脚本进行部署,该脚本首先复制了相应的文件:
#!/bin/bash
if [ "$1" != "" ]; then
echo "copying serverless-$1.yml to serverless.yml and running serverless deploy"
cp serverless-$1.yml serverless.yml && sls deploy
else
echo "Please append provider, like 'deploy.sh aws' or 'deploy.sh azure'"
fi
真的希望您可以按照以下要求将配置文件指定为部署选项:https://github.com/serverless/serverless/issues/4485