ひきぷろのプログラミング日記

プログラミングの日記です。

Terraformでスポットインスタンスにremote-execしようとしたらはまった

HashiCorp の Terraform っていうツールを試してみてたのですが、 AWS のスポットインスタンスを起動後、 remote-exec で Web サーバをインストールしようとしたら、 SSH が接続できなくてハマってしまいました。

たぶん、ハマる人が多いのではないかと思うので、解決方法をメモしておきます。

うまくいかなかった時のログ
aws_spot_instance_request.example (remote-exec): Connecting to remote host via SSH...
aws_spot_instance_request.example (remote-exec):   Host:
aws_spot_instance_request.example (remote-exec):   User: ec2-user
aws_spot_instance_request.example (remote-exec):   Password: false
aws_spot_instance_request.example (remote-exec):   Private key: true
aws_spot_instance_request.example (remote-exec):   SSH Agent: true

Host 名が取れていません。。
これでは接続できないですね。

この後、インスタンスが正常起動し終わっても、もちろん接続することができませんでした。 Ctrl + C でいったん止めます。

うまくいった時の設定ファイル
resource "aws_spot_instance_request" "example" {
	ami = "ami-37020959"
	spot_price = "0.03"
	instance_type = "t1.micro"
	key_name = "${var.aws_key_name}"
	security_groups = ["${aws_security_group.default.name}"]
	wait_for_fulfillment = true
	associate_public_ip_address = true
	tags {
		Name = "example"
	}

	provisioner "remote-exec" {
		connection {
			type = "ssh"
			user = "ec2-user"
			key_file = "${var.ssh_key_file}"
		}
		inline = [
			"sudo yum update -y",
			"sudo yum install -y httpd24",
			"sudo service httpd start",
			"sudo chkconfig httpd on",
		]
	}
}
  • wait_for_fulfillment = true
  • associate_public_ip_address = true

がミソっぽいです。
この2行をきちんと書いておくと、 Host 名が正常に取れて、コマンドが実行されます。

Terraform v0.6.14 で実行してるんですが、 Windows でも特に追加で設定することなく、 SSH の接続ができています。

追記

そういえば、 aws_security_group の設定もうまくやらないと、 yum の実行時に失敗することがあったのでメモしておきます。
ポイントは、 egress もきちんと書くっていうところです。

resource "aws_security_group" "default" {
	name = "terraform_example"
	description = "Used in the terraform"

	# SSH access from anywhere
	ingress {
		from_port = 22
		to_port = 22
		protocol = "tcp"
		cidr_blocks = ["0.0.0.0/0"]
	}

	# HTTP access from anywhere
	ingress {
		from_port = 80
		to_port = 80
		protocol = "tcp"
		cidr_blocks = ["0.0.0.0/0"]
	}

	egress {
		from_port = 0
		to_port = 0
		protocol = "-1"
		cidr_blocks = ["0.0.0.0/0"]
	}
}
参考リンク

github.com