はじめに
Terraform のリモート state で、同時 apply を防ぐロックを DynamoDB でかけようとしました。backend "s3" に dynamodb_table を書いて terraform init。
エラーは出ません。でも、ログに黄色い警告が残りました。
Warning: Deprecated Parameter
The parameter "dynamodb_table" is deprecated. Use parameter "use_lockfile" instead.
動くけど、何か言われている…。
dynamodb_tableによるロックは公式に deprecated(非推奨)とされ、将来削除予定。新規はuse_lockfile(S3 ネイティブロック)を検討する流れでした😅
(※ 別記事「state置き場は鶏と卵」でチラッと触れた、あの警告の正体です)
環境
- Terraform(比較的新しめのバージョン)
- リモート state: Amazon S3 + ロック
- リージョン: ap-northeast-1
起きたこと
backend に DynamoDB を指定して init しました。
terraform {
backend "s3" {
bucket = "myapp-tfstate-xxxx"
key = "app/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "myapp-tflock"
encrypt = true
}
}
init 自体は成功します。ただ、以降コマンドのたびに dynamodb_table is deprecated. Use "use_lockfile" instead. の警告が出続けました。最初は「設定をミスした?」と少し焦りました。
原因
調べてみると、Terraform の S3 backend では、従来の DynamoDB ベースのロックに加えて、use_lockfile による S3 ネイティブロックが使えるようになっていました。
そして公式ドキュメントでは、DynamoDB ベースのロックは deprecated(非推奨)とされ、将来の minor version で削除予定とされています。ただしエラーではないため、現時点では DynamoDB によるロックは動きます。
対処(状況で選ぶ)
-
新しめの Terraform で新規に作るなら、
use_lockfile = true(S3 ネイティブロック)に寄せると、DynamoDB テーブル無しでロックでき、警告も出ません。
# 新規構成の例(DynamoDB を使わない)
terraform {
backend "s3" {
bucket = "myapp-tfstate-xxxx"
key = "app/terraform.tfstate"
region = "ap-northeast-1"
use_lockfile = true
encrypt = true
}
}
-
既存環境では、移行期間として
dynamodb_tableとuse_lockfileを同時に設定することもできます。チーム全員の Terraform バージョンや CI 環境を確認してから、DynamoDB ロックを外すのが安全です。 -
要件で DynamoDB ロックが指定されている場合は、現時点では動く前提で継続しつつ、バージョンアップ前に
use_lockfileへの移行を検討しておくと安心です(私の構成は要件に合わせて DynamoDB のままにし、移行予定としてメモしました)。
※ どの版で何が使えるか・推奨かはバージョンで変わります。手元の版での最新の推奨は、公式ドキュメントで確認するのが確実です。
学び
- 警告(Warning)はエラーではないが、無視せず内容を読む。今回は「ロックの新しいやり方ができた・古い方は将来消える」という案内だった。
- ツールは進化する。昔は一般的だった手順(DynamoDB ロック)が、公式に非推奨→将来削除予定になることがある。
- 移行は急がなくてよいが、「現時点では動く」と「将来削除予定」は分けて捉える。新規なら新しい方、既存なら段階移行。
- 「要件で指定された書き方」と「今の推奨」が食い違うときは、理由をメモして選ぶと、後から説明できる。
おわりに
黄色い警告は「将来こうしてね」というサインのことがあります😅 ロックを設定したら警告が出て戸惑った人の参考になれば嬉しいです🙌