Как добавить лямбда-переменную окружения с помощью terraform?

Я хочу, чтобы моя лямбда вызывала API, а для этого требуется токен API. Я хочу поместить токен API в переменную среды лямбда. Как я могу сделать это с помощью Terraform? Или я неправильно подхожу к этому?

Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
12
1
14 691
4

Ответы 4

Документация здесь дает довольно хороший пример. В основном это блок environment с блоком variables. Затем любые пары ключ-значение, которые вы хотите. Предполагая, что вы используете nodejs, вы можете ссылаться на эти переменные в своем лямбда-коде, выполнив process.env.api_key. Эти значения будут храниться в простой текст в вашем коде terraform, а также в файле состояния terraform. AWS шифрует переменные среды, но вам нужно позаботиться о том, как эти значения попадают туда. Если вам неудобно, что они хранятся в git и в любом хранилище, которое вы используете для своего файла состояния, вы можете добавить их вручную через консоль.

resource "aws_lambda_function" "test_lambda" {
  filename         = "lambda_function_payload.zip"
  function_name    = "lambda_function_name"
  runtime          = "nodejs8.10"
  ...

  environment {
    variables = {
      api_key = "super_secret"
    }
  }
}

Мне просто нужно войти в панель управления AWS через браузер, чтобы добавить переменные среды?

Strawberry 27.10.2018 15:46

Подожди, я не понимаю. Если я установлю "super_secret" в файле terraform и зафиксирую его, тогда он будет зафиксирован в git?

Strawberry 27.10.2018 15:47

Да, тогда это будет в git. Даже если вы используете файл переменных, который вы не регистрируете, значение будет сохранено (в виде открытого текста) в вашем файле состояния терраформирования. Вы можете использовать AWS KMS для хранения секрета и извлечения его оттуда через лямбда.

Jarred Olson 27.10.2018 16:08

Вы можете добавить файл переменных и файл состояния терраформирования в gitignore, и это решит проблему.

Mithilesh_Kunal 30.10.2018 07:18

В terraform v0.12.16 (и, вероятно, более ранних версиях) = в environment = { не требуется, и это приведет к ошибке "An argument named "environment" is not expected here. Did you mean to define a block of type "environment"?".

James P McGrath 24.02.2020 06:13

@JamesPMcGrath Глядя на документацию, выясняется, что это должен быть environment {, а не environment = {. Я обновил образец кода, можете ли вы убедиться, что он работает для вас?

Jarred Olson 25.02.2020 02:36

@JarredOlson LGTM! :отправим его:

James P McGrath 25.02.2020 08:23

Если вы хотите передать super_secret_value в терраформе, а затем вместо передачи файла tfvars, вы можете рассмотреть возможность использования Vault или AWS Secret Manager.

Но даже если вы используете Vault или AWS Secret Manager, секреты могут быть видны в файле tfstate. Но для снижения риска вы можете зашифровать файл tfstate на S3 и установить политику ограничений, чтобы только необходимые люди могли получить доступ к этому файлу состояния.

Это метод, который я использую.

Michael J 15.04.2020 23:42

Если у вас есть, как и в большинстве традиционных приложений NodeJS, файл en .env, который загружается вместе с dotenv локально, вот трюк для проксирования этих переменных в файлы Terraform в качестве переменных:

env $(sed -e 's/^/TF_VAR_/' ../../.env.preproduction) terraform plan \
 -out=terraform-preproduction.plan

Затем просто объявите переменные env как переменные и используйте их:

variable "SECRET" {
  description = "The application SECRET env var"
}

resource "aws_lambda_function" "test_lambda" {
  filename         = "lambda_function_payload.zip"
  function_name    = "lambda_function_name"
  runtime          = "nodejs8.10"
  ...

  environment {
    variables = {
      api_key = "${var.SECRET}"
    }
  }
}

используйте environment {...} вместо environment = { ...

Mobigital 26.08.2020 18:52

Спасибо. К вашему сведению, я пошел немного дальше в автоматизации, также сгенерировав карту env vars: github.com/nfroidure/whook/pull/54/… Список создается с помощью скрипта, используемого в качестве источника данных: github.com/nfroidure/whook/pull/54/…

nfroidure 30.08.2020 16:05

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

  1. Храните конфиденциальные данные, такие как пароли и ключи API.
  2. Добавьте данные aws_secretsmanager_secret в свой терраформ, больше информации
  3. Добавьте aws_secretsmanager_secret_version на основе секрета из предыдущего шага. больше информации
  4. Предполагая, что ваш секрет хранится в структуре ключ-значение, используйте

${jsondecode(data.aws_secretsmanager_secret_version.secrets.secret_string)["YOUR_KEY"]}

Другие вопросы по теме