如何以 DRY 方式定义变量

How to define variables in a DRY way

假设我有写入 S3 存储桶的函数。因此,存储桶名称显然是一个 "variable",不应将其硬编码到函数中(例如,开发与生产可能是不同的存储桶)。

现在,如果我希望函数能够访问它,我至少需要在两个地方使用存储桶名称:

  1. 在函数的 IAM 策略中(允许访问存储桶)。
  2. 在函数本身。

对于 #1,我可以使用一个变量,并引用 s-module 中定义的 IAM 策略中的变量(或者在 v0.4 中调用的任何变量 :)。

对于#2,我可以使用一个环境变量,然后我可以在运行时在函数代码中访问它的值。

但我当然不想定义变量两次(一次在 sls env set 中,一次在 s-variables 文件中)。那不是很干。但是,我没有看到在定义 envars 时引用变量的方法,反之亦然。

如何在一个地方定义存储桶名称?

Serverless v0.5 开始,这很容易。环境变量处理混合了 Serverless Project Variables。您以每个阶段每个区域的方式在 _meta/variables/... 中定义项目变量;例如,在 s-variables-dev-useast1.json:

{
    "foo_bucket": "com.example.foo-bucket"
}

然后,在使用该存储桶的 s-function.json 文件中,定义函数需要的环境变量...和 ​​reference 项目变量以类似模板的方式:

"environment": {
    "BUCKET": "${foo_bucket}"
}

然后它将像任何其他环境变量一样出现;所以在节点中:

console.log("The Bucket: " + process.env.BUCKET); 
// prints "The Bucket: com.example.foo-bucket"

到目前为止 Serverless docs 还没有赶上这个变化,但我希望他们很快就会赶上。