如何通过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
相关产品推荐
相关产品推荐

