Я хочу, чтобы моя лямбда вызывала API, а для этого требуется токен API. Я хочу поместить токен API в переменную среды лямбда. Как я могу сделать это с помощью Terraform? Или я неправильно подхожу к этому?
Документация здесь дает довольно хороший пример. В основном это блок 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 через браузер, чтобы добавить переменные среды?
Подожди, я не понимаю. Если я установлю "super_secret" в файле terraform и зафиксирую его, тогда он будет зафиксирован в git?
Да, тогда это будет в git. Даже если вы используете файл переменных, который вы не регистрируете, значение будет сохранено (в виде открытого текста) в вашем файле состояния терраформирования. Вы можете использовать AWS KMS для хранения секрета и извлечения его оттуда через лямбда.
Вы можете добавить файл переменных и файл состояния терраформирования в gitignore, и это решит проблему.
В terraform v0.12.16 (и, вероятно, более ранних версиях) =
в environment = {
не требуется, и это приведет к ошибке "An argument named "environment" is not expected here. Did you mean to define a block of type "environment"?"
.
@JamesPMcGrath Глядя на документацию, выясняется, что это должен быть environment {
, а не environment = {
. Я обновил образец кода, можете ли вы убедиться, что он работает для вас?
@JarredOlson LGTM! :отправим его:
Если вы хотите передать super_secret_value
в терраформе, а затем вместо передачи файла tfvars, вы можете рассмотреть возможность использования Vault
или AWS Secret Manager
.
Но даже если вы используете Vault
или AWS Secret Manager
, секреты могут быть видны в файле tfstate. Но для снижения риска вы можете зашифровать файл tfstate
на S3 и установить политику ограничений, чтобы только необходимые люди могли получить доступ к этому файлу состояния.
Это метод, который я использую.
Если у вас есть, как и в большинстве традиционных приложений 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 = { ...
Спасибо. К вашему сведению, я пошел немного дальше в автоматизации, также сгенерировав карту env vars: github.com/nfroidure/whook/pull/54/… Список создается с помощью скрипта, используемого в качестве источника данных: github.com/nfroidure/whook/pull/54/…
Вы можете использовать секретный менеджер aws для хранения ваших данных. больше информации. чтобы использовать их в своей терраформе, выполните следующие действия:
${jsondecode(data.aws_secretsmanager_secret_version.secrets.secret_string)["YOUR_KEY"]}
Это может помочь использование хранилища параметров SSM и скрытие значений