4. 便利な使い方

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

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

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

例えば以下のようなケースです。

  1. ロジカルネットワークを作成してから、その配下にサブネットを作成したい
  2. キーペアを作成してから、それをインスタンスに埋め込みたい

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

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

4.1.1. resourceセクションから、別なリソースを参照させる

上記の例1( ロジカルネットワークを作成してから、その配下にサブネットを作成したい )に対応したtfファイル例を示します。

resource "ecl_network_network_v2" "network_1" {
  name = "network-1"
}

resource "ecl_network_subnet_v2" "subnet_1" {
  name       = "subnet-1"
  network_id = ecl_network_network_v2.network_1.id
  cidr       = "192.168.1.0/24"
  gateway_ip = "192.168.1.1"
}

上記の例では、1つ目のresourceセクションでロジカルネットワークを作成しています。

2つ目のresourceセクションではサブネットを作成していますが、その際サブネット作成時のパラメータである network_id に、ecl_network_network_v2.network_1.id を指定しています。

これは、 1つ目のresourceセクションで作成したロジカルネットワークのIDを参照する という意味になります。

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

  1. まずロジカルネットワークを作成する
  2. 次に、そのIDを参照しつつサブネットを作成する

という挙動が行われますし、リソースの削除時には、

  1. まずサブネットを削除する
  2. 次に、(依存関係が解消されたので)ロジカルネットワークを削除する

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

4.1.2. resourceセクションにおいて、depends_onを利用する

tfファイル上は表わせない暗黙の依存関係が Smart Data Platform のAPI側で存在するような場合、 resourceセクションから、別なリソースを参照させる の方法では不十分な場合があります。

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

具体的な例を以下に示します。

resource "ecl_network_network_v2" "network_1" {
  name = "network_1"
  plane = "data"
}
 resource "ecl_network_subnet_v2" "subnet_1" {
  name = "subnet_1"
  network_id = ecl_network_network_v2.network_1.id
  cidr = "192.168.1.0/24"
  gateway_ip = "192.168.1.1"
  allocation_pools {
    start = "192.168.1.100"
    end = "192.168.1.200"
  }
}

resource "ecl_compute_instance_v2" "instance_1" {
  name = "instance_1"
  block_device {
    uuid = "1f7ff189-f7a4-4d74-99cc-7860614d2ae7"
    source_type = "image"
    volume_size = 40
    boot_index = 0
    destination_type = "volume"
    delete_on_termination = true
  }
  network {
    uuid = ecl_network_network_v2.network_1.id
  }
  depends_on = [ecl_network_subnet_v2.subnet_1] <-- depends_on による依存関係の強制付与
}

インスタンスを定義しているresourceセクションにおいて、 depends_on によるサブネットへの依存関係が定義されています。

上記の例では、 ecl_compute_instance_v2.instance1 自体は ecl_network_network_v2.network_1.id のみを参照していますが、 depends_on = [ecl_network_subnet_v2.subnet_1] を追加することで強制的に ecl_network_subnet_v2.subnet_1 への依存関係を追加しています。