Je veux que mon lambda appelle des API, et cela nécessite un jeton d'API. Je veux placer le jeton d'API dans une variable d'environnement lambda. Comment puis-je demander à terraform de faire cela à la place? Ou suis-je en train de l'aborder de la mauvaise façon?
Documentation ici donne un assez bon exemple. Fondamentalement, c'est un bloc environment
avec un bloc variables
. Ensuite, quelles que soient les paires de valeurs clés que vous souhaitez. En supposant que vous utilisez nodejs, vous pouvez faire référence à ces variables dans votre code lambda en faisant process.env.api_key
. Ces valeurs seraient stockées en texte brut dans votre code terraform ainsi que dans le fichier d'état terraform. AWS crypte les variables d'environnement mais vous devez vous préoccuper de la façon dont ces valeurs y parviennent. Si vous n'êtes pas à l'aise avec le fait qu'ils soient stockés dans git et quel que soit le stockage que vous utilisez pour votre fichier d'état, vous pouvez les ajouter manuellement via la console.
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"
}
}
}
Si vous avez, comme pour la plupart des applications NodeJS traditionnelles, en .env
fichier chargé avec dotenv
localement, voici une astuce pour proxy ces variables dans vos fichiers Terraform en tant que variables:
env $(sed -e 's/^/TF_VAR_/' ../../.env.preproduction) terraform plan \
-out=terraform-preproduction.plan
Ensuite, déclarez simplement les vars env en tant que variables et utilisez-les:
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}"
}
}
}
Vous pouvez utiliser aws secret manager pour stocker vos données. plus d'informations . pour les utiliser dans votre terraform, suivez les étapes ci-dessous:
$ {jsondecode (data.aws_secretsmanager_secret_version.secrets.secret_string) ["YOUR_KEY"]}}
Si vous voulez passer un super_secret_value
dans terraform puis en passant à travers un fichier tfvars, vous pouvez envisager d'utiliser Vault
ou AWS Secret Manager
.
Mais, même si vous utilisez Vault
ou AWS Secret Manager
, les secrets peuvent être visibles dans le fichier tfstate. Mais pour atténuer le risque, vous pouvez crypter le fichier tfstate
sur S3 et mettre une stratégie de restriction afin que seules les personnes requises puissent accéder à ce fichier d'état.