web-dev-qa-db-fra.com

Comment ajouter une variable d'environnement lambda avec terraform?

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?

6
Strawberry

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"
    }
  }
}
1
Jarred Olson

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}"
    }
  }
}
1
nfroidure

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:

  1. Stockez vos données sensibles telles que les mots de passe et les clés API.
  2. Ajoutez des données "aws_secretsmanager_secret" à votre terraform, plus d'informations
  3. Ajoutez "aws_secretsmanager_secret_version" basé sur le secret de l'étape précédente. plus d'informations
  4. En supposant que votre secret est stocké dans une structure de valeur-clé

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

0
Ahmad Alhyari

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.

0
pradeep