🙄

terraform showでplanの出力を見るときにハマったこと

に公開

やろうとしたこと

モノレポ構成のterraformリポジトリでterraform plan -out=${WORKSPACE}/tmp/sample.tfplanのようにして、リポジトリルートのtmpディレクトリにplan結果をまとめようとしていました。
ディレクトリ構成は以下です。

tree.md
root
├── tmp
│   └── (ここにおきたい)
└── services
    └── sample
        ├── modules
        │   └── some_module
        │       ├── main.tf
        │       ├── outputs.tf
        │       ├── provider.tf
        │       └── variables.tf
        ├── dev
        │   ├── backend.tf
        │   └── main.tf
        └── prd
            ├── backend.tf
            └── main.tf

出力はできたのですが、terraform show tmp/sample.tfplanで以下のようなエラーが出てしまいました。

│ Error: Failed to load plugin schemas
│ 
│ Error while loading schemas for plugin components: Failed to obtain provider schema: Could not load the schema for provider
│ registry.terraform.io/hashicorp/aws: failed to instantiate provider "registry.terraform.io/hashicorp/aws" to obtain schema:
│ unavailable provider "registry.terraform.io/hashicorp/aws"..

どうやら、pluginが読み込めていないようです。
Geminiに聞いたところ、planの出力がルートモジュールの場所にないといけないと回答されました。そうなのかと思い、各ディレクトリにplanを出力しました。
そしてterraform show services/sample/dev/.tfplanとしたのですが、上記と同じエラーが出ていました。

解決策

terraform -chdir=services/sample/dev .tfplanとすると正常にplanが見えました。
どうやら、showコマンドを実行したディレクトリからの相対パスでpluginを探すようです。
デバッグログを見ると以下のように.terraform以下にアクセスしています。

2025-04-23T05:05:02.483Z [DEBUG] provider: starting plugin: path=.terraform/providers/registry.terraform.io/hashicorp/aws/5.92.0/linux_amd64/terraform-provider-aws_v5.92.0_x5 args=[".terraform/providers/registry.terraform.io/hashicorp/aws/5.92.0/linux_amd64/terraform-provider-aws_v5.92.0_x5"]

感想

出力結果は依存なしにshowで確認できるものかと思っていたのですが、違うんですね。
terraformコマンドはルートモジュールと同じ場所で実行したほうが無難みたいです。

Discussion