在使用serverless框架的时候,经常要使用各种环境变量。下面就总结一下这些环境变量的用法。同时介绍如何在不同的stage(local,dev,staging,prod)中配置不同的变量值。

serverless教程
最基本的环境变量
在provider下,可以定义一些基本的环境变量,比如stage, region等,这些变量在后面可能会用到。
yaml
provider:
name: aws
runtime: nodejs14.x
stage: dev
region: eu-west-1
如果在serverless.yml中,想要引用这些环境变量的话,可以使用:
yaml
${self:provider.region}
看一个完整的例子:
yaml
Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/demo_table"
自定义环境变量
像上面例子中的表名称,使用的是写死的字符串,一般情况下不这么做,而是声明一个自定义环境变量:
yaml
custom:
DEMO_TABLE_NAME: my-demo-table
然后再通过 ${self:custom.DEMO_TABLE_NAME} 引用它:
yaml
Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/${self:custom.DEMO_TABLE_NAME}"
如何在不同的stage中配置不同变量值
关于不同stage的介绍
一般情况下,我们可能会有以下的几个stage:
- local:使用一些插件在本地模拟Cloud环境
- dev:开发环境,在云端
- staging:测试环境,在云端
- prod:产品环境,在云端
默认方式下,所有环境变量在不同的stage下都有效。但有一些环境变量应该在不同的stage环境中保存不同的值,比如:数据库的host,port,dbname, username, password等信息。因此,最理想的方式就是这样的:
yaml
custom:
stages:
- local
- dev
- staging
- prod
mysqlHost:
local: localhost
dev: your.server.com
staging: ${ssm:/yourapp/staging/mysql-host}
prod: ${ssm:/yourapp/prod/mysql-host}
mysqlPort:
local: '9306'
dev: '3306'
staging: '3306'
prod: '3306'
environment:
MYSQL_HOST: ${self:custom.mysqlHost.${self:provider.stage}}
这样的话,如果能够动态获得stage,就能动态获得host,port等信息了。关于ssm,请参考AWS Systems Manager Parameter Store
要想实现这个功能,首先,在provider.stage中,声明:
yaml
provider:
stage: ${opt:stage,'local'}
这意味着,如果在调用serverless时,没有传递命令行参数,就会将’local’赋予stage,否则,会使用传递过来的stage参数。比如:在调用serverless的时候,使用 -s:
bash
sls invoke local -f dbFunction1 -p /path/to/event.json -s dev