Terraform ステートロックエラーの解決方法
問題の概要
Terraform を使用する際、terraform plan
や terraform apply
の実行中に以下のエラーが発生することがあります:
Error: Error locking state: Error acquiring the state lock: ConditionalCheckFailedException: The conditional request failed
このエラーは、Terraform がステートファイルへの排他制御(ロック)を取得できないことを示しています。ステートロックは、複数のユーザーやプロセスが同時に状態を変更することを防ぐための保護機能です。
エラーの原因
主な原因は以下の通りです:
プロセスの異常終了
- ネットワーク接続の中断
- プロセスの強制終了(Ctrl+Cなど)
- メモリ不足によるプロセスの強制終了
- パイプライン実行のキャンセル
権限の問題
- バックエンドストレージに対する削除権限の不足
- AWS/GCP の認証情報の問題
実際に実行中のプロセス
- 別の開発者が実行中の Terraform プロセス
- CI/CD パイプラインでの並行実行
注意
ロックを強制解除する前に、実際に他のプロセスが実行されていないことを必ず確認してください。誤った解除は状態ファイルの破損を引き起こす可能性があります。
解決方法
方法1: 強制ロック解除(推奨)
最も安全かつ確実な方法は、Terraform 組み込みの強制ロック解除機能を使用することです:
terraform force-unlock <LOCK_ID>
<LOCK_ID>
はエラーメッセージに表示されている ID を使用します:
Lock Info:
ID: 9db590f1-b6fe-c5f2-2678-8804f089deba
TIP
-force
オプションは Terraform 0.15 以降では非推奨となりました。代わりに対話形式での確認が行われます。
方法2: 手動でのロック解除
各クラウドプロバイダーごとの手動解除方法:
AWS (S3 + DynamoDB):
- DynamoDB テーブルから該当するロックアイテムを削除
- S3 バケットから
.tflock
ファイルを削除
Google Cloud (GCS):
- Google Cloud Storage でロックファイルを削除
- ストレージブラウザで「リース解除」ボタンをクリック
Azure:
- Azure Storage コンテナで「リースの中断」ボタンをクリック
方法3: 権限の問題の解決
以下の権限が不足している場合、適切な権限を付与してください:
AWS IAM ポリシー例:
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"dynamodb:DeleteItem"
],
"Resource": [
"arn:aws:s3:::my-bucket/path/to/state/*",
"arn:aws:dynamodb:region:account:table/my-lock-table"
]
}
GCP の場合:
- 「Storage Object Admin」権限を付与
方法4: 実行中のプロセスの確認
別のプロセスが実行中ではないか確認します:
# Linux/Mac
ps aux | grep terraform
# Windows
tasklist | findstr terraform
実行中のプロセスがある場合は、適切に終了させます:
kill -9 <PROCESS_ID>
予防策
適切な権限設定
- 使用するバックエンドに必要なすべての権限を付与
- 定期的に権限の見直しを行う
プロセスの安全な終了
- Terraform プロセスを強制終了しない
- ネットワーク接続が安定している環境で実行
ロックタイムアウトの設定
- バックエンド設定で
lock_timeout
を設定可能 - デフォルトは5分ですが、環境に合わせて調整
- バックエンド設定で
定期的なメンテナンス
- 古くなったロックの定期的な確認と解除
- ステートファイルのバックアップ
最終手段
どうしても解決できない場合のみ、-lock=false
オプションを使用できますが、これは状態ファイルの破損リスクがあるため、開発環境以外では避けるべきです:
terraform plan -lock=false
まとめ
Terraform のステートロックエラーは、適切な手順で対処すれば解決可能です。最も重要なのは、ロック解除前に他の実行中のプロセスがないことを確認し、必要な権限が適切に設定されていることを確認することです。予防策を講じることで、このようなエラーの発生頻度を減らすことができます。