Terraform配置优化:仅在代码变更时发布AWS Lambda
解决Terraform中AWS Lambda无代码变更仍重复部署的问题
问题根源
- 原配置用
filemd5计算zip文件哈希,但zip文件的**元数据(如创建时间、压缩时间戳)**每次生成都会变化,哪怕代码内容没改,哈希值也会不同,导致Terraform判定资源需要更新。 - 尝试用S3对象ETAG时,若文件大小超过S3分块上传阈值(默认100MB),ETAG会变成
[分块MD5拼接值]-[分块数]格式,而Lambda的source_code_hash要求单一哈希值,因此出现格式不匹配错误。
优化配置方案
直接利用archive_file数据源生成的内容哈希值,该哈希仅由代码内容决定,不受元数据影响:
data "archive_file" "parser_service" { type = "zip" source_dir = "${path.module}/xxx" output_path = "${path.module}/lambda_parser_${var.node_env}.zip" # 统一文件名,避免路径不一致 } resource "aws_s3_object" "s3_object" { bucket = var.lambda_bucket key = "lambda_parser_${var.node_env}.zip" source = data.archive_file.parser_service.output_path # 用archive_file的内容MD5作为ETAG,确保和文件内容一致 etag = data.archive_file.parser_service.output_md5 } resource "aws_lambda_function" "parser_function" { function_name = var.lambda_name handler = "xxx/main.handler" role = var.iam_role runtime = var.runtime memory_size = var.memory_size timeout = var.timeout s3_bucket = var.lambda_bucket s3_key = aws_s3_object.s3_object.key # 使用archive_file生成的base64编码SHA256哈希,符合Lambda要求的格式 source_code_hash = data.archive_file.parser_service.output_base64sha256 depends_on = [aws_s3_object.s3_object] }
关键优化点说明
- 统一文件名:将
archive_file的output_path与S3对象的key保持一致,避免文件路径不一致引发的错误。 - 内容哈希驱动更新:
output_base64sha256是基于压缩包内容计算的SHA256哈希并做base64编码,仅当代码内容变更时哈希值才会改变,确保只有必要时才触发Lambda部署。 - ETAG对齐:用
archive_file的output_md5作为S3对象的ETAG,保证云端存储的文件与本地生成的压缩包内容完全一致。
内容的提问来源于stack exchange,提问作者great programmer
相关产品推荐
相关产品推荐

