如何将环境变量从.env文件读取到terraform脚本中?

时间:2020-01-17 14:52:02

标签: terraform

我正在用Terraform的AWS构建Lambda函数。 terraform脚本中用于上传环境变量的语法为:

resource "aws_lambda_function" "name_of_function" {

  ...

  environment {
    variables = {
      foo     = "bar"
    }
  }
}

现在我的仓库中有一个.env文件,其中包含一堆变量,例如email='admin@example.com',我希望terraform从该文件中读取(其中的一些)并将它们注入到空间中,以便env var可以上传并可以用于lambda函数。该怎么办?

4 个答案:

答案 0 :(得分:3)

我目前的解决方案涉及3点/步骤。

  1. 将变量放在.env文件中,如下所示:
export TF_VAR_FOO=bar

是的,您必须在变量前面加上TF_VAR_,这有点令人讨厌,但是我已经学会了使用它(至少在.env中清楚表明,terraform将使用什么变量,而不会。)

  1. 在TF脚本中,您必须声明任何不带TF_VAR_前缀的此类变量。例如
variable "FOO" {
  description = "Optionally say something about this variable"
}
  1. 在运行terraform之前,需要获取.env文件(. .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_的荒谬想法。

我用grepsed的组合解决了这个问题,我想用正则表达式将所有环境变量替换为所需的前缀。

首先,您需要在您的.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
  • 使用grep删除所有带有注释的行(带有#的所有行)。
  • 使用grep删除仅包含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"

然后,当您运行Terraform时,请使用dotenv cli前缀

dotenv run terraform plan

完成虚拟环境后

deactivate

要稍后再从TF目录开始

source venv/bin/activate

这允许我在运行其他TF时加载环境变量而不存储它们。