使用Terraform v0.11.5,为何要重建AWS Lambda函数?
嘿,这个问题我之前用Terraform老版本时也碰到过,咱们一步步来排查解决:
首先先明确你遇到的错误:
[1m[31mError: [0m[0m[1mError applying plan: 1 error(s) occurred: * module.resources.aws_lambda_function.slack-notification-lambda: 1 error(s) occurred: * aws_lambda_function.slack-notification-lambda: 创建Lambda函数出错:ResourceConflictException: 函数已存在:slack-notification-lambda 状态码:409,请求ID:ab39666a-3f4c-11e8-a5b3-3d17af679eea
可能的原因
- Terraform状态文件与实际AWS资源不同步:比如这个Lambda是手动创建的,或者之前的状态文件被误删/修改,导致Terraform以为该资源不存在,尝试重新创建时撞了已存在的资源。
- 模块引用或资源标识符变更:你用了
module.resources模块,可能模块内的资源定义有隐性变更,让Terraform把现有Lambda当成了新资源。 - 不可变属性的状态偏差:哪怕你没改
function_name,但Lambda的核心属性(比如runtime、handler)在状态里的记录和实际资源不一致,也会触发Terraform尝试重建。
具体解决方案
检查并导入资源到状态
先执行terraform state list,看看输出里有没有module.resources.aws_lambda_function.slack-notification-lambda这条记录。如果没有,说明Terraform状态没记录这个已存在的资源,需要导入:terraform import module.resources.aws_lambda_function.slack-notification-lambda slack-notification-lambda导入后再跑
terraform plan,应该就不会再提示创建这个资源了。同步状态与实际资源
如果状态里已经有这个资源条目,那大概率是状态和实际AWS资源的属性对不上。执行terraform refresh让Terraform把最新的资源状态同步到本地,之后再运行terraform plan检查是否还有重建提示。对比状态与实际资源属性
执行terraform state show module.resources.aws_lambda_function.slack-notification-lambda查看状态里记录的资源属性,再和AWS控制台里的Lambda属性逐一对比,找出不一致的地方(比如filename、source_code_hash这类容易变的属性),优先修正配置文件,别直接改状态文件。排查中断的执行记录
如果之前的terraform apply中途中断过,可能导致状态文件没正确更新。这种情况先确认AWS上的Lambda是正常的,再重新执行terraform refresh后尝试apply。
内容的提问来源于stack exchange,提问作者houazy

