背景
最近たまたま機会が重なり、ずっとterraformを触ってます。
(3月はterraform集中月間でした)
module追加したり大きな変更をした場合にとりあえず実行していたinit。そろそろちゃんと理解したかったので整理してみました。
結論
とりあえず結論から。以下が主要な実行タイミングです。
①新規プロジェクト開始時
- Terraformプロジェクトを最初にセットアップする際
- main.tfやversions.tfなどの基本設定ファイルを作成後に実行
②プロジェクト構成の変更時
- Backend設定の変更(ex. ローカルからリモートに変更する場合)
- Providerバージョンの更新(ex. AWS Providerのバージョンアップをする場合)
- 新しいModuleの追加や既存Moduleのバージョン変更
terraform init
が行っていること
terraform init
では、主に以下の4つの主要な処理が行われます。
-
Backendの設定
a. Terraformの状態管理(state)の保存場所を設定
b.terraform.tfstate
の保存方法を決定
c. 既存のBackend設定と新しい設定の一貫性を確認 -
Moduleのインストール
a. 定義されたすべてのモジュールをダウンロード
b. .terraform/modulesディレクトリに保存
c. モジュール間の依存関係を解決 -
Providerのインストール
a. required_providersブロックで指定されたプロバイダーをインストール
b. .terraform.providersディレクトリに保存
c. バージョンの整合性を確認 -
Lockファイルの生成
a..terraform.lock.hcl
ファイルを作成
b. 使用するProviderとModuleのバージョンを固定
c. チーム開発でのバージョンの一貫性を保証
各ステップで生成されるファイルとディレクトリ構造について
.terraform.lock.hcl
ファイルは一見バージョン管理すべきかどうかわかりにくいですが、使用するProviderとModuleのバージョンを固定するため、含める必要があります。
.terraformに生成されるディレクトリ構造と概要は以下の通りです。
.terraform/
├── modules/ # モジュールの保存場所
│ └── ...
├── providers/ # プロバイダーのインストール先
└── terraform.tfstate # Backend設定情報
参考資料