【问题标题】:How to define variables in a DRY way如何以 DRY 方式定义变量
【发布时间】:2016-03-25 22:02:19
【问题描述】:

假设我有写入 S3 存储桶的函数。因此,存储桶名称显然是一个“变量”,不应将其硬编码到函数中(例如,对于 dev 和 prod 可能是不同的存储桶)。

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

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

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

对于 #2,我可以使用 env var,然后我可以在运行时在函数代码中访问其值。

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

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

【问题讨论】:

  • 到目前为止,我已经完全做到了这一点:将模板变量与 env 变量一起复制。虽然还没有编辑,但我希望有一个插件可以将该过程自动化作为 env 声明过程的一部分。
  • 从变量中引用 envar 的能力,反之亦然。哎呀,在其中任何一个中引用实际进程环境变量的能力就足够了。

标签: serverless-framework


【解决方案1】:

截至Serverless v0.5,这很容易。环境变量处理混合了无服务器项目变量。您在_meta/variables/... 中以每阶段每区域的方式定义项目变量;比如s-variables-dev-useast1.json:

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

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

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

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

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

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

【讨论】:

  • @AssafLavie 您能否接受 Peter Wagener 的回答,因为它是您问题的正确解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多