こんにちは。よっしーです(^^)
今日は、Terraformでのモジュール操作について解説しています。
背景
下記のサイトを参考に実施したときの内容を自身のGCPプロジェクトに適用したときの内容を備忘として残しました。
実施内容
下記の手順で実施しました。
mkdir `作業ディレクトリ`
cd `作業ディレクトリ`
# terraformのバージョン指定
asdf local terraform 1.9.2
# terraformのバージョン確認
terraform --version
asdf local gcloud 482.0.0
asdf local python 3.12.4
# gcloudのバージョン確認
gcloud --version
# 操作アカウントの設定
gcloud config set account `アカウント`
# 操作アカウントの確認
gcloud config get-value account
# プロジェクト新規作成
gcloud projects create `プロジェクト`
# プロジェクトの情報確認
gcloud projects describe `プロジェクト`
# プロジェクトの設定
gcloud config set project `プロジェクト`
# サービスの有効化
gcloud services enable compute.googleapis.com
# 請求先アカウントの確認
gcloud beta billing accounts list
# 請求先アカウントのリンク
gcloud beta billing projects link `プロジェクト` --billing-account=`請求先アカウント`
# Google Terraform モジュール
git clone https://github.com/terraform-google-modules/terraform-google-network
cd terraform-google-network
git checkout tags/v6.0.1 -b v6.0.1
cd examples/simple_project
下記のファイルを編集します。
modified: variables.tf
各ファイルの修正内容は下記になります。
main.tf
diff --git a/examples/simple_project/main.tf b/examples/simple_project/main.tf
index 36c9e90..ef45663 100644
--- a/examples/simple_project/main.tf
+++ b/examples/simple_project/main.tf
@@ -32,7 +32,7 @@ module "test-vpc-module" {
{
subnet_name = "subnet-01"
subnet_ip = "10.10.10.0/24"
- subnet_region = "us-west1"
+ subnet_region = "REGION"
},
{
subnet_name = "subnet-02"
# 初期化
terraform init
# 実行プランの作成
terraform plan
# 変更を適用
terraform apply
# 状態ファイルの確認
terraform show
# リソースの破棄
terraform destroy
解説
main.tf
このコードは、Google Cloud Platform (GCP) でカスタムVPCネットワークを作成するためのTerraformモジュールの設定です。以下に、コードの主要な部分を解説します:
- モジュールの定義:
module "test-vpc-module" {
source = "terraform-google-modules/network/google"
version = "~> 6.0"
...
}
これは、Google提供のネットワークモジュールを使用しており、バージョン6.0系を指定しています。
- プロジェクトとネットワークの設定:
project_id = var.project_id
network_name = "my-custom-mode-network"
mtu = 1460
プロジェクトID、ネットワーク名、MTU(最大転送単位)を設定しています。
- サブネットの定義:
subnets = [
{
subnet_name = "subnet-01"
subnet_ip = "10.10.10.0/24"
subnet_region = "us-west1"
},
...
]
3つのサブネットを定義しています。各サブネットには名前、IPレンジ、リージョンが指定されています。
- 追加のサブネット設定:
- 2番目のサブネットでは、プライベートGoogleアクセスとフローログが有効化されています。
- 3番目のサブネットでは、より詳細なフローログ設定(間隔、サンプリングレート、メタデータ、フィルタ)が行われています。
このコードを使用すると、GCP上に1つのVPCネットワークと3つのサブネットが作成され、それぞれのサブネットに異なる設定が適用されます。
variables.tf
これらの変数定義について解説しています。
project_id
変数:
variable "project_id" {
description = "ネットワークをホストするプロジェクトの ID"
default = "プロジェクトID"
}
- この変数はGCPプロジェクトIDを定義します。
description
はこの変数の用途を説明しています。default
値として “プロジェクトID” が設定されていますが、これは必要に応じて上書きできます。
network_name
変数:
variable "network_name" {
description = "作成する VPC ネットワークの名前"
default = "example-vpc"
}
- この変数は作成するVPCネットワークの名前を定義します。
- 同じく
description
で変数の目的を説明しています。 - デフォルト値として “example-vpc” が設定されていますが、これも必要に応じて変更可能です。
これらの変数定義により、Terraformコードの再利用性と柔軟性が向上します。例えば:
- 異なる環境(開発、テスト、本番など)で同じコードを使用する際、これらの変数値を変更するだけで済みます。
- Terraformコマンド実行時に、これらの変数に異なる値を渡すことができます。例:
terraform apply -var="project_id=my-new-project" -var="network_name=custom-network"
また、先ほどのモジュール定義で var.project_id
として参照されていた部分は、この project_id
変数を使用していることがわかります。同様に、network_name
変数もモジュール内で使用できます。
変数を使用することで、コードの管理がしやすくなり、異なる設定や環境に対して同じコードを簡単に適用できるようになります。
output.tf
Terraformの出力(output)ブロックを定義しています。出力は、Terraformの実行後に表示される情報や、他のモジュールから参照可能な値を定義するために使用されます。以下に、各出力の説明をします:
network_name
:
- 作成されたVPCの名前を出力します。
network_self_link
:
- VPCのURI(Uniform Resource Identifier)を出力します。これはGCP内でリソースを一意に識別するために使用されます。
project_id
:
- VPCが作成されたプロジェクトのIDを出力します。
subnets_names
:
- 作成されたサブネットの名前のリストを出力します。
subnets_ips
:
- 作成されたサブネットのIPアドレス範囲(CIDR)のリストを出力します。
subnets_regions
:
- サブネットが作成されたリージョンのリストを出力します。
subnets_private_access
:
- サブネットがプライベートGoogleアクセスを有効にしているかどうかを示すブール値のリストを出力します。
subnets_flow_logs
:
- サブネットでVPCフローログが有効になっているかどうかを示すブール値のリストを出力します。
subnets_secondary_ranges
:
- サブネットに関連付けられたセカンダリIPレンジの情報を出力します。
route_names
:- このVPCに関連付けられたルートの名前のリストを出力します。
各出力ブロックは以下の構造を持っています:
value
: 出力する値を指定します。ここではmodule.test-vpc-module
からの値を参照しています。description
: 出力の目的や内容を説明するテキストです。
これらの出力は以下のような用途に使用できます:
- Terraformの実行後に、作成されたリソースの詳細を確認する。
- 他のTerraformモジュールやスクリプトでこれらの値を参照する。
- CI/CDパイプラインで、作成されたリソースの情報を後続のステップで利用する。
出力を使用することで、インフラストラクチャの状態を簡単に把握し、他のプロセスと連携しやすくなります。
version.tf
これはTerraformの設定ブロックです。このブロックでは、Terraformのバージョンとプロバイダーの要件を指定しています。以下に詳細を解説します:
required_version = ">=0.12.6"
- この設定は、このTerraformコードを実行するために必要なTerraformのバージョンを指定しています。
- “>=” は「以上」を意味し、Terraform 0.12.6以上のバージョンが必要であることを示しています。
required_providers
ブロック:
このブロックは、このTerraformコードで使用するプロバイダーとそのバージョンを指定します。 a. Google プロバイダー:
google = {
version = "~> 4.0"
}
- Googleプロバイダーのバージョン4.x系を使用することを指定しています。
- “~>” は「パッチバージョンのみアップデート可能」を意味します。つまり、4.0から4.9999…までのバージョンが許容されます。
b. Null プロバイダー:
null = {
version = "~> 3.0"
}
- Nullプロバイダーのバージョン3.x系を使用することを指定しています。
- これも同様に、3.0から3.9999…までのバージョンが許容されます。
この設定の重要性:
- バージョン管理: 特定のバージョンを指定することで、異なる環境や時期で同じコードを実行した際に、一貫した結果を得ることができます。
- 互換性の確保: 特定のTerraformバージョンやプロバイダーバージョンと互換性のある機能のみを使用していることを明示します。
- 安定性: マイナーバージョンやパッチバージョンの更新を許可しつつ、メジャーバージョンの変更による破壊的な変更を防ぎます。
- チーム開発: チームメンバー全員が同じバージョンを使用することを保証し、バージョンの不一致による問題を防ぎます。
このような設定を行うことで、Terraformコードの再現性と安定性が向上し、長期的なメンテナンスが容易になります。
nullプロバイダ
Null プロバイダーは、Terraformの特殊なプロバイダーの一つです。その主な目的と特徴を説明します:
- 目的:
Null プロバイダーは、実際のインフラストラクチャリソースを作成せずに、Terraformの機能を活用するために使用されます。
- 主な用途:
- a. 依存関係の管理:
- 特定のリソースの作成を遅らせたり、他のリソースの作成後に特定のアクションを実行したりする場合に使用します。
- b. トリガーとしての使用:
- 特定の条件が満たされた時にのみ実行されるローカルの実行やスクリプトのトリガーとして使用できます。
- c. プレースホルダーとしての使用:
- 将来的に実装予定の機能や、まだ開発中の機能のプレースホルダーとして使用できます。
- 主なリソース:
- a.
null_resource
: - 実際のクラウドリソースを作成せずに、プロビジョナーを実行したり、他のリソースとの依存関係を定義したりできます。
- b.
null_data_source
: - 動的な値を生成したり、既存の値を変換したりするために使用できます。
- 使用例:
resource "null_resource" "example" {
triggers = {
cluster_instance_ids = join(",", aws_instance.cluster.*.id)
}
provisioner "local-exec" {
command = "echo 'Cluster instance IDs: ${self.triggers.cluster_instance_ids}'"
}
}
この例では、null_resource
を使用して、AWS インスタンスのIDリストが変更されたときにローカルでコマンドを実行しています。
- メリット:
- 柔軟性が高く、Terraformの機能を最大限に活用できます。
- 実際のリソースを作成せずにロジックを実装できるため、コストを抑えられます。
- テストや開発段階で便利に使用できます。
Null プロバイダーは、直接インフラストラクチャを操作しませんが、Terraformのワークフローやロジックを拡張するのに非常に有用なツールです。他のリソースとの連携や、条件付きの操作を実装する際によく使用されます。
おわりに
今日は、Terraformでのモジュール操作について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント