Terraformでstateのロックを解除する方法、ロックを手動で行う方法
はじめに
Terraform には自動的にステートをロックする機能があります。
terraform plan
や terraform apply
コマンドを実行したときに自動的にロックされるので、 普段意識して操作する事はありません。
チーム開発する際には Terraform のステートをクラウドサービス(AWS S3、GCP Cloud Storage、AWS DynamoDB など)を使って管理することが多いでしょう。
この場合、 terraform plan
コマンド実行中に Ctrl + C などで強制停止してしまうと、クラウドサービス上にロックデータが残ってしまいます。
結果、以降の terraform plan
や terraform apply
コマンドを実行できなくなってしまいます。
これを解消する方法 と 逆に明示的にロックを行い、チームメンバーに対して排他する方法 について紹介します。
検証環境
ステートのロックを解除する方法
僕は GCP の Cloud Storage を使うことが多いのですが、中途半端にステートのロックが残ってしまった場合には gs://XXXXX
といったステート管理バケット上にロックファイルが残ってしまいます。
こちらを直接削除してもいいのですが、 terraform
コマンドにロック解除コマンドが提供されているのでこれを利用するのが良いでしょう。
こんなエラーが出て、一向にコマンド再実行できない場合には、以下のコマンドを実行します。
ポイントは上記メッセージの ID を保存しておき、コマンドの引数として指定するという点です 。
ステートのロックを手動で行う方法
terraform
コマンドには force-unlock
コマンドが用意されているのですが、 force-lock
のようなコマンドがありません。
代わりにロックを行うためのツールが OSS で公開されているため、そちらを利用したいと思います 。
インストール
Go 言語で作成されているツールのようです。
以下のコマンドでインストールできました。
使い方
.terraform ファイルがあるディレクトリ( terraform init
するディレクトリ )で tflock
コマンドを実行するだけです。
エラーとなってしまいました。
terraform init
してからもう一度。
エラーになってしまいました。原因わからず。
tflock
コマンドのソースコードが置かれているリポジトリの説明を見ると。。。。
Currently, it is tested only with Terraform 0.15 + AWS S3 (locked with DynamoDB).
The tflock uses a state lock function as same as Terraform uses under the hood.
So other backend types may or may not work.
どうやら AWS の S3 と DynamoDB だけが明確にサポートされている模様。
GCS ではだめみたいです。
AWS で動作を確認した結果を掲載できずすみません。
ひとこと
Terraform はステートファイル管理が面倒ですね。
Terraform をお使いの貴兄は、 このあたりのつらみはありませんか?
ディスカッション
コメント一覧
まだ、コメントがありません