EC2をremote-execでprovisioningする方法
追記:そもそもuser-dataがあることを知らなかったのでこっちを使おう
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を実行する。 なるほどーうまい。
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がつかえそう