TerraformでState Lockエラーが発生したら

2022.02.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Terraformでエラーが発生した

terraform apply,terraform state listなどのコマンドを実行した際にエラーが出るようになってしまいました。

╷
│ Error: Error acquiring the state lock
│ 
│ Error message: resource temporarily unavailable
│ Lock Info:
│   ID:        89e54252-fef0-2a68-17bf-e0bb411ff1e3
│   Path:      terraform.tfstate
│   Operation: OperationTypeInvalid
│   Who:       myname@foo.local
│   Version:   1.1.5
│   Created:   2022-02-21 06:26:07.435925 +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.
╵

どうやらStateファイルにアクセスするコマンドで軒並みこのエラーが出るようになったようです。

原因は、エラーが発生する直前にterraform applyを実行して途中で中断してしまったからだと考えられます。(AWSの一時クレデンシャルの期限切れが起こっていて処理が全然進まなかったので途中中断しました)

apply中は(設定していれば)stateがロックされ、他のユーザーが重複して処理を行なうことを防いでくれます。applyが終わればロック解除されるのですが今回は途中中断してしまったのでstateファイルがロックされたままになっていたようです。

このままだと何もプロビジョニングできないので修正する必要があります。

解決方法

terraform force-unlockコマンドを使いましょう。ロックを手動解除できます。(もちろん本当に他に処理実行中の人やパイプラインがいないかの確認を忘れずに!)

% terraform force-unlock --help
Usage: terraform [global options] force-unlock LOCK_ID

  Manually unlock the state for the defined configuration.

  This will not modify your infrastructure. This command removes the lock on the
  state for the current workspace. The behavior of this lock is dependent
  on the backend being used. Local state files cannot be unlocked by another
  process.

Options:

  -force                 Don't ask for input for unlock confirmation.

LOCK_IDに入れるのはエラーメッセージに出てきたID値です。

もしくは-lock=falseオプションをつけて各コマンドを実行する方法でもロックを外せます。

local stateの場合は

ただしこれらの方法はlocal stateを使っていた場合はエラー解消できません。

% terraform force-unlock 89e54252-fef0-2a68-17bf-e0bb411ff1e3
Local state cannot be unlocked by another process

この場合はローカルのTerraformのプロセスをkillすればエラー解消できます。 kill

参考情報