GSP460

概要
このラボでは、Terraform 構成とモジュールを作成して、リソースを含むカスタム ネットワークのデプロイを自動化します。具体的にはファイアウォール ルールと VM インスタンスを持つネットワークを 3 つデプロイします。
目標
- カスタムモード ネットワークの構成を作成する
- ファイアウォール ルールの構成を作成する
- VM インスタンスのモジュールを作成する
- 自動モード ネットワークの構成を作成する
- 構成を作成してデプロイする
- 構成のデプロイを確認する
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
- ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。
左側の [ラボの詳細] ペインには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] ペインでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] ペインでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン
をクリックします。
-
ウィンドウで次の操作を行います。
- Cloud Shell 情報ウィンドウで操作を進めます。
- Cloud Shell が認証情報を使用して Google Cloud API を呼び出すことを承認します。
接続した時点で認証が完了しており、プロジェクトに各自の Project_ID、 が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
- [承認] をクリックします。
出力:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注: Google Cloud における gcloud
ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
タスク 1. Terraform と Cloud Shell を設定する
Terraform を使用すると、クラウド インフラストラクチャを安全かつ予測可能な方法で作成、変更、改善できます。Terraform は、API を宣言的な構成ファイルにコード化するオープンソースのツールです。ファイルはチームメンバー間で共有でき、コードとして処理することや、編集、レビュー、バージョン管理を行うことができます。
Terraform を初期化する
Terraform ではプラグイン ベースのアーキテクチャを使用して、さまざまなインフラストラクチャやサービス プロバイダをサポートしています。「プロバイダ」はそれぞれ独自のバイナリにカプセル化されて、Terraform とは別に配布されます。ここでは Google をプロバイダとして設定し、Terraform を初期化します。
- 次のコマンドを実行して Terraform 構成のディレクトリを作成します。
mkdir tfnet
-
Cloud Shell で [エディタを開く] をクリックして、Cloud Shell エディタを開きます。必要に応じて、[新しいウィンドウで開く] をクリックします。
-
コードエディタの左側にあるペインで、[tfnet] フォルダを開きます。
-
新しいファイルを [tfnet] フォルダ内に作成するために、[File] > [New File] をクリックします。
-
新しいファイルに「provider.tf」と名前を付けてから開きます。
-
次のコードを provider.tf にコピーします。
provider "google" {}
-
次のコマンドを実行して Terraform を初期化します。
cd tfnet
terraform init
出力は次のようになります。
* provider.google: version = "~> 3.63"
Terraform has been successfully initialized!
これで Cloud Shell で Terraform を操作する準備が整いました。
タスク 2. managementnet とそのリソースを作成する
カスタムモード ネットワークの managementnet を、ファイアウォール ルールおよび VM インスタンスとあわせて作成します(managementnet-us-vm)。
managementnet を構成する
新しい構成を作成して managementnet を定義します。
- 新しいファイルを作成するには、[File] > [New File] をクリックします。
- 新しいファイルに「managementnet.tf」と名前を付けてから開きます。
- 次の基本コードを managementnet.tf にコピーします。
# managementnet ネットワークを作成する
resource [RESOURCE_TYPE] "managementnet" {
name = [RESOURCE_NAME]
# リソース プロパティをここに含める
}
この基本型は、あらゆる Google Cloud リソースの作成に使用できます。name にはリソース名、type には作成する Google Cloud のリソースを指定します。プロパティも定義できますが、リソースによっては省略可能です。
-
managementnet.tf で
[RESOURCE_TYPE]
を "google_compute_network"
に置き換えます。
注: この google_compute_network リソースは VPC ネットワークです。利用可能なリソースは、Google Cloud Provider のドキュメントに記載されています。この特定リソースの詳細については、Terraform のドキュメントをご覧ください。
- managementnet.tf で、
[RESOURCE_NAME]
を "managementnet"
に置き換えます。
-
managementnet.tf に次のプロパティを追加します。
auto_create_subnetworks = "false"
自動モード ネットワークとは異なり、カスタムモード ネットワークは各リージョンのサブネットワークを自動で作成しません。そのため auto_create_subnetworks を false
に設定します。
-
managementnet.tf は次のようになります。
# managementnet ネットワークを作成する
resource "google_compute_network" "managementnet" {
name = "managementnet"
auto_create_subnetworks = "false"
}
- [File] > [Save] をクリックして、managementnet.tf を保存します。
サブネットを managementnet に追加する
managementsubnet-us を VPC ネットワークに追加します。
- 次のリソースを managementnet.tf に追加します。
# managementsubnet-us サブネットワークを作成する
resource "google_compute_subnetwork" "managementsubnet-us" {
name = "managementsubnet-us"
region = "{{{ project_0.default_region | Region 1 }}}"
network = google_compute_network.managementnet.self_link
ip_cidr_range = "10.130.0.0/20"
}
注: この google_compute_subnetwork リソースはサブネットです。managementsubnet-us に対して名前、リージョン、VPC ネットワーク、IP CIDR 範囲を指定します。この特定リソースの詳細については、Terraform のドキュメントをご覧ください。
- [File] > [Save] をクリックして、managementnet.tf を保存します。
ファイアウォール ルールを構成する
managementnet で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを定義します。
-
managementnet.tf に次の基本コードを追加します。
# managementnet で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを追加する
resource [RESOURCE_TYPE] "managementnet-allow-http-ssh-rdp-icmp" {
name = [RESOURCE_NAME]
source_ranges = [
"0.0.0.0/0"
]
# リソース プロパティをここに含める
}
-
managementnet.tf で
[RESOURCE_TYPE]
を "google_compute_firewall"
に置き換えます。
注: この google_compute_firewall リソースはファイアウォール ルールです。この特定リソースの詳細については、Terraform のドキュメントをご覧ください。
-
managementnet.tf で、
[RESOURCE_NAME]
を "managementnet-allow-http-ssh-rdp-icmp"
に置き換えます。
-
managementnet.tf に次のプロパティを追加します。
network = google_compute_network.managementnet.self_link
注: ファイアウォール ルールはネットワークに依存するため、google_compute_network.managementnet.self_link 参照を使用すると、Terraform ではこれらのリソースが依存順序に沿って解決されます。この場合、ネットワークはファイアウォール ルールより先に作成されます。
-
managementnet.tf に次のプロパティを追加します。
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
この allow ルールのリストでは、許可されるプロトコルとポートを指定します。
- プロパティを追加すると、managementnet.tf の内容は次のようになります。
# managementnet で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを作成する
resource "google_compute_firewall" "managementnet_allow_http_ssh_rdp_icmp" {
name = "managementnet-allow-http-ssh-rdp-icmp"
source_ranges = [
"0.0.0.0/0"
]
network = google_compute_network.managementnet.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
}
- [File] > [Save] をクリックして、managementnet.tf を保存します。
VM インスタンスを構成する
VM インスタンス モジュールを作成して VM インスタンスを定義します。モジュールとは、フォルダ内に作成された再利用可能な構成のことです。このモジュールは、このラボのすべての VM インスタンスで使用します。
-
tfnet で新しいフォルダを作成するには、[tfnet] フォルダを選択して [File] > [New Folder] をクリックします。
- 新しいフォルダの名前を「instance」とします。
- 新しいファイルを instance 内に作成するには、instance フォルダを選択してから、[File] > [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 インスタンスに使用するため、入力変数としてインスタンス名を定義します。これによって、managementnet.tf からの変数の名前の制御が可能になります。入力変数の詳細については、入力変数の定義に関するドキュメントを参照してください。
-
main.tf に次のプロパティを追加します。
zone = var.instance_zone
machine_type = var.instance_type
これらのプロパティでは、インスタンスのゾーンとマシンタイプを入力変数として定義しています。
-
main.tf に次のプロパティを追加します。
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
このプロパティでは、Debian 11 OS イメージを使用するようにブートディスクを定義しています。4 つすべての VM インスタンスで同じイメージを使用するため、モジュール内にこのプロパティをハードコードしてもかまいません。
-
main.tf に次のプロパティを追加します。
network_interface {
subnetwork = var.instance_subnetwork
access_config {
# インスタンスに 1 対 1 で NAT IP を割り振る
}
}
このプロパティではネットワーク インターフェースを定義するために、入力変数としてサブネットワーク名、そしてアクセス構成を指定します。アクセス構成を空のままにすると、エフェメラル外部 IP アドレスが割り当てられます。詳細については、Terraform のドキュメントをご覧ください。
-
main.tf の先頭に 4 つの入力変数を定義し、main.tf が次のように記述されていることを確認します(中括弧
{}
の欠落に注意)。
variable "instance_name" {}
variable "instance_zone" {}
variable "instance_type" {
default = "e2-standard-2"
}
variable "instance_subnetwork" {}
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-11"
}
}
network_interface {
subnetwork = var.instance_subnetwork
access_config {
# インスタンスに 1 対 1 で NAT IP を割り振る
}
}
}
instance_type にデフォルト値を設定することで、この変数の指定をオプションとします。instance_name、instance_zone、instance_subnetwork は必須です。これらは managementnet.tf で定義します。
- [File] > [Save] をクリックして main.tf を保存します。
- 次の VM インスタンスを managementnet.tf に追加します。
# managementnet-us-vm インスタンスを追加する
module "managementnet-us-vm" {
source = "./instance"
instance_name = "managementnet-us-vm"
instance_zone = "{{{project_0.default_zone | ZONE 1}}}"
instance_subnetwork = google_compute_subnetwork.managementsubnet-us.self_link
}
このリソースは instance フォルダ内のモジュールを利用し、名前、ゾーン、ネットワークを入力値として指定しています。このインスタンスは VPC ネットワークに依存するため、google_compute_subnetwork.managementsubnet-us.self_link 参照を使用すると、Terraform ではこれらのリソースが依存順序に沿って解決されます。この場合、サブネットはインスタンスより先に作成されます。
注: Terraform モジュールを作成するメリットは、さまざまな構成でモジュールを再利用できることです。独自のモジュールを作成する代わりに Terraform モジュール レジストリの既存のモジュールを活用することもできます。
- [File] > [Save] をクリックして、managementnet.tf を保存します。
managementnet とそのリソースを作成する
ここで、managementnet 構成を適用します。
- 次のコマンドを実行して Terraform 構成ファイルを正規の形式とスタイルに書き換えます。
terraform fmt
注: エラーが表示された場合は、前のステップに戻って構成がラボの説明と一致しているかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、以下の完成された構成を参考にしてください。
managementnet.tf
main.tf
provider.tf
- 次のコマンドを実行して Terraform を初期化します。
terraform init
出力は次のようになります。
Initializing the backend...
...
* provider.google: version = "~> 3.63"
Terraform has been successfully initialized!
注: エラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
- 次のコマンドを実行して実行プランを作成します。
terraform plan
出力は次のようになります。
...
Plan: 4 to add, 0 to change, 0 to destroy.
...
Terraform により以下の 4 つのリソースを追加する必要があると判断されました。
名前 |
説明 |
managementnet |
VPC ネットワーク |
managementsubnet-us |
における managementnet のサブネット |
managementnet_allow_http_ssh_rdp_icmp |
HTTP、SSH、RDP、ICMP を許可するファイアウォール ルール |
managementnet-us-vm |
内の VM インスタンス |
- 次のコマンドを実行して目的の変更を適用します。
terraform apply
- 次のように入力して計画したアクションを確定します。
yes
出力は次のようになります。
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
なお、VPC ネットワークを作成するとファイアウォール ルールとサブネットも作成されます。VM インスタンスはサブネットが作成された後で作成されますが、これは、ファイアウォール ルールとサブネットがネットワークに依存し、VM インスタンスが self_link
参照を介してサブネットに依存するためです。
注: 実行中にエラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
managementnet とそのリソースを確認する
Cloud コンソールで、リソースが作成されていることを確認します。
- Cloud コンソールで、ナビゲーション メニュー > [VPC ネットワーク] > [VPC ネットワーク] の順に選択します。
-
managementnet VPC ネットワークをサブネットワークとあわせて表示します。
- 左側のペインで、[ファイアウォール] をクリックします。
- 作成した VPC ネットワークに対する managementnet_allow_http_ssh_rdp_icmp ファイアウォール ルールを表示します。
-
ナビゲーション メニュー > [Compute Engine] > [VM インスタンス] の順に選択します。
-
managementnet-us-vm インスタンスをメモしておきます。
- Cloud Shell に戻ります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
managementnet とそのリソースを作成する
タスク 3. privatenet とそのリソースを作成する
カスタムモード ネットワーク privatenet をファイアウォール ルールおよび VM インスタンスとあわせて作成します(privatenet-us-vm)。
privatenet を構成する
新しい構成を作成して privatenet を定義します。
- 新しいファイルを [tfnet] フォルダ内に作成するために、[File] > [New File] をクリックします。
- 新しいファイルに「privatenet.tf」と名前を付けてから開きます。
Cloud Shell には以下のようなフォルダ構造が表示されます。

-
privatenet.tf に次のコードをコピーして VPC ネットワークを追加します。
# privatenet ネットワークを作成する
resource "google_compute_network" "privatenet" {
name = "privatenet"
auto_create_subnetworks = false
}
- privatesubnet-us サブネット リソースを privatenet.tf に追加します。
# privatesubnet-us サブネットワークを作成する
resource "google_compute_subnetwork" "privatesubnet-us" {
name = "privatesubnet-us"
region = "{{{project_0.default_region| REGION 1}}}"
network = google_compute_network.privatenet.self_link
ip_cidr_range = "172.16.0.0/24"
}
- privatesubnet-second-subnet サブネット リソースを privatenet.tf に追加します。
# privatesubnet-second-subnet サブネットワークを作成する
resource "google_compute_subnetwork" "privatesubnet-second-subnet" {
name = "privatesubnet-second-subnet"
region = "{{{project_0.default_region_2 | REGION 2}}}"
network = google_compute_network.privatenet.self_link
ip_cidr_range = "172.20.0.0/24"
}
- [File] > [Save] をクリックして、privatenet.tf を保存します。
ファイアウォール ルールを構成する
ファイアウォール ルールを定義して、privatenet 上の HTTP、SSH、および RDP トラフィックを許可します。
- ファイアウォール リソースを privatenet.tf に追加します。
# privatenet で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを作成する
resource "google_compute_firewall" "privatenet-allow-http-ssh-rdp-icmp" {
name = "privatenet-allow-http-ssh-rdp-icmp"
source_ranges = [
"0.0.0.0/0"
]
network = google_compute_network.privatenet.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
}
注: 前のファイアウォール ルールとの違いは適用先となる VPC ネットワークのみであるため、ファイアウォール ルール用のモジュールを作成することもできます。
- [File] > [Save] をクリックして、privatenet.tf を保存します。
VM インスタンスを構成する
インスタンス モジュールを使用して privatenet-us-vm を構成します。
- VM インスタンス リソースを privatenet.tf に追加します。
# privatenet-us-vm インスタンスを追加する
module "privatenet-us-vm" {
source = "./instance"
instance_name = "privatenet-us-vm"
instance_zone = "{{{project_0.default_zone | ZONE 1}}}"
instance_subnetwork = google_compute_subnetwork.privatesubnet-us.self_link
}
- [File] > [Save] をクリックして、privatenet.tf を保存します。
privatenet とそのリソースを作成する
ここで、privatenet 構成を適用します。
- 次のコマンドを実行して Terraform 構成ファイルを正規の形式とスタイルに書き換えます。
terraform fmt
注: エラーが表示された場合は、前のステップに戻って構成がラボの説明と一致しているかどうかを確認してください。構成の問題をトラブルシューティングできない場合は以下の完成された構成を参考にしてください。
privatenet.tf
managementnet.tf
main.tf
provider.tf
- 次のコマンドを実行して Terraform を初期化します。
terraform init
出力は次のようになります。
Initializing the backend...
...
* provider.google: version = "~> 3.63"
Terraform has been successfully initialized!
注: エラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
- 次のコマンドを実行して実行プランを作成します。
terraform plan
出力は次のようになります。
...
Plan: 5 to add, 0 to change, 0 to destroy.
...
Terraform により以下の 5 つのリソースを追加する必要があると判断されました。
名前 |
説明 |
privatenet |
VPC ネットワーク |
privatesubnet-us |
における privatenet のサブネット |
privatesubnet-second-subnet |
における privatenet のサブネット |
privatenet-allow-http-ssh-rdp-icmp |
HTTP、SSH、RDP、ICMP を許可するファイアウォール ルール |
privatenet-us-vm |
内の VM インスタンス |
- 次のコマンドを実行して目的の変更を適用します。
terraform apply
- 次のように入力して計画したアクションを確定します。
yes
出力は次のようになります。
...
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
注: 実行中にエラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
privatenet およびそのリソースを確認する
Cloud コンソールで、リソースが作成されていることを確認します。
- Cloud コンソールで、ナビゲーション メニュー > [VPC ネットワーク] > [VPC ネットワーク] の順に選択します。
-
privatenet VPC ネットワークをサブネットワークとあわせて表示します。
- 左側のペインで [VPC ネットワーク] > [ファイアウォール] をクリックします。
- 作成した VPC ネットワークに対する privatenet_allow_http_ssh_rdp_icmp ファイアウォール ルールを表示します。
-
ナビゲーション メニュー > [Compute Engine] > [VM インスタンス] の順に選択します。
-
privatenet-us-vm の内部 IP アドレスをメモしておきます。
-
managementnet-us-vm で [SSH] をクリックしてターミナルを起動し、接続します。
-
privatenet-us-vm の内部 IP アドレスへの接続性をテストするには、SSH ターミナルで次のコマンドを実行します(privatenet-us-vm の内部 IP アドレスを先ほどメモした値に置き換えます)。
ping -c 3 <privatenet-us-vm の内部 IP を入力>
注: VM インスタンスはそれぞれ別個の VPC ネットワーク上にあるため、この設定では正常に動作しません。
- Cloud Shell に戻ります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
privatenet とそのリソースを作成する
タスク 4. mynetwork とそのリソースを作成する
自動モード ネットワークの mynetwork を、ファイアウォール ルールと 2 つの VM インスタンス(mynet_us_vm と mynet_second_vm)とともに作成します。
mynetwork を構成する
新たに構成を作成し、mynetwork を定義します。
- 新しいファイルを [tfnet] フォルダ内に作成するために、[File] > [New File] をクリックします。
- 新しいファイルに「mynetwork.tf」と名前を付けてから開きます。
Cloud Shell には以下のようなフォルダ構造が表示されます。

- 次のコードを mynetwork.tf にコピーします。
# mynetwork ネットワークを作成する
resource "google_compute_network" "mynetwork" {
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 トラフィックを許可します。
- ファイアウォール リソースを mynetwork.tf に追加します。
# managementnet で HTTP、SSH、RDP、ICMP のトラフィックを許可するファイアウォール ルールを作成する
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
source_ranges = [
"0.0.0.0/0"
]
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
}
- [File] > [Save] をクリックして mynetwork.tf を保存します。
VM インスタンスを構成する
インスタンス モジュールを使用して mynetwork-us-vm および mynetwork-second-vm を構成します。
-
mynetwork.tf に次の VM インスタンスを追加します。
# mynet-us-vm インスタンスを作成する
module "mynet-us-vm" {
source = "./instance"
instance_name = "mynet-us-vm"
instance_zone = "{{{project_0.default_zone | ZONE 1}}}"
instance_subnetwork = google_compute_network.mynetwork.self_link
}
# mynet-second-vm インスタンスを作成する
module "mynet-second-vm" {
source = "./instance"
instance_name = "mynet-second-vm"
instance_zone = "{{{project_0.default_zone_2 | ZONE 2}}}"
instance_subnetwork = google_compute_network.mynetwork.self_link
}
- [File] > [Save] をクリックして mynetwork.tf を保存します。
mynetwork とそのリソースを作成する
ここで、mynetwork の構成を適用します。
- 次のコマンドを実行して Terraform 構成ファイルを正規の形式とスタイルに書き換えます。
terraform fmt
注: エラーが表示された場合は、前のステップに戻って構成がラボの説明と一致しているかどうかを確認してください。構成の問題をトラブルシューティングできない場合は以下の完成された構成を参考にしてください。
privatenet.tf
managementnet.tf
mynetwork.tf
main.tf
provider.tf
- 次のコマンドを実行して Terraform を初期化します。
terraform init
出力は次のようになります。
Initializing the backend...
...
* provider.google: version = "~> 3.63"
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-us-vm |
内の VM インスタンス |
mynet-second-vm |
内の VM インスタンス |
- 次のコマンドを実行して目的の変更を適用します。
terraform apply
- 次のように入力して計画したアクションを確定します。
yes
出力は次のようになります。
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
注: 実行中にエラーが表示された場合は、前のステップに戻ってフォルダとファイルの構造が正しいかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、前述したリンクの完成された構成を参考にしてください。問題を修正したら、前のコマンドを再実行してください。
mynetwork とそのリソースを確認する
Cloud コンソールで、リソースが作成されていることを確認します。
- Cloud コンソールで、ナビゲーション メニュー > [VPC ネットワーク] > [VPC ネットワーク] の順に選択します。
-
mynetwork VPC ネットワークをサブネットワークとあわせて表示します。
- 左側のペインで、[ファイアウォール] をクリックします。
- 作成した VPC ネットワークに対する mynetwork-allow-http-ssh-rdp-icmp ファイアウォール ルールを表示します。
-
ナビゲーション メニュー > [Compute Engine] > [VM インスタンス] の順に選択します。
-
mynet-us-vm インスタンスと mynet-second-vm インスタンスを表示します。
-
mynet-second-vm の内部 IP アドレスをメモしておきます。
-
mynet-us-vm で [SSH] をクリックしてターミナルを起動し、接続します。
- SSH ターミナルで次のコマンドを実行して、mynet-second-vm の内部 IP アドレスに接続されているかどうかをテストします(mynet-second-vm の内部 IP アドレスを先ほどメモした値に置き換えます)。
ping -c 3 <mynet-second-vm の内部 IP を入力>
注: 両方の VM インスタンスが同じネットワーク上にあり ICMP トラフィックを許可しているため、これで正常に動作するはずです。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
mynetwork とそのリソースを作成する
お疲れさまでした
これでセルフペース ラボ「Terraform を使用してネットワークのデプロイを自動化する」は終了です。
このラボでは、カスタム ネットワークのデプロイを自動化するために Terraform 構成およびモジュールを作成しました。構成が変更されると、Terraform は何が変更されたかを判断してインクリメンタルな実行プランを作成できるため、構成全体を段階的に構築できます。
インスタンス モジュールを使用すると、複数のリソースに対して同じリソース構成を再利用しながら、プロパティを入力変数として扱うことができます。作成した構成とモジュールは、今後のデプロイの出発点として活用できます。
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。クラスでは、技術スキルとベスト プラクティスを迅速に身につけ、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 1 月 19 日
ラボの最終テスト日: 2024 年 1 月 19 日
Copyright 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。