2020-10-02

10/2

terraform v0.13へのアップグレード

最近、何度かv0.12からアップグレードする機会があった。
というか、tfenv等でバージョン固定してなかったために、不意にバージョンが上がってしまった。

まずここを読んでから作業すべし:

本来あるべき手順:

  1. アップグレード前にterraform planで差分がないことを確認
  2. v0.13へアップグレード
  • 適宜HCLを修正する。 required_providers の追記については後述
  1. アップグレード後にterraformを実行して問題ないことを確認

事前に差分を確認せずにアップグレードして、その後にterraform plan/applyすると、こういうエラーが出ることがある(あった):

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

Error: Provider configuration not present

To work with google_xxx.yyy its
original provider configuration at provider["registry.terraform.io/-/google"]
is required, but it has been removed. This occurs when a provider
configuration is removed while objects created by that provider still exist in
the state. Re-add the provider configuration to destroy
google_xxx.yyy, after which you can remove the provider configuration again.

ここで google_xxx.yyy には色んなリソースが入ってくる。
こういうエラーがずらっと並んでいたのを見た。

このエラーについては上のアップグレードガイドにも書いてあるが、tfstateにあるリソースがなくなっているケースが多いようだ。
ありがちなのは、コンソールやCLIでリソースを消して、terraform側に反映してないとか、そういうケース。

対応としては、消していいものであれば、 terraform state rm google_xxx.yyy でOK.

参考:

terraform.required_providersエントリの追加

必須ではないかもしれないが、利用するプロバイダをterraformブロックの中に記述するようになった。

例:

terraform {
  required_version = "~> 0.13.0"

  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 3.41"
    }
    google-beta = {
      source  = "hashicorp/google-beta"
      version = "~> 3.41"
    }
  }
}