web-dev-qa-db-ja.com

テラフォームでラムダ環境変数を追加するにはどうすればよいですか?

ラムダでAPIを呼び出したいのですが、APIトークンが必要です。 APIトークンをラムダ環境変数に配置します。代わりにterraformでこれを行うにはどうすればよいですか?それとも私はこれを間違った方法で進めていますか?

6
Strawberry

ドキュメントはこちら はかなり良い例を示します。基本的には、environmentブロックを含むvariablesブロックです。次に、任意のキーと値のペアを作成します。 nodejsを使用しているとすると、process.env.api_keyを実行することにより、ラムダコードでこれらの変数を参照できます。これらの値は、Teraformコードと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"
    }
  }
}
1
Jarred Olson

ほとんどの従来のNodeJSアプリのように、dotenvがローカルに読み込まれる.envファイルがある場合、これらの変数を変数としてTerraformファイルにプロキシする方法は次のとおりです。

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

次に、env varsを変数として宣言して使用します。

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

Awsシークレットマネージャーを使用してデータを保存できます。 詳細 。テラフォームでそれらを使用するには、以下の手順に従います。

  1. パスワードやAPIキーなどの機密データを保存します。
  2. 「aws_secretsmanager_secret」データをテラフォームに追加します 詳細
  3. 前の手順のシークレットに基づいて「aws_secretsmanager_secret_version」を追加します。 詳細
  4. シークレットがキーと値の構造に格納されていると仮定します

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

0
Ahmad Alhyari

super_secret_valueをterraformで渡し、その後tfvarsファイルを渡す場合は、VaultまたはAWS Secret Managerの使用を検討してください。

ただし、VaultまたはAWS Secret Managerを使用している場合でも、シークレットはtfstateファイルに表示される可能性があります。ただし、リスクを軽減するために、S3のtfstateファイルを暗号化し、制限ポリシーを設定して、必要な人だけがこの状態ファイルにアクセスできるようにすることができます。

0
pradeep