假设我有写入S3存储桶的功能.所以存储桶名称显然是一个"变量",不应该硬编码到函数中(例如,对于dev与prod可能是不同的存储桶).
现在,如果我希望函数能够访问它,我需要在至少两个地方使用存储桶名称:
在功能的IAM策略中(允许访问存储桶).
在功能本身.
对于#1,我可以使用变量,并参考在s-module
(或在v0.4 :)中调用的任何IAM策略中的变量.
对于#2,我可以使用env var,我可以在运行时在函数代码中访问它的值.
但我当然不希望两次定义变量(一次使用sls env set
和一次在s-variables
文件中).那不是很干.但是,我没有看到在定义envars时引用变量的方法,反之亦然.
我怎么能在一个地方定义桶名?
从Serverless v0.5开始,这非常简单.环境变量处理混合无服务器项目变量.您可以_meta/variables/...
按每个区域的每个阶段的方式定义项目变量; 例如,在s-variables-dev-useast1.json
:
{ "foo_bucket": "com.example.foo-bucket" }
然后,在s-function.json
使用该存储桶的文件中,定义功能需要的环境变量...并以类似模板的方式引用项目变量:
"environment": { "BUCKET": "${foo_bucket}" }
然后它将像任何其他环境变量一样出现; 所以在Node中:
console.log("The Bucket: " + process.env.BUCKET); // prints "The Bucket: com.example.foo-bucket"
到目前为止,无服务器的文档还没有赶上这个变化,但我预计它们应该很快就会出现.