arrow_back

Terraform でリソース依存関係を作成する

ログイン 参加
700 以上のラボとコースにアクセス

Terraform でリソース依存関係を作成する

ラボ 1時間 30分 universal_currency_alt クレジット: 5 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

このラボでは、デフォルト ネットワークに 2 つの VM を作成します。変数を使用して VM の属性を実行時に定義し、出力値を使用していくつかのリソース属性を出力します。

次に、1 つ目の VM に静的 IP アドレスを追加して、暗黙的な依存関係を Terraform がどう処理するかを確認します。その後、VM に対する明示的な依存関係を宣言して GCS バケットを作成し、明示的な依存関係を Terraform がどう処理するかを確認します。

目標

このラボでは、次のタスクの実行方法について学びます。

  • 変数と出力値を使用する
  • 暗黙的な依存関係を確認する
  • リソースの明示的な依存関係を作成する

タスク 1. Cloud コンソールにログイン

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google Cloud コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。

    ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。

    {{{user_0.username | "Username"}}}

    [ラボの詳細] パネルでもユーザー名を確認できます。

  4. [次へ] をクリックします。

  5. 以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。

    {{{user_0.password | "Password"}}}

    [ラボの詳細] パネルでもパスワードを確認できます。

  6. [次へ] をクリックします。

    重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  7. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後、このタブで Google Cloud コンソールが開きます。

注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。

タスク 2. Terraform を初期化する

まず、Google をプロバイダとして設定して Terraform を初期化します。

  1. Cloud Shell を開き()、次のコマンドを実行して Terraform がインストールされていることを確認します。
terraform -version

出力は次のようになります(コピーしないでください。これは出力例です)。

Terraform v1.5.7

Terraform は、Cloud Shell にプリインストールされています。インストール済みの Terraform を使用して、インフラストラクチャ リソースを直接作成できます。

  1. 次のコマンドを実行して、Terraform 構成用のディレクトリを作成し、そのディレクトリに移動します。
mkdir tfinfra && cd $_
  1. Cloud Shell で [エディタを開く] をクリックして、Cloud Shell エディタを開きます。
  2. [新しいウィンドウで開く] ボタンをクリックすると、別のタブでエディタを開いたままにできます。
  3. tfinfra フォルダ内に新しいファイルを作成するために、tfinfra フォルダを右クリックして [New File] をクリックします。
  4. 新しいファイルに「provider.tf」という名前を付けて、[OK] をクリックします。
  5. provider.tf 内に次のコードを追加します。
provider "google" { project = "{{{project_0.project_id|Project ID}}}" region = "{{{project_0.default_region | "REGION"}}}" zone = "{{{project_0.default_zone | "ZONE"}}}" }
  1. [File] > [Save] をクリックして provider.tf を保存します。

  2. 次のコマンドを実行して Terraform を初期化します。

terraform init

出力は次のようになります(コピーしないでください。これは出力例です)。

Initializing the backend... Initializing provider plugins... - Finding hashicorp/google versions matching "4.15.0"... - Installing hashicorp/google v4.15.0... - Installed hashicorp/google v4.15.0 (signed by HashiCorp) Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized!

これで、Google Cloud API とやり取りするために必要なプラグインを Terraform にインストールできました。API に対する認証は必要ありません。Cloud Shell の認証情報により、プロジェクトと API へのアクセスが許可されます。

問題:

ラボの残りの部分では、Terraform で対処できる次の 2 種類の依存関係について取り上げます。

  1. 暗黙的な依存関係: Terraform に認識される依存関係
  2. 明示的な依存関係: Terraform に認識されない依存関係

タスク 3. リソースの暗黙的な依存関係を確認する

Terraform が暗黙的な依存関係をどのように推測するかを具体的に説明するために、VM インスタンスに静的 IP アドレスを割り当てます。

VM インスタンスを作成する

VM インスタンスを作成し、その構成をパラメータ化するために変数を定義します。

  1. 新しいファイルを作成するために、tfinfra フォルダを右クリックして [New File] をクリックします。
  2. 新しいファイルに「instance.tf」という名前を付け、このファイルを開きます。
  3. instance.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-11" } } network_interface { network = "default" access_config { # インスタンスに 1 対 1 で NAT IP を割り振る } } }
  1. [File] > [Save] をクリックして instance.tf を保存します。

変数を作成する

  1. tfinfra フォルダを右クリックして [New File] をクリックし、変数用の新しいファイルを作成します。
  2. 新しいファイルに「variables.tf」という名前を付けて、[OK] をクリックします。
  3. variables.tf 内に次のプロパティを追加します。
variable "instance_name" { type = string description = "Name for the Google Compute instance" } variable "instance_zone" { type = string description = "Zone for the Google Compute instance" } variable "instance_type" { type = string description = "Disk type of the Google Compute instance" default = "e2-medium" }

instance_type にデフォルト値を設定することで、この変数の指定をオプションとします。instance_nameinstance_zone は必須です。これらは実行時に定義します。

  1. [File] > [Save] をクリックして variable.tf を保存します。

出力値を作成する

  1. tfinfra フォルダを右クリックして [New File] をクリックし、出力用の新しいファイルを作成します。
  2. 新しいファイルに「outputs.tf」という名前を付けて、[OK] をクリックします。
  3. outputs.tf 内に次のプロパティを追加します。
output "network_IP" { value = google_compute_instance.vm_instance.instance_id description = "The internal ip address of the instance" } output "instance_link" { value = google_compute_instance.vm_instance.self_link description = "The URI of the created resource." }
  1. [File] > [Save] をクリックして outputs.tf を保存します。

静的 IP を割り当てる

  1. 次に、instance.tf で VM インスタンスに静的 IP を割り当てて構成に追加します。
resource "google_compute_address" "vm_static_ip" { name = "terraform-static-ip" }

これは、前の例で VM インスタンス リソースを追加した手順に似ていますが、ここでは google_compute_address リソースタイプを作成するという点が異なります。このリソースタイプはプロジェクトに予約済み IP アドレスを割り振ります。

  1. インスタンスの network_interface 構成を次のように更新します。
network_interface { network = "default" access_config { # インスタンスに 1 対 1 で NAT IP を割り振る nat_ip = google_compute_address.vm_static_ip.address } }

最終的なコードは次のようになります。

resource "google_compute_address" "vm_static_ip" { name = "terraform-static-ip" } 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 { network = "default" access_config { # インスタンスに 1 対 1 で NAT IP を割り振る nat_ip = google_compute_address.vm_static_ip.address } } }
  1. 次のコマンドを実行して Terraform を初期化します。
terraform init
  1. 次のコマンドを実行して、作成されたリソースをプレビューします。
terraform plan
  1. インスタンスの作成に関する詳細を入力するよう求められたら、次のように入力します。
  • var.instance_name: myinstance

  • var.instance_zone:

  1. 次のコマンドを実行して、リソースが作成される順序を確認します。
terraform apply
  1. インスタンスの作成に関する詳細を入力するよう求められたら、次のように入力します。
  • var.instance_name: myinstance

  • var.instance_zone:

  1. yes」と入力して、計画したアクションを確定します。
注: Terraform がインスタンスを作成する前に静的 IP アドレスを作成して、暗黙的な依存関係に自動的に対処していることを確認してください。 google_compute_address.vm_static_ip: Creating... google_compute_address.vm_static_ip: Creation complete after 2s [id=projects/qwiklabs-gcp-03-4662a5b49176/regions/{{{project_0.default_region | "REGION"}}}/addresses/terraform-static-ip] google_compute_instance.vm_instance: Creating... google_compute_instance.vm_instance: Still creating... [10s elapsed] google_compute_instance.vm_instance: Creation complete after 15s [id=projects/qwiklabs-gcp-03-4662a5b49176/zones/{{{project_0.default_zone | "ZONE"}}}/instances/myinstance] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Cloud コンソールで確認する

Google Cloud コンソールで、リソースが作成されていることを確認します。

  1. Google Cloud コンソールのナビゲーション メニュー)で、[Compute Engine] > [VM インスタンス] をクリックします。

  2. myinstance」という名前のインスタンスが作成されていることを確認します。

  3. 静的 IP アドレスを確認します。ナビゲーション メニュー)で、[VPC ネットワーク] > [IP アドレス] > [外部 IP アドレス] をクリックします。

[進行状況を確認] をクリックして、静的 IP アドレスを作成したことを確認します。 暗黙的な依存関係を使用して静的 IP を作成する

[進行状況を確認] をクリックして、VM を作成したことを確認します。 暗黙的な依存関係を使用して VM インスタンスを作成する

タスク 4. 明示的な依存関係を作成する

明示的な依存関係を使用して、Terraform からは見えないリソース間の依存関係を Terraform に認識させます。たとえば、インスタンスで実行するアプリケーションで特定の Cloud Storage バケットを使用するとします。この依存関係がアプリケーション コード内で構成されている場合、Terraform では認識できません。この場合は、depends_on を使用してこの依存関係を明示的に宣言する必要があります。

  1. 新しいファイルを作成するために、tfinfra フォルダを右クリックして [New File] をクリックします。
  2. 新しいファイルに「exp.tf」という名前を付けて、[OK] をクリックします。
  3. Cloud Storage バケットと、そのバケットに明示的に依存するインスタンスを追加するために、exp.tf 内に次のベースコードを追加します。
# 特定のバケットを使用する新しいインスタンスを作成する resource "google_compute_instance" "another_instance" { name = "terraform-instance-2" machine_type = "e2-micro" boot_disk { initialize_params { image = "debian-cloud/debian-11" } } network_interface { network = "default" access_config { } } # この VM インスタンスの作成は、Storage バケットの # 作成後にのみ行うよう Terraform に指示する depends_on = [google_storage_bucket.example_bucket] }
  1. 次のコードを追加してバケットを作成します。
# アプリケーションで使用するストレージ バケット用の新しいリソース resource "google_storage_bucket" "example_bucket" { name = "<UNIQUE-BUCKET-NAME>" location = "US" website { main_page_suffix = "index.html" not_found_page = "404.html" } } 注: Storage バケットはグローバルに一意でなければなりません。そのため、UNIQUE-BUCKET-NAME を一意の有効なバケット名に置き換える必要があります。通常は、プロジェクト名と日付を使用すると、一意のバケット名を作成できます。

このコードでは、GCS バケットの前に VM インスタンス構成が追加されることに注目してください。terraform apply を実行すると、Terraform 構成ファイルでリソースを定義する順序が、Terraform による変更の適用に影響しないことがわかります。

最終的なコードは次のようになります。

resource "google_compute_instance" "another_instance" { name = "terraform-instance-2" machine_type = "e2-micro" boot_disk { initialize_params { image = "debian-cloud/debian-11" } } network_interface { network = "default" access_config { } } # この VM インスタンスの作成は、Storage バケットの # 作成後にのみ行うよう Terraform に指示する depends_on = [google_storage_bucket.example_bucket] } resource "google_storage_bucket" "example_bucket" { name = "<UNIQUE-BUCKET-NAME>" location = "US" website { main_page_suffix = "index.html" not_found_page = "404.html" } }
  1. [File] > [Save] をクリックして exp.tf を保存します。

  2. 次のコマンドを実行して、作成されたリソースをプレビューします。

terraform plan

インスタンスの作成に関する詳細を入力するよう求められたら、次のように入力します。

  • var.instance_name: myinstance

  • var.instance_zone:

  1. 次のコマンドを実行して、リソースが作成される順序を確認します。
terraform apply

インスタンスの作成に関する詳細を入力するよう求められたら、次のように入力します。

  • var.instance_name: myinstance

  • var.instance_zone:

  1. yes」と入力して、計画したアクションを確定します。

  2. 明示的な依存関係により、Cloud Storage バケットの作成後にコンピューティング インスタンスが作成されることを確認します。

Enter a value: yes google_storage_bucket.example_bucket: Creating... google_storage_bucket.example_bucket: Creation complete after 1s [id=qwiklabs-gcp-03-4662a5b49176-abc] google_compute_instance.another_instance: Creating... google_compute_instance.another_instance: Still creating... [10s elapsed] google_compute_instance.another_instance: Creation complete after 14s [id=projects/qwiklabs-gcp-03-4662a5b49176/zones/{{{project_0.default_zone | "ZONE"}}}/instances/terraform-instance-2] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Cloud コンソールで確認する

Google Cloud コンソールで、リソースが作成されていることを確認します。

  1. Google Cloud コンソールのナビゲーション メニュー)で、[Compute Engine] > [VM インスタンス] をクリックします。

  2. terraform-instance-2 インスタンスが作成されていることを確認します。

  3. Cloud Storage バケットが作成されていることを確認します。ナビゲーション メニュー)で、[Cloud Storage] > [バケット] をクリックします。

[進行状況を確認] をクリックして、バケットを作成したことを確認します。 明示的な依存関係を使用して Cloud Storage バケットを作成する

[進行状況を確認] をクリックして、VM を作成したことを確認します。 明示的な依存関係を使用して VM インスタンスを作成する

注: エラーが表示された場合は、前のステップに戻って構成がラボの説明と一致しているかどうかを確認してください。構成の問題をトラブルシューティングできない場合は、完成版の構成をダウンロードして内容を確認してください。

タスク 5. 依存関係グラフを表示する

  1. 作成されたリソースの依存関係グラフを表示するには、次のコマンドを実行します。
terraform graph | dot -Tpng > graph.png
  1. エディタに切り替えて、作成された graph.png という名前のファイルを見つけます。ファイルをクリックして、依存関係グラフを表示します。

このグラフの見方については、こちらのページをご覧ください。

確認

このラボでは、静的 IP アドレスを割り当てた VM インスタンスを使用して、リソースの暗黙的な依存関係に Terraform がどう対処するかを確認しました。次に、depend_on 引数を追加して明示的な依存関係を作成し、VM インスタンスの作成前に GCS を作成できるようにしました。また、Terraform がリソースの作成順をトレースするために使用する依存関係グラフを表示しました。

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Qwiklabs から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2022 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。