我希望我的 Lambda 能够调用 API,而这需要一个 API 令牌。我想将 API 令牌放入 Lambda 环境变量中。如何让 Terraform 实现这一目标?或者我的方法有问题吗?
我希望我的 Lambda 能够调用 API,而这需要一个 API 令牌。我想将 API 令牌放入 Lambda 环境变量中。如何让 Terraform 实现这一目标?或者我的方法有问题吗?
这里的文档提供了一个很好的示例。基本上是一个环境
块和一个变量
块,然后是你想要的任何键值对。假设你正在使用nodejs,你可以通过process.env.api_key
在lambda代码中引用这些变量。这些值也会以纯文本的形式存储在您的terraform代码以及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"
}
}
}
environment = {
中的 =
不是必需的,否则会导致错误 "An argument named "environment" is not expected here. Did you mean to define a block of type "environment"?"
。 - James P McGrathenvironment {
而不是 environment = {
。我更新了代码示例,你能确认它对你有效吗? - Jarred Olson如果您像大多数传统的NodeJS应用程序一样,拥有一个本地加载dotenv
的.env
文件,那么这里有一个技巧,可以将这些变量作为变量代理到您的Terraform文件中:
Original Answer翻译成"最初的回答"
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 = {...}
。 - Mobigital