You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform实现AWS Lambda环境变量传输加密的可重复性

自动化实现AWS Lambda环境变量的KMS加密(Terraform)

问题背景

通过Terraform部署AWS Lambda时,需将敏感环境变量(如API密钥)用KMS加密。当前需手动在AWS控制台加密后复制密文到tfvars,销毁重建或跨环境部署时需重复手动操作,无法实现自动化与可重复性。使用的是每次重建的对称KMS密钥。

解决方案

通过Terraform的aws_kms_encrypt数据源自动完成明文敏感变量的加密,无需手动操作控制台,实现全流程的自动化部署。

1. 定义明文敏感变量

在Terraform变量文件中定义明文的敏感变量(建议通过环境变量或安全的变量注入方式传入,禁止硬编码):

variable "elastic_api_key_plaintext" {
  type      = string
  sensitive = true
}

2. 使用aws_kms_encrypt自动加密

利用Terraform数据源调用KMS加密明文变量,生成加密后的密文:

data "aws_kms_encrypt" "elastic_api_key" {
  key_id     = aws_kms_key.this.key_id
  plaintext  = var.elastic_api_key_plaintext
  # 可选:添加加密上下文增强安全性,Lambda解密时需匹配该上下文
  encryption_context = {
    LambdaFunctionName = aws_lambda_function.this.function_name
  }
}

3. 配置Lambda函数关联KMS密钥并使用加密后的环境变量

修正原Lambda资源中kms_key_arn的错误引用(应指向KMS密钥ARN而非自身ARN),并将加密后的密文作为环境变量值:

resource "aws_lambda_function" "this" {
  # 其他必要属性:代码包路径、函数名、执行角色等
  filename      = "lambda_function_payload.zip"
  function_name = "${local.naming_prefix}-lambda"
  role          = aws_iam_role.lambda_exec.arn

  # 关联用于加密环境变量的KMS密钥
  kms_key_arn = aws_kms_key.this.arn

  environment {
    variables = {
      ELASTIC_API_KEY = data.aws_kms_encrypt.elastic_api_key.ciphertext_blob
    }
  }
}

4. 为Lambda执行角色添加KMS解密权限

确保Lambda函数的执行角色拥有解密该KMS密钥的权限,否则函数运行时无法解密环境变量:

resource "aws_iam_role" "lambda_exec" {
  name = "${local.naming_prefix}-lambda-exec-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "lambda.amazonaws.com"
        }
      }
    ]
  })
}

resource "aws_iam_role_policy" "lambda_kms_decrypt" {
  name   = "${local.naming_prefix}-lambda-kms-decrypt"
  role   = aws_iam_role.lambda_exec.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = ["kms:Decrypt"]
        Effect   = "Allow"
        Resource = aws_kms_key.this.arn
        # 若配置了加密上下文,需添加条件匹配确保权限安全
        Condition = {
          StringEquals = {
            "kms:EncryptionContext:LambdaFunctionName" = aws_lambda_function.this.function_name
          }
        }
      }
    ]
  })
}

5. 保留现有KMS密钥配置

维持你原有的KMS密钥定义,确保为对称加密密钥:

resource "aws_kms_key" "this" {
  description              = "lambda environment variable decryption"
  key_usage                = "ENCRYPT_DECRYPT"
  customer_master_key_spec = "SYMMETRIC_DEFAULT"

  tags = merge(local.common_tags, { Name = "${local.naming_prefix}-key" })
}

工作原理

  • Terraform部署时,aws_kms_encrypt数据源会调用AWS KMS API加密明文变量,生成密文
  • Lambda函数关联指定KMS密钥后,AWS会自动管理密文的存储,控制台和API输出中只会显示密文
  • Lambda运行时,通过KMS API解密环境变量(需确保执行角色拥有对应解密权限)

此方案实现了加密流程的全自动化,无论销毁重建还是跨环境部署,只需传入明文敏感变量,Terraform会自动完成加密,保证部署的可重复性。

内容的提问来源于stack exchange,提问作者Ryan.Bartsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:33:12