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

Posted

技术标签:

【中文标题】如何使用 terraform 添加 lambda 环境变量?【英文标题】:How do I add a lambda environmental variable with terraform? 【发布时间】:2019-04-01 00:28:40 【问题描述】:

我希望我的 lambda 调用 API,这需要 API 令牌。我想将 API 令牌放入 lambda 环境变量中。我怎样才能让 terraform 这样做呢?还是我以错误的方式处理这个问题?

【问题讨论】:

这可能对using SSM parameter store and hiding values有帮助 【参考方案1】:

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"
    
  

【讨论】:

是否只需要通过浏览器进入 AWS 控制面板添加环境变量? 等等,我不明白。如果我在 terraform 文件中设置“super_secret”并提交它,那么它会提交到 git 中吗? 是的,它会在 git 中。即使您使用未签入的variable file,该值也会(以纯文本形式)存储在您的 terraform 状态文件中。您可以使用 AWS KMS 存储秘密并通过您的 lambda 从那里检索它。 你可以将变量文件和terraform状态文件添加到gitignore中,这样就解决了问题。 @JamesPMcGrath 查看文档,它似乎应该是 environment 而不是 environment = 我更新了代码示例,你能验证它对你有用吗?【参考方案2】:

您可以使用 aws secret manager 来存储您的数据。 more info。要在您的 terraform 中使用它们,请按照以下步骤操作:

    存储您的敏感数据,例如密码和 API 密钥。 将“aws_secretsmanager_secret”数据添加到您的 terraform,more info 根据上一步中的密钥添加“aws_secretsmanager_secret_version”。 more info 假设您的秘密存储在键值结构中,使用

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

【讨论】:

【参考方案3】:

如果您想在 terraform 中传递 super_secret_value,而不是通过 tfvars 文件,您可能需要考虑使用 VaultAWS Secret Manager

但是,即使您使用VaultAWS Secret Manager,秘密也可能在 tfstate 文件中可见。但是为了降低风险,您可以在 S3 上加密 tfstate 文件并设置限制策略,以便只有需要的人才能访问此状态文件。

【讨论】:

这是我使用的方法。【参考方案4】:

如果你有,像大多数传统的 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 = ... 谢谢。仅供参考,我还通过生成环境变量映射在自动化方面走得更远:github.com/nfroidure/whook/pull/54/… 该列表是通过用作数据源的脚本生成的:github.com/nfroidure/whook/pull/54/…

以上是关于如何使用 terraform 添加 lambda 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 terraform 中将 2 个 python 文件添加到 lambda_zip [重复]

使用包含多个文件的 terraform 部署 lambda?

如何在 Terraform 中配置 CloudWatch Lambda Insights

如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施

使用 terraform 设置由预定事件源触发的 lambda 函数

使用 terraform 设置由预定事件源触发的 lambda 函数