我正在用Terraform的AWS构建Lambda函数。 terraform脚本中用于上传环境变量的语法为:
resource "aws_lambda_function" "name_of_function" {
...
environment {
variables = {
foo = "bar"
}
}
}
现在我的仓库中有一个.env
文件,其中包含一堆变量,例如email='admin@example.com'
,我希望terraform从该文件中读取(其中的一些)并将它们注入到空间中,以便env var可以上传并可以用于lambda函数。该怎么办?
答案 0 :(得分:3)
我目前的解决方案涉及3点/步骤。
export TF_VAR_FOO=bar
是的,您必须在变量前面加上TF_VAR_
,这有点令人讨厌,但是我已经学会了使用它(至少在.env中清楚表明,terraform将使用什么变量,而不会。)
TF_VAR_
前缀的此类变量。例如variable "FOO" {
description = "Optionally say something about this variable"
}
. .env
),以便任何此类变量可用于您要在当前Shell环境中启动的进程(此处为terraform)。添加此步骤不会打扰我,因为无论如何我总是使用bash脚本来操作我的仓库。注意:我提出了一种更好的方式来处理.env文件here的请求,尽管我现在实际上已经很满意了(官方文档中对TF与.env文件IMO)。
答案 1 :(得分:2)
这是一个纯 TerraForm 解决方案,可将 .env
文件解析为原生 TerraForm 地图。
output "foo" {
value = { for tuple in regexall("(.*)=(.*)", file("/path/to/.env")) : tuple[0] => tuple[1] }
}
我已将其定义为通过 CLI 进行快速测试的输出,但您始终可以将其定义为本地或直接在参数上。
答案 2 :(得分:0)
我最终写了一个简单的PHP脚本来读取环境文件,解析它是我想要的(explode()
,删除带有“#”的行,再没有其他var等,然后再implode()
),并首先在我的makefile中评估它。看起来像这样:
provision:
@eval $(php ./scripts/terraform-env-vars.php); \
terraform init ./deployment/terraform; \
terraform apply -auto-approve ./deployment/terraform/
不幸的是,terraform具有all environmental variables must be prefixed with TF_VAR_
的荒谬想法。
我用grep
和sed
的组合解决了这个问题,我想用正则表达式将所有环境变量替换为所需的前缀。
首先,您需要在您的.tf文件中声明一个与环境变量同名的input variable:
variable "MY_ENV_VAR" {
type = string
}
然后,在terraform命令之前,使用以下命令:
export $(shell sed -E 's/(.*)/TF_VAR_\1/' my.env | grep -v "#" | grep -v "TF_VAR_$"); terraform apply
这是做什么的
sed
来捕获(.*)
捕获组中的每一行,然后在替换前缀TF_VAR
中捕获第一个捕获组(\1
)#
的所有行)。TF_VAR
的所有行。不幸的是,这还有很多其他以前缀TF_VAR
创建的环境变量,我不确定为什么,但这至少是开始将.env
文件与terraform一起使用。
答案 3 :(得分:0)
我喜欢python,而且我不喜欢污染我的环境变量,我使用了python3虚拟环境和python-dotenv[cli]
包。我知道还有其他语言的dotenv,它们也可能有用。
这就是我所做的...
在Mac上看起来像这样
python3 -m venv venv
source venv/bin/activate
pip install "python-dotenv[cli]"
.env
文件中foo1 = "bar1"
foo2 = "bar2"
dotenv run terraform plan
deactivate
source venv/bin/activate
这允许我在运行其他TF时加载环境变量而不存储它们。