无服务器部署到 AWS、Azure 或 GCP
Serverless deploying to AWS, Azure or GCP
使用无服务器框架的人是否知道如果底层代码可用,是否可以使用相同的无服务器部署文件部署到所有三个云提供商?
或者是每个云提供商特定的无服务器文件?
谢谢
假设您所有的函数代码都是提供者不可知的...
每个提供程序都有自己特定的定义和配置方式,因此您会期望每个提供程序的 serverless.yml
文件的 low-level 详细信息会有所不同。
话虽这么说,serverless.yml
的 high-level 属性对于大多数(如果不是全部)提供者来说非常普遍。
service:
provider:
plugins:
functions:
这将允许您为所有提供商提供一个 serverless.yml
,这些提供商仅根据环境变量引用其他 YAML 文件。假设您的 provider-specific 配置有 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
@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 [ "" != "" ]; then
echo "copying serverless-.yml to serverless.yml and running serverless deploy"
cp serverless-.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
使用无服务器框架的人是否知道如果底层代码可用,是否可以使用相同的无服务器部署文件部署到所有三个云提供商?
或者是每个云提供商特定的无服务器文件?
谢谢
假设您所有的函数代码都是提供者不可知的...
每个提供程序都有自己特定的定义和配置方式,因此您会期望每个提供程序的 serverless.yml
文件的 low-level 详细信息会有所不同。
话虽这么说,serverless.yml
的 high-level 属性对于大多数(如果不是全部)提供者来说非常普遍。
service:
provider:
plugins:
functions:
这将允许您为所有提供商提供一个 serverless.yml
,这些提供商仅根据环境变量引用其他 YAML 文件。假设您的 provider-specific 配置有 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
@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 [ "" != "" ]; then
echo "copying serverless-.yml to serverless.yml and running serverless deploy"
cp serverless-.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