Serverless 变量
Serverless 支持在项目配置文件中复用配置文件中的配置变量,使用环境变量,引用其他组件部署后的**输出的变量(output)**来更灵活的进行配置。
配置变量
在 serverless 应用配置中,可以通过 ${变量名称}
来引用当前配置文件中已有的变量,如:
app: my-serverless-app
component: scf
stage: dev
name: my-scf-sls-instance-name # 实例名称
inputs:
name: ${name} # 腾讯云 SCF 实例名称
...
这里复用 serverless 配置变量,会使用实例名称
my-scf-sls-instance-name
作为腾讯云部署的 SCF 实例名称。
环境变量
在 serverless 应用配置中,可以通过 ${env:变量名称}
来使用环境变量,环境变量会在部署时加载并替换配置文件中的变量。如:
app: my-serverless-app
component: scf
stage: dev
name: my-scf-sls-instance-name # 实例名称
inputs:
name: ${env:NAME} # 腾讯云 SCF 实例名称
...
这里使用环境变量
STAGE
作为 serverless stage 的配置值。
要使用环境变量,可以在部署时传递,如:
NAME=scf-instance-name sls deploy
或将环境变量保存在 .env
文件中,如:
NAME=scf-instance-name
stage 环境变量
除了使用 .env
来存储环境变量信息,可以使用 .env.${stage}
来根据指定 stage 加载不同的环境变量。
要使用 stage 环境变量进行部署 可以使用命令 sls deploy --stage {stage名称}
以下是执行 sls deploy
时,环境变量文件的加载顺序:
./.env.${stage}
./.env
../.env.${stage}
../.env
../../.env.${stage}
../../.env
为了方便进行多组件应用开发(详见Serverless 项目结构),可以将环境变量文件存储到一级或二级父目录中。
输出变量
在进行多组件应用开发时,您可以直接引用其他组件实例的输出信息,Serverless 会自动按照引用依赖顺序进行部署,如:
app: my-serverless-app
component: scf
stage: dev
name: my-scf-sls-instance-name # 实例名称
inputs:
vpcName: ${output:prod:my-app:vpc.name} # 获取vpc组件中的输出信息
vpcName: ${output:${stage}:${app}:vpc.name} # 上述方式也可以组合使用
...
可以通过
sls info
查看组件的输出变量信息,也可以在应用控制台查看组件的输出变量信息。
执行环境变量
当 serverless 应用执行时,有时需要动态加载环境变量信息,比如当应用需要连接数据库时,会通过执行时的环境变量信息加载配置信息:
// 在代码中动态加载环境信息。
const client = new Client({
connectionString: process.env.PG_CONNECT_STRING,
});
这是可以使用 serverless 的执行环境变量来进行配置,仅需要在 serverless.yml
中配置 envoironments
信息,之后应用执行时就可以加载对应的环境变量信息,配置示例:
app: my-app-demo
component: multi-scf
name: sls-demo-msn
inputs:
...
environments:
- key: PG_CONNECT_STRING_STRING # 使用固定的链接字符串
value: postgresql://admin:secret@my_pg_host
- key: PG_CONNECT_STRING_ENV # 使用部署时环境变量传递的链接字符串
value: ${env:MY_PG_CONNECT_STRING}
- key: PG_CONNECT_STRING_OUTPUT # 使用实例 sls-demo-msn-DB 部署结果生成的链接字符串
value: ${output:${stage}:${app}:sls-demo-msn-DB.private.connectionString}
...
在 serverless.yml 的环境变量信息中可以使用固定值,环境变量赋值或其他组件 output 结果赋值方式进行赋值。