Как я могу прочитать переменные окружения из файла .env в скрипт terraform? - PullRequest
1 голос
/ 17 января 2020

Я строю лямбда-функцию на aws с помощью terraform. Синтаксис в скрипте terraform для загрузки env var:

resource "aws_lambda_function" "name_of_function" {

  ...

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

Теперь у меня есть файл .env в моем репо с кучей переменных, например, email='admin@example.com', и я бы хотел terraform читать (некоторые из) их из этого файла и вставлять их в пространство для загрузки env-переменных и их доступности для лямбда-функции. Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Мое решение на данный момент включает 3 пункта / шага.

  1. Поместите свои переменные в файл .env следующим образом:
export TF_FOO=bar

Да, это немного раздражает что вы ДОЛЖНЫ ставить префиксы перед вашими TF_, но я научился жить с этим (по крайней мере, в вашем .env ясно, какие переменные будут использовать terraform, а какие нет).

В вашем сценарии TF вы должны объявить любую такую ​​переменную без префикса TF_. Например,
variable "FOO" {
  description = "Optionally say something about this variable"
}
Перед запуском terraform вам необходимо получить исходный файл .env (. .env), чтобы любая такая переменная была доступна процессам, которые вы хотите запустить в вашей нынешней среде оболочки (а именно: terraform здесь). Добавление этого шага меня не беспокоит, так как я все равно оперирую своим репозиторием со скриптами bash.

Примечание: я вставил запрос на лучший способ обработки файлов .env здесь хотя сейчас я действительно доволен тем, что есть (просто в официальной документации было плохо описано, как TF относится к IMO-файлам .env).

0 голосов
/ 25 марта 2020

В итоге я написал простой PHP скрипт для чтения файла env, проанализировал его, как я хотел (explode(), удалите строки с помощью '#', никаких других переменных и т.д. c, затем implode() снова) и просто проверьте это в моем make-файле первым. Выглядит это так:

provision:
    @eval $(php ./scripts/terraform-env-vars.php); \
    terraform init ./deployment/terraform; \
    terraform apply -auto-approve ./deployment/terraform/

К сожалению, у terraform возникла нелепая идея, что все переменные среды должны иметь префикс TF_VAR_.

Я решил это с помощью комбинация grep и sed, с идеей, что я бы regex заменил все переменные окружения на требуемый префикс.

Во-первых, вам нужно объявить входную переменную с тем же самым имя в качестве переменной среды в вашем файле .tf:

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.

...