🐕

cloud-initの完了を待つ処理をterraformで書く

2021/11/03に公開

モチベーション

プライベートサブネットからインターネットへの通信を転送するNATルータ機能をパプリックサブネットに作った仮想マシンで実装した。
NATルータ機能はcloud-initを用いてデプロイ時にセットアップされる仕組みだが、同時にプライベートサブネットの仮想マシンが作成されてしまうと、インターネットからパッケージを持ってくるようなセットアップが失敗する。
そこで、NATルータ機能のセットアップ(を含む一連のcloud-init)完了を待ってから、プライベートサブネットの仮想マシンを作成するterraformを作ってみた。

ポイント

NATルータ機能

cloud-init で NAT機能セットアップの最後にtouchコマンドでsignalファイルを作成している。

resource "oci_core_instance" "nomad-server01" {
  ...
  metadata = {
    ssh_authorized_keys = file(var.ssh_public_key_path)
    user_data           = base64encode(data.template_file.nat-server.rendered)
  }
  ...
}
  # NAT機能セットアップ
  ...
  
  # Finish
  - touch /tmp/signal

null_resourceとremote-execを使ってsignalファイルの作成を確認

resource "null_resource" "wait-cloudinit" {
  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      host        = oci_core_instance.nat-server01.public_ip
      user        = "opc"
      private_key = file(var.ssh_private_key_path)
      timeout     = "15m"
    }
    inline = [
      "while [ ! -f /tmp/signal ]; do sleep 2; done"
    ]
  }
}

プライベートサブネットの仮想マシン

depends_onでnull_resource.wait-cloudinit作成後に実行されるよう設定。

resource "oci_core_instance" "node01" {
  ...
  depends_on = [
    null_resource.wait-cloudinit,
  ]
}

参考URL

https://stackoverflow.com/a/62407671

Discussion