terraform v0.12へのアップグレードのハマりどころ

Created
Aug 7, 2023 6:40 AM
Tags
terraform
Editor
Tomoya Kabe
image

チーフエンジニアの加辺です

およそ半年前、terraform v0.12がリリースされましたね

みなさんアップグレードは済んだでしょうか?

様々な記述が変更されたため、対応に苦戦した方も多いのではないかと思います

そこで今からアップグレードを行う方のために、アップグレードの手順の整理とハマりどころを記載しておこうと思います

基本的な手順

まずは公式にガイドがあるので、それをよく読みましょう

簡単にすると以下の手順です

  1. Terraform v0.11.14に上げる (v0.10以下の場合)
    • まずv0.11まで上げておかないと、このあとの変更に耐えられないようです
  2. v0.12に上げられるかチェックする
    • 手順1でv0.11.14まで上げることでterraform 0.12checklistが使えるようになります
  3. v0.12に上げる
    • terraform 0.12upgradeで0.12記法に自動変換してくれます
    • その後、一部は手動で編集するべき箇所が残る場合があるため、そこを修正します

おすすめの手順

公式の手順が基本ですが、当社では複数のメンバーで運用しており、多くのディレクトリがあるため、以下のようにして順に進めることにしました

  1. tfenvを導入する
    • これまでは複数のディレクトリで共通のterraformバージョンを利用していたのですが、1日で全てのバージョンを上げきるのが難しかったので、複数の日に分けて作業をしていました
    • そのとき各メンバーがterraformのバージョンを細かく意識するのは現実的でないため、tfenvを導入し、.terraform-versionを各ディレクトリに配置しました
  2. 各providerのv0.12対応状況を確認→providerのバージョンを上げる
    • 当社では主にaws(terraform-provider-aws)ですが、一部で他のproviderを利用しているケースがあるため、事前に確認が必要でした
      • awsの場合はv2.7.0以上が必要です
    • 当時はgoogle(terraform-provider-google)が未対応だったため対応を見送りました
  3. 各ディレクトリでは以下の手順
    1. echo 0.12.0 > .terraform-version
      • これは当時のバージョンのため、今なら0.12.14など、最新バージョンを書き込みましょう
    2. terraform 0.12upgrade
    3. エラーを解消(後述)
    4. 0.12upgradeによりTODOとなっている部分を解消
    5. 小さな差分を解消(後述)

ハマりポイント

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の差分は数万行でした