用持久数据重建一个terrafrom aws instnace

时间:2017-06-23 19:33:01

标签: amazon-web-services amazon-ec2 terraform

我有一个terraform脚本,我在其中启动一个ec2实例集群并将它们组合在一起(特别是为Influx Db)。以下是该脚本的相关部分:

resource "aws_instance" "influxdata" {
  count      = "${var.ec2-count-influx-data}"

  ami           = "${module.amis.rhel73_id}"
  instance_type = "${var.ec2-type-influx-data}"

  vpc_security_group_ids = ["${var.sg-ids}"]
  subnet_id              = "${element(module.infra.subnet,count.index)}"
  key_name               = "${var.KeyName}"

  tags {
    Name               = "influx-data-node"
    System                = "${module.infra.System}"
    Environment    = "${module.infra.Environment}"
    OwnerContact       = "${module.infra.OwnerContact}"
    Owner          = "${var.Owner}"
  }


  ebs_block_device {
    device_name = "/dev/sdg"
    volume_size = 750
    volume_type = "io1"
    iops = 3000
    encrypted = true
    delete_on_termination = false
  }

  user_data = "${file("terraform/attach_ebs.sh")}"

  connection {
    //private_key = "${file("/Users/key_CD.pem")}" #dev env
    //private_key = "${file("/Users/influx.pem")}" #qa env west
    private_key = "${file("/Users/influx_east.pem")}" #qa env east
    user        = "ec2-user"
  }

  provisioner "remote-exec" {
    inline = ["echo just checking for ssh. ttyl. bye."]
  }
}

我现在要做的是...污点一个实例然后让terraform重建它但是...我想要它做的是卸载ebs,分离ebs,重建实例,附加ebs,登上ebs。

当我执行terraform taint module=instance时,它会对它进行污染,然后当我去应用更改时,它会创建一个全新的实例和新的ebs卷,而不是将新的实例重新连接到新实例上。

我也有一些数据丢失,因为这是集群的一部分,因此当节点重建时......它应该只与其他节点同步....

如何用Terraform做到这一点?

2 个答案:

答案 0 :(得分:0)

创建要污染的实例的快照。然后更改ec2资源的ebs卷以获得上一个快照的快照ID参数。 https://www.terraform.io/docs/providers/aws/r/instance.html#snapshot_id

答案 1 :(得分:0)

由于您不关心数据丢失,我想要认为ec2实例与重建之前处于相同状态但没有数据是可以的。

如果是这种情况,我将使用用户数据在重建后自动挂载新连接的卷。在这种情况下,在重建之后,ec2实例将处于相同的状态(卷格式化和附加)并准备好与群集中的其他节点同步以获取数据,而无需任何额外的工作。该脚本应如下所示:

#!/bin/bash

DEVICE_FS=`blkid -o value -s TYPE /dev/xvdh`
if [ "`echo -n $DEVICE_FS`" == "" ] ; then
        mkfs.ext4 /dev/xvdh
fi
mkdir -p /data
echo '/dev/xvdh /data ext4 defaults 0 0' >> /etc/fstab
mount /data