Wie entferne ich ein vorhandenes Volume und hänge ein neues Volume mit Terraform an?

7

Gibt es eine Möglichkeit, das EBS-Volume von der vorhandenen EC2-Instanz zu trennen und mit ein neues EBS-Volume anzuhängen Terraform v0.9.2?

Ich ziehe es vor, das Volume zu ersetzen, anstatt zu versuchen, die Instanz zu zerstören und ein neues mit neuem Volume zu erstellen.

Das Dateisystem wird vor dem Trennen des Volumes vom Gerät im Betriebssystem abgemeldet, und es gibt auch kein Problem, das Volume von der AWS-Konsole zu trennen.

resource "aws_ebs_volume" "create_volume" {
  availability_zone = "eu-central-1a"
  snapshot_id = "${data.aws_ebs_snapshot.mysql.id}"
  type = "gp2"
  tags {
    Name = "${var.instance_name}"
  }
}

resource "aws_volume_attachment" "mysql_data" {
  depends_on = ["null_resource.stop_mysql_service2"]
  device_name = "/dev/xvdf"
  volume_id = "${aws_ebs_volume.create_volume.0.id}"
  instance_id = "i-0d48be4266da"
  skip_destroy = true
  force_detach = true
}

$ ./terraform apply
data.aws_ebs_snapshot.mysql: Refreshing state...
aws_ebs_volume.create_volume: Creating...
  availability_zone: "" => "eu-central-1a"
  encrypted:         "" => "<computed>"
  iops:              "" => "<computed>"
  kms_key_id:        "" => "<computed>"
  size:              "" => "<computed>"
  snapshot_id:       "" => "snap-0afb2303c60f"
  tags.%:            "" => "1"
  tags.Name:         "" => "mysql"
  type:              "" => "gp2"
aws_ebs_volume.create_volume: Still creating... (10s elapsed)
aws_ebs_volume.create_volume: Creation complete (ID: vol-04c7f4)
null_resource.stop_mysql_service2: Creating...
null_resource.stop_mysql_service2: Provisioning with 'remote-exec'...
null_resource.stop_mysql_service2 (remote-exec): Connecting to remote host via SSH...
null_resource.stop_mysql_service2 (remote-exec):   Host: mysql
null_resource.stop_mysql_service2 (remote-exec):   User: ubuntu
null_resource.stop_mysql_service2 (remote-exec):   Password: false
null_resource.stop_mysql_service2 (remote-exec):   Private key: true
null_resource.stop_mysql_service2 (remote-exec):   SSH Agent: true
null_resource.stop_mysql_service2 (remote-exec): Connected!
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2: Still creating... (10s elapsed)
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec): .
null_resource.stop_mysql_service2 (remote-exec):  * Attempt to shutdown MySQL Community Server 5.6.35 timed out
null_resource.stop_mysql_service2: Still creating... (20s elapsed)
null_resource.stop_mysql_service2: Still creating... (30s elapsed)
null_resource.stop_mysql_service2: Creation complete (ID: 1850529311883)
aws_volume_attachment.mysql_data: Creating...
  device_name:  "" => "/dev/xvdf"
  force_detach: "" => "true"
  instance_id:  "" => "i-0d48be4266da"
  skip_destroy: "" => "true"
  volume_id:    "" => "vol-04c7f4"
aws_volume_attachment.mysql_data: Still creating... (10s elapsed)
Error applying plan:

1 error(s) occurred:

* aws_volume_attachment.mysql_data: 1 error(s) occurred:

* aws_volume_attachment.mysql_data: [WARN] Error attaching volume (vol-04c7f4) to instance (i-0d48be4266da), 
message: "Invalid value '/dev/xvdf' for unixDevice. Attachment point /dev/xvdf is already in use", code: "InvalidParameterValue"

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.
Berlin
quelle

Antworten:

10

Das alte Volume wird da nie abgetrennt skip_destroy = true. Aus den Terraform-Dokumenten:

skip_destroy - (Optional, Boolean) Setzen Sie diesen Wert auf true, wenn Sie das Volume nicht von der Instanz trennen möchten, an die es zum Zeitpunkt der Zerstörung angehängt ist, und stattdessen einfach den Anhang aus dem Terraform-Status entfernen möchten. Dies ist nützlich, wenn Sie eine Instanz zerstören, an die Volumes auf andere Weise erstellt wurden.

Wenn Sie das entfernen, wird der alte Anhang zerstört und der Anhangspunkt sollte für den neuen Anhang verfügbar sein.

Möglicherweise müssen Sie den alten Anhang dieses Mal manuell löschen. Ich glaube, Terraform hat ihn möglicherweise bereits aus dem Status gelöscht.

Theron Luhn
quelle