AWS
PR

M3のMacでterraform実行時に「Incompatible provider version」エラー

saratogax
記事内に商品プロモーションを含む場合があります

前回、terraform 実行のために tfenv の環境を整えた話を書きました。

実際に terraform で plan や import を実行しようとしたのですが、以下のエラーに遭遇・・・。

darwin_arm64 ってことなので、ローカルの Mac の環境が関係しているのでしょうか。

+ terraform init -backend-config key=resources.hoge.tfstate -force-copy

Error: Incompatible provider version

Provider registry.terraform.io/hashicorp/template v2.2.0 does not have a package available for your current
platform, darwin_arm64.

Provider releases are separate from Terraform CLI releases, so not all providers are available for all platforms.
Other versions of this provider may have different platforms supported.

今回はこのエラーの対応を紹介したいと思います。

エラー内容と原因

HashiCorp の公式サイトで調べてみると、以下の情報に行き着きました。

なるほど、このような経緯だったのですね。

テンプレート プロバイダーは、M1(darwin_arm64)リリースが存在する前に非推奨となり、アーカイブされました。

プロバイダーを M1 ハードウェアで使用する必要がある場合は、Terraform を rosetta で amd64 バイナリとして実行するか、プロバイダーを手動でビルドしてインストールする必要があります。

以下を実行してみましょうか。

$ brew install kreuzwerker/taps/m1-terraform-provider-helper

$ m1-terraform-provider-helper activate

$ m1-terraform-provider-helper install hashicorp/template -v v2.2.0

これで問題なく terraform が実行できるようになりました。

ただし、これはあくまでその場をしのぐ回避策です。template プロバイダ自体が非推奨・アーカイブ済みなので、恒久的には後述の templatefile 関数への移行をおすすめします。

m1-terraform-provider-helper

m1-terraform-provider-helper の github のドキュメントも見ておくと良さそうですね。

根本解決: templateプロバイダから移行する

そもそも hashicorp/template プロバイダは非推奨となり、リポジトリもアーカイブ済みです。最終リリースの v2.2.0 は 2020 年 10 月で、Apple Silicon 向けのバイナリは今後も提供されません。

HashiCorp 自身が公式ドキュメントで移行先を案内しているので、可能であれば回避策ではなくプロバイダの利用そのものをやめるのが確実です

公式が示している移行先は以下のとおりです。

template_file → 組み込みの templatefile 関数 (Terraform 0.12 以降)
template_dirhashicorp/dir/template モジュール
template_cloudinit_config → cloudinit プロバイダの cloudinit_config

template_fileをtemplatefile関数に置き換える

一番よく使われている template_file の場合、データソースを消して関数呼び出しに変えるだけで済みます。

移行前はこのような書き方です。

data "template_file" "init" {
  template = file("${path.module}/init.tpl")
  vars = {
    consul_address = aws_instance.consul.private_ip
  }
}

resource "aws_instance" "web" {
  user_data = data.template_file.init.rendered
}

移行後は templatefile 関数を直接式の中で呼べるので、データソースの定義自体が不要になります。

resource "aws_instance" "web" {
  user_data = templatefile("${path.module}/init.tpl", {
    consul_address = aws_instance.consul.private_ip
  })
}

プロバイダへの依存が消えるので、darwin_arm64 のバイナリが存在するかどうかを気にする必要がなくなります。ビルド用に Go を用意する手間もなくなります。

参考(出典)

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました