module のダウンロードの流れ
Registry は倉庫ではなく住所案内所。 モジュールの実体は持っておらず、「そのバージョンの実体はここにあるよ」と X-Terraform-Get ヘッダで住所を返すだけ。実体は GitHub などにある。
.tfからmoduleブロックを集め、sourceの種類を判別する- registry なら 3 往復して実体の住所を聞き出す(下の具体例)
- git / http / S3 は 2 をスキップして直接取得する
.terraform/modules/<key>/に展開し、modules.jsonに台帳を書く- 取得した module の中にさらに module があれば 1 に戻って再帰する
- 全 module が出揃ってから provider の実行バイナリ(
terraform-provider-awsなど、AWS の API を実際に叩く本体)を落としに行く。module の中にもrequired_providersが書けるので、先に集めきらないとどの provider がどのバージョンで要るのか決まらない
具体例: terraform-aws-modules/vpc/aws
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 6.0"
}
この 2 行で実際に起きること(source はホスト省略なので registry.terraform.io):
どこに聞けばいい? →
GET https://registry.terraform.io/.well-known/terraform.json{"modules.v1":"/v1/modules/","providers.v1":"/v1/providers/"}どのバージョンがある? →
GET https://registry.terraform.io/v1/modules/terraform-aws-modules/vpc/aws/versions243 個返ってくる。
~> 6.0に合う最新として6.7.2を選ぶ実体はどこ? →
GET https://registry.terraform.io/v1/modules/terraform-aws-modules/vpc/aws/6.7.2/downloadHTTP/2 204 x-terraform-get: git::https://github.com/terraform-aws-modules/terraform-aws-vpc?ref=cf0e3ca...本文は空(204)。住所だけ返る。バージョンタグではなくコミット SHA に解決済みなのがポイント
その GitHub リポジトリを取得し、
.terraform/modules/vpc/に置く
provider を「解決する」とは
Terraform 本体は AWS を知らない。 リソースの作り方を知っているのは provider という別の実行バイナリ。「解決」とは、全 module の要求を突き合わせて provider ごとに 1 バージョンを決め、そのバイナリを落とすこと。