ラムダでAPIを呼び出したいのですが、APIトークンが必要です。 APIトークンをラムダ環境変数に配置します。代わりにterraformでこれを行うにはどうすればよいですか?それとも私はこれを間違った方法で進めていますか?
ドキュメントはこちら はかなり良い例を示します。基本的には、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"
}
}
}
ほとんどの従来の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}"
}
}
}
Awsシークレットマネージャーを使用してデータを保存できます。 詳細 。テラフォームでそれらを使用するには、以下の手順に従います。
$ {jsondecode(data.aws_secretsmanager_secret_version.secrets.secret_string)["YOUR_KEY"]}
super_secret_value
をterraformで渡し、その後tfvarsファイルを渡す場合は、Vault
またはAWS Secret Manager
の使用を検討してください。
ただし、Vault
またはAWS Secret Manager
を使用している場合でも、シークレットはtfstateファイルに表示される可能性があります。ただし、リスクを軽減するために、S3のtfstate
ファイルを暗号化し、制限ポリシーを設定して、必要な人だけがこの状態ファイルにアクセスできるようにすることができます。