在无服务器 v1.x 中设置"local"阶段环境变量



在无服务器 1.x 框架中,您可以在服务根目录的serverless.yml文件中设置环境变量。我正在尝试设置与服务运行的阶段相对应的STAGE变量。devprod很容易,就像这样:

provider:
  name: aws
  ...
  stage: dev
  environment:
    STAGE: ${opt:stage, self:provider.stage}

这意味着如果显式定义了--stage,则 env 变量使用该变量。如果不是,则使用默认dev

但是,当我使用sls invoke local时,默认阶段将是dev,这是不正确的。在本地调用时使舞台local的最佳方法是什么?

显而易见的解决方案是向命令添加-s local。然而,这开始变得过于冗长,不符合我的喜好,并且它还增加了意外部署到称为local的新阶段的可能性,这显然是不可取的。

因此,我创建了这个辅助器bash函数:

# Invoke serverless service
invoke() { 
    if [ "${1}" == "local" ]; then
        stage="local -s local"
    else
        stage="-s ${1}"
    fi
    payloads_dir="tests/payloads/"
    if [ -z $3 ]; then
        payload="${payloads_dir}${2}/default.json"
    else
        payload="${payloads_dir}${2}/${3}.json"
    fi
    if [ ! -f "${payload}" ]; then
        echo $payload
        echo "Payload does not exist."
        return 1
    fi
    time --format='%e seconds' serverless invoke $stage -f $2 -p $payload
}

用法:$ invoke stage function_name [payload_name]

例子:

$ invoke local myFunction

将在应用local阶段 env 时,使用有效负载在 tests/payloads/myFunction/default.json 处本地调用该函数。

$ invoke dev myFunction my_payload

将使用阶段 dev 和有效负载tests/payloads/myFunction/my_payload.json调用已部署的函数(如果部署的服务具有适当的 serverless.yml 文件,则阶段环境将是正确的(。

这显然是一个优化的实现,但请根据自己的喜好随意修改它!

最新更新