Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

Terraform 0.14アップグレード時に出たエラーの対処

v0.12 => v0.13移行時に、えいや、で上げちゃったら、痛い目を見たので、
v0.14へのアップグレードを渋っていました。
気づいたら、もうv1.0が出ている・・・

こういうのは、ちゃんと自動テストを用意して、おかしくなってないか確かめられるようにしておくのがベストです。
やれてませんが!

今回はv0.14アップグレード時に出たエラーの話ですが、
どちらかというとバージョンを2つ一気に上げようとするとどうなるか、という話になります。
(タイトル詐欺っぽくて申し訳ないです)

You must complete the Terraform 0.13 upgrade process before upgrading to later versions.

tfstateがv0.12の状態で、v0.14のterraformでinitしようとすると発生します。
terraformの公式ドキュメントは、バージョンは一つずつ上げてくれと言っています。

Terraform supports upgrade tools and features only for one major release upgrade at a time, so if you are currently using a version of Terraform prior to v0.13 please upgrade through the latest minor releases of all of the intermediate versions first, reviewing the previous upgrade guides for any considerations that may be relevant to you.

v0.13からv0.14に上げる話をしているのに、なぜv0.12の話が出てくるのかというと、
v0.13にアップデートしたときにちゃんとやらなかったからです。

私の環境では、ある程度の粒度でterraformのディレクトリを複数に分割しています。
v0.13へアップグレードする際、更新のあったディレクトリだけアップグレードしていました。
結果として、更新のないディレクトリはv0.12の状態のtfstateのままになっていました。

そして今回、これまでの更新の反省を踏まえて、一気にv0.14に上げようとして、このエラーが発生しました。
アップグレードのやり方の違いによって、絶妙にかみ合ってしまいました。

対処法は、v0.13のterraformで terraform apply を実行するだけです。
もちろん、差分が出ないかは気を付けつつapplyしました。

Error: state snapshot was created by Terraform v0.14.11, which is newer than current v0.13.5; upgrade to Terraform v0.14.11 or greater to work with this state

これは前述したエラーの対処として、v0.13のterraformで、terraform applyをした際に発生したエラーです。
dataでterraform_remote_stateを読み込んでいると発生します。

security_groupやsubnetidをtfstateのアウトプットから読み取っている部分があるのですが、そのtfstateが新しいバージョンだと、v0.13.5だと読み取れないといわれています。

複数のディレクトリに分割していると言いましたが、

terraform - dir1/xxx.tf (v0.14のtfstate)
          - dir2/yyy.tf (v0.12のtfstate) (xxx.tfのリソースを参照)

この状態なので、まずdir2のリソースはterraform v0.13へアップグレードする必要があります。
そこで前述した対処を行おうとすると、data "terraform_remote_state" "xxxxx" がv0.14.5のものだから読み込めずエラーとなります。

まとめると

  • dir2をv0.13に上げなくてはならない
  • dir2をv0.13に上げるためには、dir1のtfstateをv0.13に戻さなければいけない
  • dir1のtfstateはすでにv0.14になっている

このような状態です。

ここでの対処は2通り考えられます。
一つは、dir2をコード上ではv0.14にしてしまって、terraform import を行っていくことです。
これはリソースがたくさんあるほどつらい思いをします。

もう一つはdir1のtfstateをv0.13に戻す方法です。
s3のバージョニングのおかげで戻せる状態になっていました。
参照先であるs3のバージョンを直接戻しても良かったのですが、ここでは古いバージョンをダウンロードしてきて、
参照先をlocalファイルとすることで対処しました

before
data "terraform_remote_state" "network" {
  backend = "s3"
  config = {
    bucket = "xxxxx"
    key    = "terraform.tfstate"
  }
}
旧バージョンをダウンロード
aws s3api get-object --bucket --key terraform.tfstate --version-id xxxxxxxxxx ./terraform.tfstate.network.v13
after
data "terraform_remote_state" "network" {
  backend = "local"
  config = {
    path = "./terraform.tfstate.network.v13"
  }
}

そもそもなのですが、これはterraform_remote_stateではなく
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/subnet_ids
このようなデータソースを利用していれば、問題は発生しません。

利用し始めた初期のころはあまり意識せずリモートステートを利用していましたが、
最近だとこのような事態に陥るので、データソースを利用するようにしています。

結論

terraformのアップグレードとは、

「tfstateのterraformのバージョンの状態を、アップグレード後のバージョンにすることであって、文法をterraformのバージョンに合わせるだけでは駄目である」

applyするまでが、terraformのアップグレードです。
気を付けていきましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?