まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

EC2をremote-execでprovisioningする方法

追記:そもそもuser-dataがあることを知らなかったのでこっちを使おう

www.mpon.me

elastic ipで接続されない

こんな風に素直に(自分的には)書くとElastic IPよりも先にEC2を先に作ろうとしちゃう。 で、private ipでssh接続しようとするから、そりゃあいつまでたっても接続できないし、 elastic ipも作られない。

resource "aws_eip" "dev" {
  instance = "${aws_instance.dev.id}"
  vpc = true
}

resource "aws_instance" "dev" {
  ami = "ami-b73b63a0"
  availability_zone = "us-east-1a"
  instance_type = "t2.micro"
  disable_api_termination = false
  key_name = "dev"
  
  vpc_security_group_ids = [
    "${aws_security_group.default.id}"
  ]
  
  subnet_id = "${aws_subnet.public.id}"

  provisioner "remote-exec" {
    connection {
      user = "ec2-user"
      private_key = "${file("${path.root}/dev.pem")}"
    }
    inline = [
      "sudo yum update -y"
    ]
  }
}

null_resourceを使う

これの最後の方のコメントが参考になった。 ec2_instance -> eip の順番で作成して、そのあとnull_resourceでtriggerを設定して、remote-execを実行する。 なるほどーうまい。

github.com

resource "aws_eip" "dev" {
  instance = "${aws_instance.dev.id}"
  depends_on = ["aws_instance.dev"]
  vpc = true
}

resource "aws_instance" "dev" {
  ami = "ami-b73b63a0"
  availability_zone = "us-east-1a"
  instance_type = "t2.micro"
  disable_api_termination = false
  key_name = "dev"
  
  vpc_security_group_ids = [
    "${aws_security_group.default.id}"
  ]
  
  subnet_id = "${aws_subnet.public.id}"
}

resource "null_resource" "preparation" {
  triggers {
    instance = "${aws_instance.dev.id}"
  }
  connection {
    host        ="${aws_eip.dev.public_ip}"
    user        = "ec2-user"
    timeout     = "30s"
    private_key = "${file("${path.root}/dev.pem")}"
    agent = true
  }

  provisioner "remote-exec" {
    inline = [
      "sudo yum update -y"
    ]
  }

}

まとめ

非同期に何かやりたい場合は、null_resourceがつかえそう