今回は、Terraformのモジュールとベストプラクティスについて説明します。
私が現在参画しているプロジェクトでは、Terraformを使用し、GoogleCloudを構築することが要件になっています。
その中で学習した内容についてアウトプットします。
今後、私と同じようにTerraformを使用する方向けに、Terraform学習の手助けになれば幸いです!
モジュール概要
モジュールとは、特定のフォルダの中にあるTerraform構成ファイルが集まったセットです。プログラミングでいう、関数のようなもので、他のTerraform構成ファイルから読み出すことができます。下記のようなフォルダ構成となっています。
terraform_gcp
├──iam
│ ├main.tf
│ ├variables.tf
│ └outputs.tf
│
└── projects
├main.tf
├variables.tf
└outputs.tf
モジュールを使用するメリット

モジュールを使用するメリットは3つあります。
- 保守性の向上
- インフラ構造の視認性向上
- 一貫性の向上
1.保守性の向上
同じモジュールを使用して、複数の環境を展開できます。同じモジュールを使用することで、コードの保守性を高めることができます。モジュールを更新すると、同じ更新を複数の環境で展開できます。
2.インフラ構造の視認性向上
モジュールを作成すると、単一のファイルで環境を構築するより、インフラ構造を理解しやすくなります。各サービスにおいて、フォルダ分けすることで、インフラでどのようなサービスを使用しているか理解しやすくなります。
3.一貫性の向上
モジュールを使用することで、信頼できる情報源になります。モジュールを更新すると、すべての環境の同期を行うことができます。
モジュールの構造化
モジュールの構成ファイル

モジュールの主な構成ファイルは、下記3つです。
- リソース定義(main.tf)
- 変数(variables.tf)
- 出力定義(outputs.tf)
モジュールの呼び出し
モジュールの呼び出しは、モジュールブロックで行います。モジュールブロックは、下記のような記述になります。
module "project-create" {
name = "prj-test-01"
random_project_id = true
org_id = "1111111111"
usage_bucket_name = "prj-test-01-report-bucket"
usage_bucket_prefix = "prj/test/01"
billing_account = "AAAAAA-SSSSSS-DDDDD"
svpc_host_project_id = "shared_vpc_host_name"
}
モジュールの注意点
モジュールブロックを修正するたびに、「terraform init」(初期化)を実行する必要があります。
モジュール化のポイント
モジュール化するポイントには下記のようなものがあります。
- 1つのファイルにしない
- 最初に計画を行う
- サービス毎や環境毎にモジュールを細かく分ける
- シンプルなフォルダ構造にする
各社クラウドサービスのモジュール
私が使用しているGoogle Cloudのモジュールは、下記GitHubにあります。このモジュールを環境に合わせて微調整して使用しています。これから、モジュールを使用する人は、是非参考にしてください。
・Google Cloud and HashiCorp
https://github.com/terraform-google-modules
また、Terraform Registryもよく使用しますので、こちらも参考にしてください。Terraform Registryには、Google Cloud以外のクラウドサービスのモジュールもあります。
・Terraform Registry(aws)
https://registry.terraform.io/providers/hashicorp/aws/latest
・Terraform Registry(azurerm)
https://registry.terraform.io/providers/hashicorp/azurerm/latest
Terraformのベストプラクティス(Google Cloud)

Google CloudでTerraformを使用するためのベストプラクティスには以下のようなものがあります。
- 標準のモジュール構造を使用する
- 命名規則を決める
- 出力ファイルを作成する
- データソースを使用する
- カスタマイズしたスクリプトは最小限にする
- ヘルパースクリプトは別のフォルダに保存する
- 静的ファイルは別にフォルダに保存する
- ステートフルのリソースは削除保護する
- 組み込みの書式を使用する
- 式は簡素化する
- 条件にはcountを使用する
・Terraform を使用するためのベスト プラクティス
https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja
まとめ
本日は下記4点について説明しました。
- モジュール概要
- モジュールを使用するメリット
- モジュールの構造化
- Terraformのベストプラクティス
大規模なインフラ構築を行う場合、モジュールを使用してインフラを構築します。モジュールについては、各サービスがテンプレートを公表しているので、それを使用するのがおすすめです。私が主に使用しているGoogle Cloudも、GitHub上に、各サービスのモジュールをリリースしています。それを基に、環境に合わせて微調整を行っています。
これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!
それでは、次回のブログで!