昨日の記事 で紹介した Carina に、モジュール機能を実装した。
YAPC::Fukuoka 2025での発表 で、インフラコードのモジュール化の難しさについて話した。
ここで挙げた問題のひとつが「内部構造の把握と依存関係の追跡が困難」という点。Terraformのモジュールは中身を見ないと何が作られるかわからないし、依存関係も追いづらい。planを実行してみれば、どんなリソースがつくられるかはわかるが、モジュールを呼び出すためのコードを書かないといけなくて面倒。また、つくられるリソースは表示されるが、リソース間の依存関係はplanの出力からはわからない。
この問題を解決するために、Carinaには
module info
というコマンドを実装した。
module info
コマンドを実行すると、モジュールの情報が以下のように表示される。
3つのセクションに分かれている。
モジュールが必要とする入力を表示する。
vpc: ref(aws.vpc) (required)
cidr_blocks: list(cidr) (required)
enable_https: bool = true
型情報と、必須かどうか、デフォルト値があるかどうかがわかる。
モジュールが作成するリソースをツリー構造で表示する。
input { vpc: ref(aws.vpc) }
└── web_sg: aws.security_group
├── http: aws.security_group.ingress_rule
└── https: aws.security_group.ingress_rule
入力として受け取った
vpc
を起点に、どのリソースがどのリソースに依存しているかが視覚的にわかる。
モジュールが外部に公開する出力を表示する。
security_group: ref(aws.security_group)
← from: web_sg
出力の型と、その出力がモジュール内のどのリソースから来ているかがわかる。
まだ少ないリソース数と単純な依存関係でしか試していないが、モジュールで定義されているリソース構造を把握するのに役立ちそう。リソース数が増えたり、依存関係が複雑になったりするとどうなるか、引き続き試しながら改善していきたい。