このブログ記事では、Terraformにおけるモジュールについて紹介します。
前回の記事では、HCLにおける変数と出力について説明しました。 これらは、Terraformにおける柔軟で再利用可能なインフラストラクチャ設定管理とプロビジョニングを可能にします。 しかし、Terraformにはモジュールと呼ばれる別の強力な概念があり、これは抽象化を提供し、 よりクリーンで再利用可能なTerraformコードの実現に貢献します。 そこで、この記事では、Terraformにおけるインフラストラクチャのより効果的な整理とシームレスなプロビジョニングのために、 モジュールを効果的に使用し構築する方法について説明します。
モジュール
モジュールは、リソースと変数の.tfファイルをディレクトリに整理することで簡単に作成できます。
通常、データベース、ネットワーク、コンピュートリソースなどの異なるタイプのリソースを、
database.tf、network.tf、compute.tfなどの別々のファイルに整理します。
ローカルモジュールは、以下のようにディレクトリへの相対パスを使用してロードし利用することができます。
module "web_app" {
source = "../web_app_module"
# Input Parameters
bucket_name = "web_app_1"
domain = "example.com"
app_name = "web_app_1"
environment_name = "production"
# ...
}上記を適用すると、モジュールブロックで提供された入力パラメータとメタ引数に従って、
web_app_moduleサブディレクトリ内のローカルモジュールで定義されたリソースが作成されます。
source引数は、GitHub、Terraform Registry、その他のリモートホスティングサービスでホストされているTerraformモジュールリポジトリへのリンクも受け取れます。
モジュールが適切な抽象化レベルで定義されている場合、複雑なインフラストラクチャを定義する際の重複作業を防ぎ、
開発者が異なるアプリケーション向けに簡単にカスタマイズできるようになります。
複数環境の管理
モジュールは、開発、ステージング、本番環境などの異なる環境を管理する際に特に有用です。
通常、dev、staging、productionなどのディレクトリを設定し、
それぞれにグローバルモジュールを参照するmain.tfファイルと、
入力パラメータを設定するためのterraform.tfvarsファイルを含めます。
Terraformのワークスペース機能も異なる環境の管理に使用でき、
ユーザーが同じコードベースとバックエンドを使用して環境間を切り替えることができますが、
セキュリティ強化のためのより良いバックエンド分離と、
デプロイされた状態を完全に表現するより明示的なコードベースを提供し、
人的エラーのリスクを軽減できるモジュールの使用が一般的に推奨されます。
CI/CDパイプライン
以前述べられたとおり、Terraformの最も重要な利点の一つは、バージョン管理が可能で、
GitHub ActionsなどのCI/CDワークフローにシームレスに統合できることです。
メインブランチへのプッシュでトリガーされるワークフローを設定してステージング環境のセットアップをテストし、
リリースイベントでトリガーされる別のワークフローでグローバル本番環境をデプロイし、
インフラストラクチャリソースのテストとデプロイを自動化できます。
便利なことに、HashiCorpはこの目的で使用できるTerraformセットアップ用のパブリックGitHub Action hashicorp/setup-terraform@v1を提供しています。
テストでは、terraform fmt --checkでフォーマットをチェックし、
terraform planで計画が成功することを確認できます。
その後、一時的にリソースを作成してその可用性をチェックするbashスクリプトを書いて実行できます。
または、Goに慣れている場合は、GruntworkのTerratestライブラリを使用してGoスクリプトを書くこともできます。
すべてのテストが通過した場合、対応する環境のモジュールとリソースに対しterraform apply -auto-approveを使用してリソースをデプロイできます。
CLIとGUIを介したアウトオブバンド変更はエラーの主要な原因であるため、
CI/CDワークフローを設定し、変更をTerraformを通してのみ行うよう制限することが推奨されます。
結論
この記事では、IaCツールとしてTerraformを最大限に活用するためにモジュールをどのように利用できるかを紹介しました。 練習として、前回の記事のTerraformコードをモジュールを使用して書き直すことをお勧めします。 また、より詳細な説明や公開されていモジュールについては、以下に引用されているリソースを確認することをお勧めします。
リソース
- DevOps Directive. 2022. Complete Terraform Course - From BEGINNER to PRO! (Learn Infrastructure as Code). YouTube.
- HashiCorp. n.d. Modules. Terraform Registry.
- HashiCorp. n.d. Terraform Language Documentation. Terraform.