- 基本的な手順
- おすすめの手順
- ハマりポイント
- outputの名前
- moduleが未対応
- symlinkして利用しているファイル
- 0.12upgrade時に書き換えられてしまう部分
- .tfvarsファイルでの変数の利用ができなくなった
チーフエンジニアの加辺です
およそ半年前、terraform v0.12がリリースされましたね
みなさんアップグレードは済んだでしょうか?
様々な記述が変更されたため、対応に苦戦した方も多いのではないかと思います
そこで今からアップグレードを行う方のために、アップグレードの手順の整理とハマりどころを記載しておこうと思います
基本的な手順
まずは公式にガイドがあるので、それをよく読みましょう
簡単にすると以下の手順です
- Terraform v0.11.14に上げる (v0.10以下の場合)
- まずv0.11まで上げておかないと、このあとの変更に耐えられないようです
- v0.12に上げられるかチェックする
- 手順1でv0.11.14まで上げることで
terraform 0.12checklist
が使えるようになります - v0.12に上げる
terraform 0.12upgrade
で0.12記法に自動変換してくれます- その後、一部は手動で編集するべき箇所が残る場合があるため、そこを修正します
おすすめの手順
公式の手順が基本ですが、当社では複数のメンバーで運用しており、多くのディレクトリがあるため、以下のようにして順に進めることにしました
- tfenvを導入する
- これまでは複数のディレクトリで共通のterraformバージョンを利用していたのですが、1日で全てのバージョンを上げきるのが難しかったので、複数の日に分けて作業をしていました
- そのとき各メンバーがterraformのバージョンを細かく意識するのは現実的でないため、tfenvを導入し、
.terraform-version
を各ディレクトリに配置しました - 各providerのv0.12対応状況を確認→providerのバージョンを上げる
- 当社では主にaws(terraform-provider-aws)ですが、一部で他のproviderを利用しているケースがあるため、事前に確認が必要でした
- awsの場合はv2.7.0以上が必要です
- 当時はgoogle(terraform-provider-google)が未対応だったため対応を見送りました
- 各ディレクトリでは以下の手順
echo 0.12.0 > .terraform-version
- これは当時のバージョンのため、今なら0.12.14など、最新バージョンを書き込みましょう
terraform 0.12upgrade
- エラーを解消(後述)
0.12upgrade
によりTODOとなっている部分を解消- 小さな差分を解消(後述)
ハマりポイント
outputの名前
0.11系までは下記のようにoutput
の名前を比較的自由につけることができていました
output "ELB DNS name" {
value = "${aws_lb.xxx.dns_name}"
}
0.12からはこのように空白文字を入れることは許されておらず、0.12upgrade
した後にplan
して初めてエラーとなります
Remote Stateを利用する場合には間違いなく必要となる対応ですが、全てのoutputに対してその制約が適用されたようです
たとえば以下のように修正することになります
output "elb_dns_name" {
value = aws_lb.xxx.dns_name
}
moduleが未対応
一部でTerraform Registryに公開されているmoduleを利用している箇所がありましたが、0.12からの型変更によりそのままでは動かないmoduleもありました
このような部分は一時的にmoduleをforkしつつ、本家にPRを出して待つといった対応を行いました
symlinkして利用しているファイル
symbolic linkにより複数のディレクトリで利用している共通ファイルがある場合、あるディレクトリの0.12upgrade
で0.12の記法にしてしまうと0.12に上げていないディレクトリでは文法エラーが発生してしまいます
このような部分は以下のいずれかを選択して対応しました
- symlink自体をやめてコピーし、それぞれ別のファイルにする
- symlinkの部分を0.12記法に変更するのはそれを利用している最後のディレクトリまで遅延させる
- そのsymlinkを利用している全ディレクトリ分を一気に作業する
0.12upgrade時に書き換えられてしまう部分
0.12upgrade
は基本的によしなに書き換えてくれますが、一部で意図しない変更を加えてしまうことがありました
これの対応のため、実際の作業では全差分を目視確認し、問題がある部分を逐一修正していく対応を強いられました…
- list中のインラインコメントが削除される場合がある
0.12upgrade
コマンドで修正が発生したファイルすべて、ファイル末尾に余分な改行が1つ足される
.tfvars
ファイルでの変数の利用ができなくなった
変数を定義するのに便利なtfvarsファイル(Doc)ですが、0.11系まではこのファイルの中での変数利用(正確にはstring interpolation)が利用できていました(参照していなければエラーにはならなかった)
しかし0.12からはこれが不可能となったため、削除しました(掃除になった)
ちなみにこのようなユースケースではtfvarsの中には定数のみを定義することとし、tf側にlocal
変数を定義しましょう
以上です
ちなみにこの対応で当社で発生したterraformの差分は数万行でした