【发布时间】:2019-04-01 00:28:40
【问题描述】:
我希望我的 lambda 调用 API,这需要 API 令牌。我想将 API 令牌放入 lambda 环境变量中。我怎样才能让 terraform 这样做呢?还是我以错误的方式处理这个问题?
【问题讨论】:
标签: aws-lambda terraform terraform-provider-aws
我希望我的 lambda 调用 API,这需要 API 令牌。我想将 API 令牌放入 lambda 环境变量中。我怎样才能让 terraform 这样做呢?还是我以错误的方式处理这个问题?
【问题讨论】:
标签: aws-lambda terraform terraform-provider-aws
Documentation here 给出了一个很好的例子。基本上它是一个带有variables 块的environment 块。然后是你想要的任何键值对。假设您使用的是 nodejs,您可以通过 process.env.api_key 在您的 lambda 代码中引用这些变量。这些值将以 纯文本 的形式存储在您的 terraform 代码以及 terraform 状态文件中。 AWS encrypts the environment variables 但您确实需要关注这些价值观是如何到达那里的。如果您对将它们存储在 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"
}
}
}
【讨论】:
environment { 而不是 environment = { 我更新了代码示例,你能验证它对你有用吗?
您可以使用 aws secret manager 来存储您的数据。 more info。要在您的 terraform 中使用它们,请按照以下步骤操作:
${jsondecode(data.aws_secretsmanager_secret_version.secrets.secret_string)["YOUR_KEY"]}
【讨论】:
如果您想在 terraform 中传递 super_secret_value,而不是通过 tfvars 文件,您可能需要考虑使用 Vault 或 AWS Secret Manager。
但是,即使您使用Vault 或AWS Secret Manager,秘密也可能在 tfstate 文件中可见。但是为了降低风险,您可以在 S3 上加密 tfstate 文件并设置限制策略,以便只有需要的人才能访问此状态文件。
【讨论】:
如果你有,像大多数传统的 NodeJS 应用一样,在本地加载了 dotenv 的 .env 文件,这里有一个技巧可以将这些变量作为变量代理到你的 Terraform 文件中:
env $(sed -e 's/^/TF_VAR_/' ../../.env.preproduction) terraform plan \
-out=terraform-preproduction.plan
然后,只需将环境变量声明为变量并使用它们:
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 = { ...