TL;DR
- Terraform は、本体の Terraform Core と、Core から RPC で呼び出される Terraform Plugin から成る。
- Plugin には、特定のサービス向けの Provider Plugin と、リソースの作成後などにスクリプトを実行する Provisioner Plugin がある。
内容
Terraform Core
Terraform Core は Go で書かれ、コンパイルされたバイナリ(Terraform CLI)として配布される。主な責務は次のとおりである。
Terraform Plugin
Terraform Plugin は、Terraform Core から RPC で呼び出される実行可能バイナリである。メインの Terraform バイナリとは別のプロセスとして動き、RPC のインタフェースを通じてメインと通信する。大きく 2 種類に分かれる。
1 つ目は AWS など特定のサービス向けの Provider Plugin(プロバイダ)である。API 呼び出しで使うライブラリの初期化、インフラやプロバイダとの認証、サービスに対応するリソースの定義、設定値の計算を助ける関数の定義を受け持つ。
2 つ目は Provisioner Plugin である。リソースの作成後や破棄後に、そのリソース上でコマンドやスクリプトを実行する。
Provisioner Plugin は多くが組み込みで用意されている。Provider Plugin は必要に応じて動的に追加され、terraform init の実行時に自動でダウンロードされる。
Plugin の取得とバージョン選択
terraform init を実行すると、Terraform は作業ディレクトリの構成ファイルを読み込んで必要な Plugin を判断する。次に、インストール済みの Plugin を探し、必要なら追加の Plugin をダウンロードして使うバージョンを決める。最後にロックファイル .terraform.lock.hcl を作成する。
Plugin が既にインストールされている場合は、構成ファイルに書かれたバージョン制約と比べて、次の順にバージョンを選ぶ。
- 制約を満たすバージョンがインストール済みなら、それを使う
- 制約を満たすバージョンがないが、HashiCorp が配布する Provider の 1 つであれば、Terraform Registry から条件に合う最新のバージョンをダウンロードし、
.terraform/providers/以下に保存する - 制約を満たすバージョンがなく、Terraform Registry でも配布されていなければ失敗する。この場合は手動でインストールする
Plugin を新しいバージョンに上げるには、terraform init に --upgrade フラグを付ける。Terraform Registry をもう一度確認し、新しいバージョンがないかを調べる。ただし、対象は .terraform/providers/ にある Plugin だけである。