しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Terraform Provider for AzureRM を v4 系にアップグレードする

Terraform Provider for AzureRM のウォッチャーであれば v4 のリリースが近いことを知っていたと思いますが、v3 のリリースノートで v4 での変更点の Opt-in が紹介されてから意外に早くリリースされました。

正直なところ目立った新機能とかはなく Provider-defined functions が追加されたぐらいですが、Resource Provider の登録周りに大きく手が入れられているのと、非推奨リソースとプロパティが削除されているのが大きな変更点にはなるので、使っているリソースによっては移行が必要になる可能性があります。

AzureRM v4 へのアップグレードガイドは以下で公開されているので、まずは一通り確認しておくのをお勧めします。メジャーバージョンが上がっただけあって Breaking Changes は多めです。

地味に v4 からサブスクリプション ID の明示的な指定が必須になっているので、GitHub Actions などで Azure CLI を経由して Federated Credentials を使っている場合は、環境変数などでサブスクリプション ID を渡すように変更しましょう。当然ながら Terraform Cloud を使っている場合は影響は受けません。

削除されたリソースとプロパティはかなりの数になるので、まずは実際に v4 へのアップグレードを行ってから Terraform CLI を使ってエラーを潰していくのが一番楽だと思います。

Terraform Provider for AzureRM を v4 にアップグレードするだけなら、required_providers のバージョン指定を 4.0 以上を使うように変更するだけで終わります。

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
  }
}

今の Terraform は Provider のロックファイルが導入されているので、忘れずに terraform init -upgrade を実行します。その後に terraform validate を実行すると削除されたリソースやプロパティに関するエラーが検出されるので、地道に潰していきましょう。

# lock ファイルを更新
terraform init -upgrade

# 互換性のないリソース・プロパティをチェック
terraform validate

削除されたリソースとプロパティはかなり多いのですが、自分が管理しているリソースではバージョンを上げるだけでほぼ変更なしで検証が通りました。v3 の時点で非推奨になっているリソースを使っていなければスムーズにアップグレード出来るようです。

この時点で警告やエラーが出なければアップグレード完了ですが、自分のケースでは Resource Provider を Terraform Provider 側でさせないための設定で警告が出ました。

具体的には skip_provider_registration を設定していたので、v4 向けでは resource_provider_registrations を使うようにという警告でした。以下のように書き換えると警告が出なくなります。

provider "azurerm" {
  //skip_provider_registration = true
  resource_provider_registrations = "none"
}

Resource Provider の登録をスキップするようにすると、毎回の実行時に登録状況をチェックする必要がなくなるので少し早くなりますし、冷静に考えて最初に一回だけ必要な処理を毎回行うのは無駄です。

AzureRM v4 からは Resource Provider を大雑把に全部登録するのでは無く、必要な分だけ細かく選択可能になりましたが、この機能を使うにはサブスクリプションに対して Contributor 以上の権限を割り当てる必要があります。

You must have permission to do the /register/action operation for the resource provider. The permission is included in the Contributor and Owner roles.

Resource providers and resource types - Azure Resource Manager | Microsoft Learn

この為になかなか強い権限を与えないといけないのがネックです。

個人的には Resource Provider の登録は Terraform でやるものでは無いと考えているので、サブスクリプションを作成したタイミングで以下のスクリプトを使ってよく使うものを一括で登録しています。

curl https://gist.githubusercontent.com/shibayan/e37307ba05a91cac884872505a4625f6/raw/resource-providers.sh | bash

特に新しく作成したサブスクリプションの場合はほぼ全ての Resource Provider が登録されていないこともざらにあるので、サブスクリプションの作成時のフローとして組み込みたいぐらいです。

最後になりましたが、今回アップグレードを行う為に作成した Pull Request は以下のようにシンプルなものでした。

こまめに廃止予定のリソースは新しいリソースに移行しておくと、今回のように Breaking Changes を伴うアップグレードでも焦らずに済むはずです。