subnet.main
とかaws_security_group
などなどは別途設定済みとして。
#--------------------------------------------------------------
# Ec2 Instances
#--------------------------------------------------------------
resource "aws_instance" "elasticsearch" {
instance_type = "${var.elasticsearch_instance_type}"
ami = "${var.default_ami}"
subnet_id = "${element(aws_subnet.main.*.id, count.index%length(aws_subnet.main.*.id))}"
vpc_security_group_ids = [ "${aws_security_group.output_all.id}", "${aws_security_group.elasticsearch.id}" ]
key_name = "${aws_key_pair.developer.id}"
iam_instance_profile = "${aws_iam_instance_profile.elasticsearch.id}"
tags {
Name = "${format("%s-elasticsearch%02d", var.environment, count.index+1)}"
role = "elasticsearch"
environment = "${var.environment}"
}
count = "${var.elasticsearch_server_count}"
}
#--------------------------------------------------------------
# EBS
#--------------------------------------------------------------
resource "aws_ebs_volume" "elasticsearch-data" {
availability_zone = "${element(aws_subnet.main.*.availability_zone, count.index)}"
size = "${var.elasticsearch_volume_size}"
type = "gp2"
tags {
Name = "${format("elasticsearch%02d-data", count.index+1)}"
environment = "${var.environment}"
}
count = "${var.elasticsearch_ebs_count}"
}
#--------------------------------------------------------------
# EBS attachment
#--------------------------------------------------------------
resource "aws_volume_attachment" "attach_elasticsearch-data" {
device_name = "/dev/sdb"
volume_id = "${element(aws_ebs_volume.elasticsearch-data.*.id, count.index)}"
instance_id = "${element(aws_instance.elasticsearch.*.id, count.index)}"
count = "${var.elasticsearch_server_count}"
}
これでelasticsearch_server_countだけサーバが立ち上がった上でEBSがattachされます。
さらに
terraform destory -target 'aws_instance.elasticsearch'
とした場合、インスタンスだけ消えてEBSは残るので、次回インスタンスを立ち上げたときには同じEBSが割り当てられます。
問題はterraform destory
したときにEBSがマウント済みだと当然エラーになるので落とすときはumountをする何かが必要になります。
いまのところ作成時にのみprovisionerが実行されるだけなのでterraformでは完結しません。