本地状态无法被 terraform 上的另一个进程解锁

avi*_*amg 10 amazon-dynamodb terraform tfstate locker

我的 terraform 远程状态和储物柜是在 aws 帐户下的 s3 和 dynamodb 上配置的,在 gitlab runner 上,某些计划任务已崩溃,在下一个执行计划中,会弹出以下错误:

Error: Error locking state: Error acquiring the state lock: ConditionalCheckFailedException:
The conditional request failed

Lock Info:
  ID:        <some-hash>
  Path:      remote-terrform-states/app/terraform.tfstate
  Operation: OperationTypePlan
  Who:       root@runner-abc-project-123-concurrent-0
  Version:   0.14.10
  Created:   2022-01-01 00:00:00 +0000 UTC
  Info:  some really nice info
Run Code Online (Sandbox Code Playgroud)

在尝试解锁此储物柜以便再次执行额外的执行计划时 - 我收到以下错误:

  terraform force-unlock <some-hash-abc-123>

  #output:
  Local state cannot be unlocked by another process
Run Code Online (Sandbox Code Playgroud)

我们如何释放这个地形储物柜?

avi*_*amg 16

根据terraform命令的参考:force-unlock

手动解锁已定义配置的状态。

这不会修改您的基础设施。此命令取消对当前配置状态的锁定。此锁的行为取决于所使用的后端。本地状态文件不能 被其他进程解锁。

解释:显然执行计划正在本地处理计划输出文件并应用于 terraform 步骤的第二阶段,如下例所示:

阶段1:terraform plan -out execution-plan.out

阶段2:terraform apply -input=false execution-plan.out

确保第 1 阶段和第 2 阶段的文件名相同

但是,如果第 1 阶段被终止或意外崩溃,锁定器将被分配给本地状态文件,因此必须在 dynamodb 本身上删除,而不是使用 terraform 强制解锁命令。

解决方案:在 dynamodb terraform lockers 表下找到此特定项目并显式删除锁定的项目,您可以使用 aws 控制台或通过 api 执行此操作。 例如:

aws dynamodb delete-item \
    --table-name terraform-locker-bucket \
    --key file://key.json
Run Code Online (Sandbox Code Playgroud)

key.json的内容:

{
 "LockID": "remote-terrform-states/app/terraform.tfstate",
 "Info": {
   "ID":"<some-hash>",
   "Operation":"OperationTypePlan",
   "Who":"root@runner-abc-project-123-concurrent-0",
   "Version":"0.14.10",
   "Created":"2022-01-01 00:00:00 +0000 UTC",
   "Info":"some really nice info"
   }
 }
Run Code Online (Sandbox Code Playgroud)


Dra*_*ght 6

terraform force-unlock <lock id>

对于 terragrunt,在<terragruntfile>.hcl目录中运行 terragrunt force-unlock <lock id>. 如果不起作用,请删除terragrunt.lock.hcl并重.terragrunt-cache/试。

  • terragrunt 强制解锁 lockId 有效 (3认同)