Terraform:获取状态锁时出错:ConditionalCheckFailedException

veb*_*ben 49 gitlab-ci terraform

terraform plan在管道中发生了以下错误:

Error: Error locking state: Error acquiring the state lock: ConditionalCheckFailedException: The conditional request failed
Lock Info:
ID:        9db590f1-b6fe-c5f2-2678-8804f089deba
Path:      ...
Operation: OperationTypePlan
Who:       ...
Version:   0.12.25
Created:   2020-05-29 12:52:25.690864752 +0000 UTC
Info:      
Terraform acquires a state lock to protect the state from being written
by multiple users at the same time. Please resolve the issue above and try
again. For most commands, you can disable locking with the "-lock=false"
flag, but this is not recommended.
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我确定没有其他并发计划。有没有办法处理这个问题?我应该如何解除这个锁?

Fal*_*zky 68

错误原因

当一个进程运行失败terraform planterraform apply. 例如,如果您的网络连接中断或进程在完成之前终止。然后Terraform“认为”这个进程仍然在基础设施上工作,并阻止其他进程同时使用相同的基础设施和状态以避免冲突。

如错误消息中所述,您应该确保确实没有其他进程仍在运行(例如来自其他开发人员或某些构建自动化)。如果您在这种情况下强制解锁,您可能会破坏地形状态,使其难以恢复。

解析度

如果没有其他进程仍在运行:运行此命令

terraform force-unlock 9db590f1-b6fe-c5f2-2678-8804f089deba

(其中数字 id 应替换为错误消息中提到的那个)

如果您不确定是否有另一个进程正在运行,并且您担心可能会使事情变得更糟,我建议您等待一段时间(例如 1 小时),再试一次,然后在 30 分钟后再试一次。如果错误仍然存​​在,很可能真的没有其他进程,如上所述解锁是安全的

  • 收到此错误:“本地状态无法由另一个进程解锁” (10认同)
  • 我尝试强制解锁,但收到此错误,我正在使用 GCS 状态后端。`无法解锁状态:发生 2 个错误:* 存储:对象不存在 * 存储:对象不存在` (4认同)
  • 如果我关闭了终端会话,因此无法访问数字 ID,该怎么办 (3认同)
  • 当你尝试执行需要状态锁的操作时,错误会再次出现,然后你可以获取ID (3认同)

veb*_*ben 41

看起来锁在前一个管道之后仍然存在。我必须使用以下命令将其删除才能删除它:

terraform force-unlock -force 9db590f1-b6fe-c5f2-2678-8804f089deba
Run Code Online (Sandbox Code Playgroud)

或者使用以下选项重新启动计划 -lock=false

terraform plan -lock=false ...
Run Code Online (Sandbox Code Playgroud)


Man*_*Ali 18

当我将 terraform 与 S3 和 dynamodb 后端一起使用时,我遇到了同样的问题

原因:我强制终止应用进程,这实际上阻止了我再次获取锁

解决方案:当失败时,它会返回一个ID,其中包含我们可以强制解锁的ID

terraform force-unlock -force 6638e010-8fb0-46cf-966d-21e806602f3a
Run Code Online (Sandbox Code Playgroud)


小智 15

即使我遇到了同样的问题,并尝试使用不同的命令 terraformforce-unlock -forceterraformforce-unlock <process_id> 但对我不起作用。该问题的快速解决方法是kill that particular process id and run again

ps aux | grep terraformsudo kill -9 <process_id>


小智 6

如果 terraform 强制解锁给出以下错误:“本地状态无法由另一个进程解锁”,则打开正在运行的进程并终止该进程以删除锁定。对于 Windows:打开任务管理器并搜索 terraform 控制台进程 对于 Linux:grep for terraform 进程并使用kill -9 终止 terraform 控制台进程