S3上ZIP包变更时如何更新Terraform aws_lambda_function资源?
问题解决配置方案
不生效的根本原因
仅配置aws_lambda_function的s3_bucket、s3_key参数时,Terraform只会校验这两个参数的取值是否变化,不会主动拉取S3上的文件计算内容哈希,因此同key的ZIP包更新后Terraform会判定无资源变更。
之前传入source_code_hash不生效,是因为该字段要求传入ZIP包原始内容的Base64编码SHA256哈希值,如果你传入的是普通十六进制格式的哈希,会被Terraform忽略,不会触发更新也不会同步到状态文件。
正确配置方法
- 本地保留有对应ZIP包的场景,直接用Terraform内置函数自动计算符合要求的哈希值,无需手动维护:
resource "aws_lambda_function" "your_lambda" { function_name = "你的Lambda函数名" s3_bucket = "存储部署包的S3桶名" s3_key = "部署包在S3中的路径,比如lambda/app.zip" # 自动读取本地ZIP包计算Base64编码的SHA256哈希 source_code_hash = filebase64sha256("本地部署包的路径,比如./build/app.zip") # 其余原有配置(运行时、执行角色、处理程序等)保持不变 runtime = "python3.10" role = aws_iam_role.lambda_exec_role.arn handler = "app.lambda_handler" }
- 如果ZIP包通过外部流程上传到S3、本地无对应文件,需要在外部上传流程中计算出部署包的Base64编码SHA256哈希,再通过Terraform变量、状态数据源等方式将最新哈希值准确传入
source_code_hash字段。
注意:不要使用S3对象的
etag作为哈希依据,分块上传的ZIP包的etag不等于文件本身的SHA256哈希,会导致校验失败无法触发更新。
效果验证
配置完成后,更新S3上的ZIP包时同步更新本地对应ZIP包(或同步更新传入的哈希值),执行terraform apply即可看到Terraform识别到source_code_hash变更,自动触发Lambda函数代码更新。
内容的提问来源于stack exchange,提问作者nickolay.laptev
相关产品推荐
相关产品推荐

