如何以DRY方式定义变量

时间:2016-02-13 16:00:31

标签: serverless-framework

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

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

  1. 在函数的IAM策略中(允许访问存储桶)。
  2. 在功能本身。
  3. 对于#1,我可以使用变量,并参考s-module中定义的IAM策略中的变量(或v0.4中调用的任何内容)。

    对于#2,我可以使用一个env var,我可以在运行时在函数代码中访问它的值。

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

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

1 个答案:

答案 0 :(得分:8)

截至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尚未赶上这一变化,但我预计它们应该很快就会出现。