概要
Terraform を使用すると、インフラストラクチャを安全かつ想定どおりに作成、変更、改善できます。Terraform は、API を宣言的な構成ファイルにコード化するオープンソースのツールです。ファイルは、チームメンバー間で共有したり、コードとして扱ったりできます。また、編集、レビュー、バージョン管理を行うこともできます。
このラボでは、Terraform 構成とモジュールを作成して、Google Cloud インフラストラクチャのデプロイを自動化します。具体的には、以下の図に示すようにファイアウォール ルールと 2 つのインスタンスを備えた自動モード ネットワークをデプロイします。

目標
このラボでは、次のタスクの実行方法について学びます。
- 自動モード ネットワークの構成を作成する
- ファイアウォール ルールの構成を作成する
- インスタンスのモジュールを作成する
- 構成を作成してデプロイする
- 構成のデプロイを確認する
設定
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックします。
タスク 1. Terraform と Cloud Shell を設定する
このタスクでは、Terraform を使用するように Cloud Shell 環境を構成します。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
Terraform をインストールする
Terraform は Cloud Shell にプリインストールされていません。Terraform CLI をインストールし、Cloud Shell セッションをまたいで永続化するように構成する必要があります。
- HashiCorp リポジトリを構成して Terraform をインストールし、このインストールが今後のセッションでも永続化されるようにするために、Cloud Shell ターミナルで次のコマンドを実行します。
cat <<'EOF' > ~/.customize_environment
# HashiCorp リポジトリを設定して Terraform をインストールする
wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install -y terraform
EOF
bash ~/.customize_environment
- Terraform が正しくインストールされていることを確認するために、次のコマンドを実行します。
terraform --version
出力には、インストールされているバージョン(v1.5.7 以降)が表示されます。
Terraform v1.9.0
構成ファイルを作成する
Terraform をインストールしたので、Terraform 構成のディレクトリとファイルを作成します。
- Terraform 構成用のディレクトリを作成するには、次のコマンドを実行します。
mkdir tfinfra
- Cloud Shell で [エディタを開く](
)をクリックします。
注: 「サードパーティの Cookie が無効になっているためコードエディタを読み込めませんでした」というメッセージが表示された場合は、[新しいウィンドウで開く] をクリックしてください。新しいタブでコードエディタが開きます。元のタブに戻って [ターミナルを開く] をクリックした後、コードエディタのタブに戻ります。このラボでは、Cloud Shell のターミナルに繰り返し戻る必要があります。
- コードエディタの左側のペインで、tfinfra フォルダを開きます。
Terraform を初期化する
Terraform はプラグイン ベースのアーキテクチャを使用して、さまざまなインフラストラクチャやサービス プロバイダをサポートしています。それぞれの「プロバイダ」は、Terraform 自体とは別に配布される、独自にカプセル化されたバイナリです。ここでは Google をプロバイダとして設定し、Terraform を初期化します。
- 新しいファイルを tfinfra フォルダ内に作成するために、tfinfra フォルダを右クリックし
、[New File] をクリックします。
- 新しいファイルに「provider.tf」と名前を付けてから開きます。
- 次のコードを
provider.tf にコピーします。
provider "google" {}
-
[File] > [Save] をクリックして provider.tf を保存します。
-
次のコマンドを実行して、Terraform を初期化します。
cd tfinfra
terraform init
これで Cloud Shell で Terraform を操作する準備が整いました。
タスク 2. mynetwork とそのリソースを作成する
このタスクでは、自動モード ネットワークの mynetwork を、ファイアウォール ルールと 2 つの VM インスタンス(mynet_vm_1 と mynet_vm_2)とともに作成します。
mynetwork を構成する
新たに構成を作成し、mynetwork を定義します。
-
tfinfra 内に新しいファイルを作成するために
、tfinfra フォルダを右クリックし、[New File] をクリックします。
- 新しいファイルに「mynetwork.tf」と名前を付けてから開きます。
- 次の基本コードを
mynetwork.tf にコピーします。
# mynetwork ネットワークを作成する
resource [RESOURCE_TYPE] "mynetwork" {
name = [RESOURCE_NAME]
# リソース プロパティをここに含める
}
この基本型は、あらゆる Google Cloud リソースの作成に使用できます。name にはリソース名、type には作成する Google Cloud のリソースを指定します。プロパティも定義できますが、リソースによっては省略可能です。
-
mynetwork.tf で [RESOURCE_TYPE] を "google_compute_network"(引用符付き)に置き換えます。
注: この google_compute_network リソースは VPC ネットワークです。利用可能なリソースは、Google Cloud プロバイダのドキュメントに記載されています。この特定のリソースについて詳しくは、Terraform のドキュメントをご覧ください。
-
mynetwork.tf で [RESOURCE_NAME] を "mynetwork"(引用符付き)に置き換えます。
-
mynetwork.tf に次のプロパティを追加します。
auto_create_subnetworks = true
文字どおり、自動モード ネットワークではサブネットワークが各リージョンに自動的に作成されます。そのため auto_create_subnetworks を true に設定します。
-
mynetwork.tf ファイルの内容が次のようになっていることを確認します。
# mynetwork ネットワークを作成する
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# リソース プロパティをここに含める
auto_create_subnetworks = true
}
- [File] > [Save] をクリックして
mynetwork.tf を保存します。
ファイアウォール ルールを構成する
mynetwork で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを定義します。
-
mynetwork.tf に次の基本コードを追加します。
# mynetwork で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを追加する
resource [RESOURCE_TYPE] "mynetwork-allow-http-ssh-rdp-icmp" {
name = [RESOURCE_NAME]
# リソース プロパティをここに含める
}
-
mynetwork.tf で [RESOURCE_TYPE] を "google_compute_firewall"(引用符付き)に置き換えます。
注: この google_compute_firewall リソースはファイアウォール ルールです。この特定のリソースについて詳しくは、Terraform のドキュメントをご覧ください。
-
mynetwork.tf で [RESOURCE_NAME] を "mynetwork-allow-http-ssh-rdp-icmp"(引用符付き)に置き換えます。
-
mynetwork.tf に次のプロパティを追加します。
network = google_compute_network.mynetwork.self_link
注: ファイアウォール ルールはネットワークに依存するため、google_compute_network.mynetwork.self_link 参照を使用すると、Terraform ではこれらのリソースが依存順序に沿って解決されます。この場合、ネットワークはファイアウォール ルールより先に作成されます。
-
mynetwork.tf に次のプロパティを追加します。
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
この allow ルールのリストでは、許可されるプロトコルとポートを指定します。
-
mynetwork.tf ファイルの内容が次のようになっていることを確認します。
# mynetwork ネットワークを作成する
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# リソース プロパティをここに含める
auto_create_subnetworks = "true"
}
# mynetwork で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを追加する
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# リソース プロパティをここに含める
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
}
- [File] > [Save] をクリックして mynetwork.tf を保存します。
VM インスタンスを構成する
VM インスタンス モジュールを作成して、VM インスタンスを定義します。モジュールとは、フォルダ内に作成された再利用可能な構成のことです。このモジュールは、このラボの両方の VM インスタンスで使用します。
- 新しいフォルダを tfinfra 内に作成するには、tfinfra フォルダを選択してから、[File] > [New Folder] をクリックします。
- 新しいフォルダの名前を「instance」とします。
- 新しいファイルを instance 内に作成するために、
instance フォルダを右クリックし、[New File] をクリックします。
- 新しいファイルに「main.tf」と名前を付けてから開きます。
Cloud Shell には以下のようなフォルダ構造が表示されます。

- 次の基本コードを main.tf にコピーします。
resource [RESOURCE_TYPE] "vm_instance" {
name = [RESOURCE_NAME]
# リソース プロパティをここに含める
}
-
main.tf で [RESOURCE_TYPE] を "google_compute_instance"(引用符付き)に置き換えます。
注: この google_compute_instance リソースは Compute Engine インスタンスです。この特定のリソースについて詳しくは、Terraform のドキュメントをご覧ください。
-
main.tf で [RESOURCE_NAME] を "${var.instance_name}"(引用符付き)に置き換えます。
このモジュールは両方の VM インスタンスに使用するため、入力変数としてインスタンス名を定義します。これにより、mynetwork.tf の変数の名前を制御できます。入力変数について詳しくは、Terraform の入力変数の定義に関するガイドをご覧ください。
-
main.tf に次のプロパティを追加します。
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
これらのプロパティでは、インスタンスのゾーンとマシンタイプを入力変数として定義しています。
-
main.tf に次のプロパティを追加します。
boot_disk {
initialize_params {
image = "debian-cloud/debian-12"
}
}
このプロパティでは、Debian 12 OS イメージを使用するようにブートディスクを定義しています。両方の VM インスタンスで同じイメージを使用するため、モジュール内にこのプロパティをハードコードしてもかまいません。
-
main.tf に次のプロパティを追加します。
network_interface {
network = "${var.instance_network}"
access_config {
# インスタンスに 1 対 1 で NAT IP を割り振る
}
}
このプロパティは入力変数としてネットワーク名を指定し、アクセス構成を指定して、ネットワーク インターフェースを定義します。アクセス構成を空のままにしておくと、エフェメラル外部 IP アドレス(このラボで必要)になります。内部 IP アドレスのみを割り当てたインスタンスを作成するには、access_config セクションを削除してください。詳細については、Terraform のドキュメントをご覧ください。
-
main.tf の内容が次のようになっていることを確認します(括弧 {} の欠落に注意)。
resource "google_compute_instance" "vm_instance" {
name = "${var.instance_name}"
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
boot_disk {
initialize_params {
image = "debian-cloud/debian-12"
}
}
network_interface {
network = "${var.instance_network}"
access_config {
# インスタンスに 1 対 1 で NAT IP を割り振る
}
}
}
- [File] > [Save] をクリックして main.tf を保存します。
- 新しいファイルを instance 内に作成するために、
instance フォルダを右クリックし、[New File] をクリックします。
- 新しいファイルに「variables.tf」と名前を付けてから開きます。
- 次の 4 つの入力変数を
variables.tf 内に定義します。
variable "instance_name" {}
variable "instance_zone" {}
variable "instance_type" {
default = "e2-micro"
}
variable "instance_network" {}
instance_type にデフォルト値を設定することで、この変数の指定をオプションとします。instance_name、instance_zone、instance_network は必須です。これらは mynetwork.tf で定義します。
- [File] > [Save] をクリックして variables.tf を保存します。
-
mynetwork.tf に次の VM インスタンスを追加します。
# mynet-vm-1 インスタンスを作成する
module "mynet-vm-1" {
source = "./instance"
instance_name = "mynet-vm-1"
instance_zone = "{{{project_0.default_zone|Zone}}}"
instance_network = google_compute_network.mynetwork.self_link
}
# mynet-vm-2 インスタンスを作成する
module "mynet-vm-2" {
source = "./instance"
instance_name = "mynet-vm-2"
instance_zone = "{{{project_0.default_zone_2|Zone 2}}}"
instance_network = google_compute_network.mynetwork.self_link
}
これらのリソースは instance フォルダ内のモジュールを利用し、名前、ゾーン、ネットワークを入力値として指定しています。これらのインスタンスは VPC ネットワークに依存するため、google_compute_network.mynetwork.self_link 参照を使用すると、Terraform ではこれらのリソースが依存順序に沿って解決されます。この場合は、インスタンスの前にネットワークが作成されます。
注: Terraform モジュールを作成するメリットは、さまざまな構成でモジュールを再利用できることです。独自のモジュールを作成する代わりに Terraform モジュール レジストリの既存のモジュールを活用することもできます。
-
[File] > [Save] をクリックして mynetwork.tf を保存します。
-
mynetwork.tf の内容が次のようになっていることを確認します(括弧 {} の欠落に注意)。
# mynetwork ネットワークを作成する
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# リソース プロパティをここに含める
auto_create_subnetworks = "true"
}
# mynetwork で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを追加する
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# リソース プロパティをここに含める
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
}
# mynet-vm-1 インスタンスを作成する
module "mynet-vm-1" {
source = "./instance"
instance_name = "mynet-vm-1"
instance_zone = "{{{project_0.default_zone|Zone}}}"
instance_network = google_compute_network.mynetwork.self_link
}
# mynet-vm-2 インスタンスを作成する
module "mynet-vm-2" {
source = "./instance"
instance_name = "mynet-vm-2"
instance_zone = "{{{project_0.default_zone_2|Zone 2}}}"
instance_network = google_compute_network.mynetwork.self_link
}
mynetwork とそのリソースを作成する
ここで、mynetwork の構成を適用します。
- Terraform 構成ファイルを正規の形式とスタイルに書き換えるには、次のコマンドを実行します。
terraform fmt
出力は次のようになります。
mynetwork.tf
注: エラーが表示された場合は、前のステップに戻って構成がラボの説明と一致しているかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、完成された構成をダウンロードして内容を確認してください。
- 次のコマンドを実行して、Terraform を初期化します。
terraform init
出力は次のようになります。
Initializing modules...
- mynet-vm-2 in instance
- mynet-vm-2 in instance
...
Terraform has been successfully initialized!
注: エラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
- 実行プランを作成するには、次のコマンドを実行します。
terraform plan
出力は次のようになります。
...
Plan: 4 to add, 0 to change, 0 to destroy.
...
Terraform により以下の 4 つのリソースを追加する必要があると判断されました。
| 名前 |
説明 |
| mynetwork |
VPC ネットワーク |
| mynetwork-allow-http-ssh-rdp-icmp |
HTTP、SSH、RDP、ICMP を許可するファイアウォール ルール |
| mynet-vm-2 |
内の VM インスタンス |
| mynet-vm-2 |
内の VM インスタンス |
- 次のコマンドを実行して、必要な変更を適用します。
terraform apply
- 予定されたアクションを確定するには、次のように入力します。
yes
出力は次のようになります。
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
mynetwork とそのリソースを作成する
注: 実行中にエラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
タスク 3. デプロイを確認する
Google Cloud コンソールで、リソースが作成されたことを確認します。
Google Cloud コンソールで Virtual Private Cloud(VPC)ネットワークを確認する
- Google Cloud コンソールのナビゲーション メニュー(
)で、[VPC ネットワーク] > [VPC ネットワーク] をクリックします。
-
mynetwork VPC ネットワークと各リージョンのサブネットワークを確認します。
-
ナビゲーション メニューで、[VPC ネットワーク] > [ファイアウォール] をクリックします。
- ファイアウォール ルールを [ネットワーク] の値で並べ替えます。
-
mynetwork の mynetwork-allow-http-ssh-rdp-icmp ファイアウォール ルールを確認します。
Google Cloud コンソールで VM インスタンスを確認する
-
ナビゲーション メニュー(
)で、[Compute Engine] > [VM インスタンス] をクリックします。
-
mynet-vm-1 インスタンスと mynet-vm-2 インスタンスを表示します。
-
mynet-vm-2 の内部 IP アドレスをメモしておきます。
-
mynet-vm-1 で [SSH] をクリックし、ターミナルを起動して接続します。
- SSH ターミナルで次のコマンドを実行して、mynet-vm-2 の内部 IP アドレスに接続されているかどうかをテストします(mynet-vm-2 の内部 IP アドレスを、先ほどメモした値に置き換えます)。
ping -c 3 <mynet-vm-2 の内部 IP をここに入力>
注: どちらの VM インスタンスも同じネットワークにあり、ファイアウォール ルールで ICMP トラフィックが許可されているため、ping は成功するはずです。
タスク 4. まとめ
このラボでは、Terraform 構成とモジュールを作成して、Google Cloud インフラストラクチャのデプロイを自動化しました。Terraform では構成の変更に応じてインクリメンタルな実行プランの作成が可能であり、構成全体を段階的に構築できます。
インスタンス モジュールを使用すると、複数のリソースに対して同じリソース構成を再利用しながら、プロパティを入力変数として扱うことができます。作成した構成とモジュールは、今後デプロイするときに活用できます。
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Skills から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2026 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。