はじめに
どうも、@to-fmakです。最近Terraform Cloudを利用している際に発生したモジュール参照エラーについて、事象と対応方法をまとめました。同じような問題に直面した方の参考になれば幸いです。
事象
Terraform Cloudをバックエンドとして利用しているTerraformリポジトリがあり、以下のようなディレクトリ構成を採用しています。
sample-repo
├── modules
│ └── sample-module
└── pj1
└── main.tf
この構成において、新しいモジュール (sample-module) を作成し、pj1ディレクトリ内のmain.tfからそのモジュールを参照する必要がありました。
module "sample" {
source = "../modules/sample-module"
...
}
上記のように、相対パスを使用してモジュールのsourceを指定しましたが、terraform planを実行した際に以下の参照エラーが発生しました。
╷
│ Error: Unreadable module directory
│
│ Unable to evaluate directory symlink: lstat ../modules: no such file or
│ directory
╵
╷
│ Error: Failed to read module directory
│
│ Module directory does not exist or cannot be read.
実際の環境では、pj1と同じ階層に複数のディレクトリが存在し、それぞれのディレクトリ内のtfファイルからこのモジュール(sample-module)を参照する必要がありました。
各参照先でTerraformのバージョンが一致していない場合もありますが、今回の事象はTerraformのバージョンには関係ないことが判明しています。
原因
この問題の原因は、Terraform Cloud上のデフォルトの作業ディレクトリ設定にあります。
Terraform Cloudでは、デフォルトではリポジトリのルートディレクトリが作業ディレクトリとして設定されています。そのため、pj1ディレクトリ内から相対パスでモジュールを参照しようとすると、Terraform Cloudはリポジトリのルートディレクトリからの相対パスとして解釈し、指定したパスが存在しないと判断してしまいます。
相対パス利用時の対応方法
この問題を解決するためには、Terraform Cloud上の該当するワークスペースの設定を変更する必要があります。
具体的には、該当ワークスペースの「Workspace Settings」→「General」→「Terraform Working Directory
」にて、作業ディレクトリとして作業ディレクトリ(pj1)を指定する必要があります。
この設定を行うことで、main.tf内のmoduleブロックで相対パスを使用してモジュールを正しく参照できるようになります。
参考URL
エンジニア募集
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!
ぜひお気軽にカジュアル面談へお越しください!!