如何使用terraform添加lambda环境变量?

26

我希望我的 Lambda 能够调用 API,而这需要一个 API 令牌。我想将 API 令牌放入 Lambda 环境变量中。如何让 Terraform 实现这一目标?或者我的方法有问题吗?


这可能会有所帮助使用SSM参数存储和隐藏值 - SNR
4个回答

27

这里的文档提供了一个很好的示例。基本上是一个环境块和一个变量块,然后是你想要的任何键值对。假设你正在使用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"
    }
  }
}

我只需要通过浏览器进入AWS控制面板来添加环境变量吗? - Strawberry
是的,那么它将在git中。即使您使用未检入的变量文件,该值也会以明文形式存储在您的terraform状态文件中。您可以使用AWS KMS来存储密钥并通过lambda从那里检索它。 - Jarred Olson
1
你可以将变量文件和Terraform状态文件添加到.gitignore中,这样就解决了问题。 - Mithilesh_Kunal
在terraform v0.12.16(以及可能的早期版本)中,environment = { 中的 = 不是必需的,否则会导致错误 "An argument named "environment" is not expected here. Did you mean to define a block of type "environment"?" - James P McGrath
2
@JamesPMcGrath 看文档似乎应该是 environment { 而不是 environment = {。我更新了代码示例,你能确认它对你有效吗? - Jarred Olson
显示剩余3条评论

6
您可以使用 AWS 秘密管理器来存储您的数据。 更多信息。若要在 Terraform 中使用它们,请按照以下步骤进行:
  1. 存储敏感数据,例如密码和 API 密钥。
  2. 向您的 Terraform 添加“aws_secretsmanager_secret”数据,更多信息
  3. 根据上一步中的秘密添加“aws_secretsmanager_secret_version”。更多信息
  4. 假设您的秘密以键值结构存储,请使用

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


2
如果您想在terraform中传递一个超级机密值,而不是通过tfvars文件传递,那么您可能需要考虑使用Vault或AWS秘密管理器。但即使使用Vault或AWS秘密管理器,秘密也可能在tfstate文件中可见。为了减轻风险,您可以在S3上加密tfstate文件,并设置限制策略,以便只有必要的人员可以访问此状态文件。

这是我使用的方法。 - Michael J

2

如果您像大多数传统的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}"
    }
  }
}

2
请使用 environment {...} 而不是 environment = {...} - Mobigital
1
谢谢。顺便说一下,我在自动化方面又进了一步,还生成了环境变量映射表: https://github.com/nfroidure/whook/pull/54/files#diff-2a66f75ad5e713df773ad171190ef5edR93-R98该列表是通过一个用作数据源的脚本生成的:https://github.com/nfroidure/whook/pull/54/files#diff-2a66f75ad5e713df773ad171190ef5edR67-R69 - nfroidure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接