在无服务器 1.x 框架中,您可以在服务根目录的serverless.yml
文件中设置环境变量。我正在尝试设置与服务运行的阶段相对应的STAGE
变量。dev
和prod
很容易,就像这样:
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
文件,则阶段环境将是正确的(。
这显然是一个优化的实现,但请根据自己的喜好随意修改它!