4. 便利な使い方

以下Terraformにおける、より便利な使い方について簡単に記載します。

4.1. 依存性の有るリソースを作成する

作成するリソース間に依存関係を設けたい場合があります。

たとえば FIC-Routerを作成してから、そのFIC-Routerを利用したFIC-Connectionを作成したい というようなケースです。

Terraformはこうした依存関係を考慮しながらリソースの作成、削除を行うことが可能です。

依存関係を設定するには2つの方法があります。

  • resourceセクションから、別なリソースを参照させる
  • resourceセクションにおいて、depends_onを利用する

たとえば以下のような例をご覧ください。

resource "fic_eri_router_v1" "router_1" {
  name            = "terraform_router_1"
  area            = "JPEAST"
  user_ip_address = "10.0.0.0/27"
  redundant       = true
}

resource "fic_eri_port_v1" "port_1" {
  name        = "terraform_port_1"
  switch_name = "[Switch名]"
  port_type   = "10G"

  vlan_ranges {
    start = 1137
    end   = 1152
  }
}

resource "fic_eri_port_v1" "port_2" {
  name        = "terraform_port_2"
  switch_name = "[Switch名]"
  port_type   = "10G"
  depends_on  = [fic_eri_port_v1.port_1]

  vlan_ranges {
    start = 1153
    end   = 1168
  }
}

resource "fic_eri_router_paired_to_port_connection_v1" "connection_1" {
  name              = "terraform_connection_1"
  source_router_id  = fic_eri_router_v1.router_1.id
  source_group_name = "group_1"

  source_information {
    ip_address          = "10.0.1.1/30"
    as_path_prepend_in  = "4"
    as_path_prepend_out = "4"
  }

  source_information {
    ip_address          = "10.0.1.5/30"
    as_path_prepend_in  = "2"
    as_path_prepend_out = "1"
  }

  source_route_filter_in  = "fullRoute"
  source_route_filter_out = "fullRouteWithDefaultRoute"

  destination_information {
    port_id    = fic_eri_port_v1.port_1.id
    vlan       = fic_eri_port_v1.port_1.vlan_ranges.0.start
    ip_address = "10.0.1.2/30"
    asn        = "65000"
  }

  destination_information {
    port_id    = fic_eri_port_v1.port_2.id
    vlan       = fic_eri_port_v1.port_2.vlan_ranges.0.start
    ip_address = "10.0.1.6/30"
    asn        = "65000"
  }

  bandwidth = "10M"
}

上記の例では、

  • 1つ目のresourceセクションである resource "fic_eri_router_v1" "router_1" においてFIC-Routerを作成
  • 2つ目、3つ目のresourceセクションである "fic_eri_port_v1" "port_1" および "fic_eri_port_v1" "port_2" において2つのFIC-Portを作成
  • 4つ目のresourceセクションである "fic_eri_router_paired_to_port_connection_v1" "connection_1" においてFIC-Connectionを作成

ということをやっています。

ここでFIC-Connectionの作成部を見てみましょう。

resource "fic_eri_router_paired_to_port_connection_v1" "connection_1" {
  name              = "terraform_connection_1"
  source_router_id  = fic_eri_router_v1.router_1.id <-- 重要
  source_group_name = "group_1"
  ()

この中で利用されている fic_eri_router_v1.router_1.id という表記は fic_eri_router_v1.router_1 として作成したリソースの id に設定された値を参照するという意味を持ちます。

このように記載することで、Terraformによるリソース作成時は、

  1. まずFIC-Routerを作成する
  2. 次に、そのFIC-RouterのIDを参照しつつFIC-Connectionを作成する

という挙動が行われます。

他にもFIC-Portの作成部に以下のような表記があります。

resource "fic_eri_port_v1" "port_2" {
  name        = "terraform_port_2"
  switch_name = "[Switch名]"
  port_type   = "10G"
  depends_on  = [fic_eri_port_v1.port_1] <-- 重要

  vlan_ranges {
    start = 1153
    end   = 1168
  }
}

この depends_on というパラメータをresourceセクションに記載することで、強制的な依存関係を設けることが可能になります。

上記の例では、 fic_eri_port_v1.port_2fic_eri_port_v1.port_1 に依存する

ということを明確にしています。これによりTerraformは以下のような処理を行う必要があると認識し、リソースの作成や削除の順序を自動的に制御します。

  • fic_eri_port_v1.port_2 の作成前に fic_eri_port_v1.port_1 の作成が完了している必要がある
  • fic_eri_port_v1.port_2 の削除が終わるまで fic_eri_port_v1.port_1 の削除をしてはならない