serverless中的环境变量和stage


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

serverless教程
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

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !