4. 便利な使い方¶
以下Terraformにおける、より便利な使い方について簡単に記載します。
4.1. 依存性の有るリソースを作成する¶
作成するリソース間に依存関係を設けたい場合があります。
例えば以下のようなケースです。
- ロジカルネットワークを作成してから、その配下にサブネットを作成したい 
- キーペアを作成してから、それをインスタンスに埋め込みたい 
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によるリソース作成時は、
- まずロジカルネットワークを作成する 
- 次に、そのIDを参照しつつサブネットを作成する 
という挙動が行われますし、リソースの削除時には、
- まずサブネットを削除する 
- 次に、(依存関係が解消されたので)ロジカルネットワークを削除する 
という挙動が行われます。
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 への依存関係を追加しています。