🐕
cloud-initの完了を待つ処理をterraformで書く
モチベーション
プライベートサブネットからインターネットへの通信を転送する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
Discussion