🙄
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