Terraform は、インフラストラクチャをコードとして管理できるオープンソースツールです。
Google Cloud と組み合わせることで、
- サーバーインスタンスの作成
- ネットワークの設定
- データベースの管理
など、安全かつ効率的にインフラストラクチャを構築、管理できます。
本記事では、Terraform で Google Cloud プロジェクトをセットアップする方法、Google Cloud リソースを作成・管理する詳細な手順まで、具体的な方法を解説します。
Google Cloud で Terraform を活用して、インフラストラクチャ管理を効率化したい方は、ぜひ本記事をご覧ください。
Terraform の概要を知りたい方は以下の記事がおすすめです。
テラフォーム( Terraform )とは?特徴やメリット、活用する際のポイントを一挙に解説!
目次
Terraform を使用した Google Cloud リソース管理の基本手順
Google Cloud で Terraform を使用することで、クラウドリソースの管理がさらに簡単かつ効率的になります。ここでは、Google Cloud プロジェクトのセットアップ、Terraform を用いたリソース管理の基礎について説明します。
Terraform で Google Cloud プロジェクトをセットアップする方法
Terraform で Google Cloud プロジェクトをセットアップする方法は以下の通りです。
Terraform のインストール
Terraform は HashiCorp によって開発されたオープンソースのツールです。公式ウェブサイトから無料でダウンロードできます。
- Terraform の公式ウェブサイト(https://www.terraform.io/downloads.html)にアクセスします。
- お使いのオペレーティングシステム(Windows 、macOS 、Linux など)に適したバージョンを選択し、ダウンロードします。
- ダウンロードしたファイルを展開し、実行ファイルをシステムのパスに含める場所に移動します。
- インストールが正しく完了したかを確認するため、ターミナルまたはコマンドプロンプトを開き、terraform version コマンドを実行します。インストールされている Terraform のバージョンが表示されれば、インストールは成功です。
Google Cloud プロジェクトの設定
Google Cloud での作業を始めるには、まずプロジェクト設定が必要です。これにより、Terraform が操作するための環境が整います。
- Google Cloud Console へのアクセス
Google Cloud Console にログインします。
- 新しいプロジェクトの作成
「新しいプロジェクト」ボタンをクリックして新しいプロジェクトを作成します。
プロジェクト名を入力し、必要に応じて組織を選択します。
- プロジェクトIDの確認
プロジェクト作成後、プロジェクトダッシュボードからプロジェクト ID をメモします。
- サービスアカウントの作成
a.IAM & 管理 -> サービスアカウントで新しいサービスアカウントを作成します。
b.サービスアカウント名を入力し、ロールとして「編集者」を選択します。
c.サービスアカウントを選択し、[キー]タブの[鍵を追加] をクリックし、JSON 形式でキーファイルをダウンロードします。このキーファイルは Terraform から Google Cloud リソースにアクセスするために使用します。
Terraform 設定ファイルの作成
Terraform で管理するリソースを定義する設定ファイルを作成します。このステップは、Terraform プロジェクトの基礎です。
- 作業ディレクトリの準備
Terraform 設定ファイルを格納するためのディレクトリを作成し、そのディレクトリに移動します。
mkdir my-project
cd my-project
- 設定ファイルの作成
テキストエディタを使用して、main.tf という名前の新しいファイルを作成します。
- プロバイダの設定
main.tf ファイルに Google Cloud プロバイダの設定を記述します。
provider "google" {
credentials = file("helloworld-terraform-00000x0x0x00.json")
project = var.project_id
region = var.region
}
ここでの credentials は、Terraform が Google Cloud にアクセスするために必要な認証情報が含まれた JSON キーファイルへのパスを指します。ここには、事前にダウンロードしたキーファイルを指定してください。
- 変数の設定
variables.tf という名前の新しいファイルを作成し、プロジェクト ID とリージョン、ゾーンを定義する変数を設定します。
variable "project_id" {
type = string
}
variable "region" {
type = string
}
variable "zone" {
type = string
}
- リソースの定義
main.tf ファイルの続きに、必要な Google Cloud リソースを定義します。
以下のコードは、`google_compute_instance` リソースを使用して、`my-instance` という名前の Compute Engine インスタンスを定義します。
resource "google_compute_instance" "vm_instance" {
name = "my-instance"
machine_type = "e2-micro"
zone = var.region
boot_disk {
initialize_params {
image = "projects/debian-cloud/global/images/debian-12-bookworm-v20240110"
size = 10
type = "pd-balanced"
}
}
network_interface {
network = "default"
}
}
上記の例は Compute Engine インスタンスの例ですが、main.tf ファイルには Cloud Storage バケット、Cloud SQL データベース、Kubernetes クラスタなど、必要な Google Cloud リソースを自由に定義できます。
- 出力設定
outputs.tf という名前の新しいファイルを作成し、作成したインスタンスの情報を出力するように設定します。
output "instance_ip" {
value = google_compute_instance.vm_instance.network_interface.0.network_ip
}
このoutput ブロックは、作成した Compute Engine インスタンスのネットワークインタフェースの最初の IP アドレスを出力します。
Google Cloud リソースを作成・管理する Terraform の基本的な流れ
Terraform を使用して Google Cloud リソースを作成・管理する基本的な流れは、以下の 4つのステップに分かれます。
- Terraform プロジェクトの初期化
- リソースの定義
- プランの作成
- 変更の適用
Terraform プロジェクトの初期化
Terraform プロジェクトを初期化するには、ターミナルやコマンドプロンプトで以下のコマンドを実行します。
terraform init
このコマンドを実行すると、Terraform は必要なモジュールをダウンロードし、プロジェクトを初期化します。
H4:リソースの定義
ここでは、前セクションの「Terraform設定ファイルの作成」で作成した main.tf ファイルや variables.tf、outputs.tf を使用します。
プランの作成
プランの作成は、Terraform が実行しようとする変更を事前に確認するためのものです。このプロセスでは、設定ファイルに記述されたリソースが実際に Google Cloud 上でどのように作成されるか、または変更されるかを確認できます。
terraform plan
ターミナルに表示されるメッセージに従って、プロジェクト ID とリージョン、ゾーンを入力してください。
このコマンドを実行すると、Terraform は設定ファイルを読み込み、現在の状態と比較した上で、必要な操作を一覧表示します。例えば、新しい Compute Engine インスタンスを作成する場合、そのインスタンスの詳細とともに、作成されるリソースの概要が表示されます。
変更の適用
Terraform コードを変更することで、Google Cloud リソースに対して様々な変更を適用することができます。
変更の適用手順
変更の適用は、Terraform を使用してリソースに対して行いたい変更を実際に反映させるプロセスです。以下の手順に従って行います。
- Terraform コードの編集
main.tf ファイルやその他の Terraform 設定ファイルをテキストエディタで編集し、変更を加えます。
- プランの作成
terraform plan コマンドを実行して、提案された変更の一覧を確認します。このステップでは、設定ファイルに記述された内容が、実際に Google Cloud 上でどのように反映されるかを事前に確認することができます。
- 変更の適用
terraform apply コマンドを実行して、プランに基づいて変更を適用します。このとき、Terraform はユーザーに変更を適用するかどうかを確認します。ユーザーが「 yes 」と回答すると、Terraform はリソースの作成、更新、または削除を行います。
変更適用時の注意事項
- terraform apply コマンドを実行する前に、必ずプランの内容をよく確認してください。
- 誤った変更を適用してしまうと、データ損失やサービス停止などの問題が発生する可能性があります。
- テスト環境などで事前に動作確認を行うことを推奨します。
これらのステップにより、Terraform を使用して効果的に Google Cloud リソースを管理することが可能になります。プランの作成から変更の適用に至るまで、Terraform は明確かつ一貫したインフラストラクチャ管理を提供し、開発プロセスを効率化します。
Terraform で Google Cloud に実現できること
Terraform を使用して Google Cloud 上で実現できる機能は多岐にわたります。ここでは、
- リソースの自動作成と管理
- セキュリティとコンプライアンスの自動化
- インフラストラクチャの可視化
- 基本的な Terraform コマンドの使用法
について解説します。
Google Cloud リソースの自動作成と管理
Terraform を活用することで、Google Cloud 上に多様なリソースを効率的に展開し、管理するプロセスを自動化できます。具体的には、以下のようなリソース管理が可能です。
- Compute Engine インスタンス
- ネットワーク
- ストレージ
- データベース
- コンテナ
- サーバーレス
- その他多くの Google Cloud リソース
環境全体の一貫性
Terraform を使用して、異なる環境(開発、ステージング、本番)での設定の一貫性を維持することができます。この方法により、各環境間での設定差異に起因する問題を減少させることが可能です。たとえば、異なる環境で同一の構成を持つ Compute Engine インスタンスを展開するには、環境ごとに異なる設定ファイルを用意する代わりに、変数を使用して一つの設定ファイルを柔軟に適用できます。
variable "project_id" {}
variable "environment" {}
resource "google_compute_instance" "vm_instance" {
name = "vm-${var.environment}"
project = var.project_id
machine_type = "e2-micro"
zone = var.zone
boot_disk {
initialize_params {
image = "projects/debian-cloud/global/images/debian-12-bookworm-v20240110"
size = 10
type = "pd-balanced"
}
}
network_interface {
network = "default"
}
}
この例では、variable を用いてプロジェクト ID と環境名(開発、ステージング、本番)を指定できるようにしています。Terraform コマンド実行時にこれらの変数に具体的な値を与えることで、同一の設定ファイルから異なる環境に適したリソースを展開できます。
複数のリソースの一括管理
Terraform は、各種 Google Cloud リソースを一括して管理する機能を提供します。これにより、インフラストラクチャ全体を テンプレート化し、一貫した方法で管理することが可能になります。
以下は、Compute Engine インスタンスと Cloud Storage バケットを一緒に定義するサンプルコードです。
resource "google_compute_instance" "vm_instance" {
name = "example-instance"
machine_type = "e2-micro"
zone = var.zone
boot_disk {
initialize_params {
image = "projects/debian-cloud/global/images/debian-12-bookworm-v20240110"
size = 10
type = "pd-balanced"
}
}
network_interface {
network = "default"
}
}
resource "google_storage_bucket" "example_bucket" {
name = "example-terraform1"
location = "US"
}
この設定ファイルでは、google_compute_instance リソースと google_storage_bucket リソースを同時に定義しています。Terraform を使用することで、これらのリソースを 一括して作成、更新、削除、管理 することが容易になります。
セキュリティとコンプライアンスの自動化
Terraform を活用することで、セキュリティグループや IAM ポリシーといったセキュリティ関連の設定をコードとして管理し、組織全体で一貫したセキュリティポリシーの適用を自動化することが可能になります。これは、セキュリティとコンプライアンスの要件を維持しやすくするだけでなく、変更管理のプロセスを強化し、誤操作によるリスクを低減します。
セキュリティ設定のバージョン管理
Terraform を用いてセキュリティ設定をバージョン管理することで、変更履歴が明確に記録され、必要に応じて特定のバージョンへのロールバックが容易になります。これにより、セキュリティポリシーの変更が計画的かつ安全に行われます。
例えば、Google Cloud IAM ポリシーの設定を Terraform で管理する場合のサンプルコードは以下のようになります。
resource "google_project_iam_member" "viewer_role" {
project = var.project_id
role = "roles/monitoring.viewer"
member = "user:xxxx@example.com"
}
この例では、特定のユーザーに Google Cloud プロジェクトの roles / monitoring.viewer ロールを割り当てるための IAM 設定を定義しています。google_project_iam_member リソースを使用して、特定のプロジェクトに対して特定のロールを持つメンバーを追加します。
この方法により、プロジェクトレベルのポリシーを細かく管理し、必要な権限のみを指定したユーザーに付与が可能です。
このコードスニペットでは、xxxx@example.com というメールアドレスを持つユーザーに、Google Cloud Monitoring のデータを閲覧する権限を与える roles / monitoring.viewer ロールを割り当てています。
注意: ここで使用されているメールアドレス xxxx@example.com はサンプルであり、実際にこのコードを使用する場合は、Google Cloud に登録されている有効なGoogleアカウントのメールアドレスに置き換える必要があります。
セキュリティグループの管理
Google Cloud のファイアウォールルールや VPC ネットワークなど、セキュリティグループの設定 も Terraform を用いて管理することができます。以下は、特定のタグを持つインスタンスに対して特定のポートへのアクセスを許可するファイアウォールルールを定義する例です。
resource "google_compute_firewall" "allow_ssh" {
name = "allow-ssh"
network = "default"
allow {
protocol = "tcp"
ports = ["22"]
}
source_ranges = ["0.0.0.0/0"]
target_tags = ["ssh-access"]
}
この設定により、ssh-access タグが付与されたインスタンスに対して、全ての IP アドレスからの SSH 接続 (TCP ポート 22) が許可されます。Terraform を用いることで、こうしたセキュリティ関連の設定も柔軟かつ効率的に管理することが可能になります。
Terraform のベストプラクティス
Terraform を最大限に活用するためには、ベストプラクティスの理解と実践が不可欠です。特に、コードの再利用とモジュール化は、効率的なインフラストラクチャ管理において重要な要素です。以下では、これらのプラクティスを具体的な方法とサンプルコードを交えて解説します。
コードの再利用とモジュール化
インフラストラクチャをコード化する際に、コードの再利用性を高めることは非常に重要です。Terraform のモジュールは、特定の機能をカプセル化し、パラメータを介してカスタマイズが可能なコードの集まりです。モジュールを活用することで、以下のメリットが得られます。
- 再利用可能なコンポーネントを作成し、異なるプロジェクトや環境間での共有を容易にする
- コードの管理をより効率的に行う
- コードの重複を排除し、保守性を向上させる
Terraform プロジェクト内でモジュールを適切に組織化することは、これらのメリットを最大限に引き出すポイントです。
例えば、my-project 直下から my-project / modules / vm へのディレクトリ構造の変更は、モジュールの整理と再利用を容易にします。この構造では、modules / vm ディレクトリ内にモジュール固有のファイル( main.tf 、variables.tf 、 outputs.tf など)を配置します。この分離により、モジュールがプロジェクトの他の部分と明確に区別され、モジュールの再利用性が向上します。
以下は、Compute Engine インスタンスを作成するためのサンプルモジュール vm の定義です。このモジュールは、異なるプロジェクトや環境において、異なるインスタンス名、マシンタイプ、ゾーンを指定して VM インスタンスを簡単にデプロイするために使用できます。
# modules/vm/main.tf
variable "instance_name" {
description = "The name of the VM instance"
type = string
}
variable "machine_type" {
description = "The type of the machine"
type = string
}
variable "zone" {
description = "The zone to host the VM"
type = string
}
resource "google_compute_instance" "vm_instance" {
name = var.instance_name
machine_type = var.machine_type
zone = var.zone
boot_disk {
initialize_params {
image = "projects/debian-cloud/global/images/debian-12-bookworm-v20240110"
}
}
network_interface {
network = "default"
}
}
このモジュールを使用することで、必要なパラメータを渡すだけで、コードの重複を避けながら、様々な設定の VM インスタンスを迅速に作成することができます。たとえば、異なる開発環境やテスト環境に対して同じ種類のインスタンスをデプロイする際に、このモジュールを繰り返し利用することができます。
モジュールの組織化と利用
モジュールを modules / vm のような専用のディレクトリに配置することで、プロジェクトの構造が明確になり、管理しやすくなります。この構造を採用することで、モジュールはプロジェクトの他の部分と独立しており、必要に応じて簡単に再利用や共有が可能になります。モジュールを使用する際には、メインの Terraform 設定ファイル ( main.tf ) から以下のようにしてモジュールを呼び出します。
module "vm_instance" {
source = "./modules/vm"
instance_name = "my-instance"
machine_type = "e2-micro"
zone = var.zone
}
この方法で、モジュールはパラメータ化され、異なる環境やプロジェクトで簡単に再利用できるようになります。プロジェクトの規模が大きくなるにつれて、このようなモジュール化のアプローチは、コードの整理、管理、および再利用の効率化に大きく貢献します。
Terraform コードのバージョン管理
インフラストラクチャのコードをバージョン管理システム(例: Git )に格納することは、変更管理におけるベストプラクティスです。
これにより、以下のメリットを得られます。
- 変更の追跡、レビュー、ロールバックが容易になる
- 変更履歴が明確に記録される
- 必要に応じて特定のバージョンへのロールバックが可能になる
Git リポジトリの使用
Terraform コードを Git リポジトリに格納し、変更ごとにコミットします。これにより、変更履歴が明確に記録され、必要に応じて特定のバージョンへのロールバックが可能になります。
プルリクエストを通じたレビュープロセス
新しい変更をメインブランチにマージする前に、プルリクエストを作成し、チームメンバーによるコードレビューを行います。
これにより、以下のメリットを得られます。
- コードの品質を保つ
- エラーのリスクを減少させる
サンプル Git コマンド:
# 変更をコミットする
git add .
git commit -m "Add VM instance module"
# リモートリポジトリにプッシュする
git push origin main
これらのベストプラクティスを実践することで、Terraform を用いたインフラストラクチャの管理をより効率的かつ安全に行うことができます。モジュール化によるコードの再利用性の向上と、バージョン管理システムを通じた変更管理の強化は、大規模なインフラストラクチャの運用において不可欠な要素です。
まとめ
本記事では、Terraform を活用した Google Cloud での使用方法、および基本的な手順について説明しました。これらの知識を活用することで、Terraform を用いて Google Cloud リソースを効率的に管理し、インフラストラクチャを安全かつ確実に構築することができます。ぜひ活用してみてください。
当社センティリオンシステム 大阪事業所はこれまでの多くのクラウド開発を支援してきた知見を活かし、Cloud Build の導入支援や CI/CD パイプラインの設計・構築などクラウドを活用した内製化に取り組まれるお客様を全力でサポートします。
以下のような課題をお持ちの方は、ぜひお気軽にご相談ください。
- Terraform を活用した Google Cloud での使用方法でお困りの方
- Terraform を活用したいが、運用のノウハウがない
- クラウド活用を推進するための開発体制作りが進まない
- 既存資産をどのようにクラウド移行するか検討する知見が不足している
- 内製化するためのクラウド開発スキルを持った人材が不足している
- コスト削減の実現方法に悩んでいる
- SRE を実現したい
貴社の状況に合わせて、体制づくり支援や開発計画支援、クラウド開発スキルアップ支援など、様々な支援メニューを提供しています。
無料相談も可能なため、まずは問い合わせフォームからお気軽にご連絡いただければと思います。