_この問題は、もともと@evgeniagusakovaによってhashicorp / terraform#16167として開かれました。 プロバイダー分割の結果、ここに移行されました。 問題の元の本文は以下のとおりです。_
こんにちはチーム!
terraformによって作成されたボリュームでインスタンスを破棄できないときに問題が発生しました
bash-4.3$ uname -s
Darwin
bash-4.3$ terraform version
Terraform v0.10.6
md5-58db0e4bdc67a27c4b9068659851f4f4
data "aws_ebs_volume" "jenkins_disk" {
most_recent = true
filter {
name = "volume-id"
values = ["vol-XXXXX"]
}
}
resource "aws_volume_attachment" "jenkins_disk_attachment" {
device_name = "/dev/sdx"
volume_id = "${data.aws_ebs_volume.jenkins_disk.id}"
instance_id = "${aws_instance.jenkins_server.id}"
}
resource "aws_instance" "jenkins_server" {
connection {
type = "ssh"
user = "${var.instance_user}"
host = "${aws_instance.jenkins_server.public_ip}"
private_key = "${file("${var.jenkins_server_ssh_key_path}")}"
}
...
}
md5-46cb7666285c5936e8fec21a7d22aef1
terraform destroy -var secret_key=<KEY> -var access_key=<KEY>
aws_security_group.jenkins_server_security_group: Refreshing state... (ID: sg-XXXXX)
<other resources here>
data.aws_ebs_volume.jenkins_disk: Refreshing state...
<other resources here>
aws_instance.jenkins_server: Refreshing state... (ID: i-XXXXX)
aws_volume_attachment.jenkins_disk_attachment: Refreshing state... (ID: vai-XXXXX)
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
<full and correct list of resources to delete here>
Plan: 0 to add, 0 to change, 12 to destroy.
Do you really want to destroy?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
<deleting resource>
aws_volume_attachment.jenkins_disk_attachment: Destroying... (ID: vai-XXXXX)
<deleting resources>
aws_volume_attachment.jenkins_disk_attachment: Still destroying... (ID: vai-XXXXX, 10s elapsed)
aws_volume_attachment.jenkins_disk_attachment: Still destroying... (ID: vai-XXXXX, 20s elapsed)
aws_volume_attachment.jenkins_disk_attachment: Still destroying... (ID: vai-XXXXX, 30s elapsed)
aws_volume_attachment.jenkins_disk_attachment: Still destroying... (ID: vai-XXXXX, 40s elapsed)
Error applying plan:
1 error(s) occurred:
* aws_volume_attachment.jenkins_disk_attachment (destroy): 1 error(s) occurred:
* aws_volume_attachment.jenkins_disk_attachment: Error waiting for Volume (vol-XXXXX) to detach from Instance: i-XXXXX
インスタンスが削除され、ボリュームがデアタッチされますが、削除されません。
EIPが取り外されている
Sec。 グループは削除されません
インスタンスは削除されません
ボリュームはデタッチされません
ノード上:
lsof
はすべてのプロセスを見つけるのに役立ちます)terraform state rm aws_volume_attachment.jenkins_disk_attachment
から添付ファイルを削除しますterraform destroy -var ....
ディスクがマウントされて使用されていたため、ディスクが取り外されなかったと確信しています。 Amazonコンソールから、ディスクをアンマウントした後でのみ、アタッチを解除できました。
しかし、(構成可能な?)タイムアウトが発生した後、テラフォームから強制的にアタッチ解除することを期待していました。
したがって、これが予想される動作である場合は、このバグレポートを機能リクエストに変換する必要があると思います:)
よくわかりませんが、この問題は私の近くにあります。
古いテラフォームバージョンだったので、新しい号を作成することにしました。
@evgeniagusakova skip_destroy
をtrueに設定してみてください。 https://www.terraform.io/docs/providers/aws/r/volume_attachment.html#skip_destroy
私は同じ問題に直面していて、 skip_destroy
を設定するのに役立ちます
インスタンスにアタッチされたaws_ebs_volumeの破棄で同様の問題が発生しました。
アプリケーションがインスタンスでボリューム(ディスクスペース)を使用できるようにするには、次の手順を実行する必要があります。
そこで、マウントされたボリュームをインスタンスから手動でデタッチしようとしましたが、しばらくすると、次のメモで失敗しました。
.... /dev/xvdg (busy)
これに基づいて、terraformはマウントされたボリュームをインスタンスから強制的に削除できないという結論に達しました。 どちらが正しい。 したがって、ボリュームをデタッチするために、ボリュームをデタッチする前にボリュームを安全にアンマウントする、いわゆるプロシージャを作成しました。
コードでは次のようになります。
# Commands in variable to create
# a filesystem and add to fstab
variable "dataCreate" {
default = [ "echo 'BEGIN: mkfs.ext4 /dev/xvdg'",
"sudo mkfs.ext4 /dev/xvdg > /dev/null 2>&1 && echo 'END: mkfs.ext4 /dev/xvdg done'",
"echo 'BEGIN: create /data folder'",
"sudo mkdir -p /data > /dev/null 2>&1 && echo 'END: create /data folder done'",
"echo 'BEGIN: Add /dev/xvdg to fstab /data'",
"sudo sh -c \"echo '/dev/xvdg /data ext4 defaults 1 2' >> /etc/fstab\" && echo 'END: Added /dev/xvdg to fstab /data'",
"echo 'BEGIN: Mount /dev/xvdg as /data'",
"sudo mount /bitcoin && echo 'END: Mount /data done'" ]
}
## Variable holding commands to stop application,
## unmount and remove from fstab
variable "dataUmount" {
default = [ "echo 'BEGIN: Stop application using /data''",
"sudo systemctl stop {{APP}} && echo 'END: Application using /data stopped'",
"echo 'BEGIN: unmount /data'",
"sudo umount /data && echo 'END: unmount /data done'",
"echo 'BEGIN: Remove /data from fstab''",
"sudo sed -i '/data/d' /etc/fstab && echo 'END: Remove /data from fstab'",
"echo 'BEGIN: Remove /data folder",
"sudo rm -rfv /data && echo 'END: Added /dev/xvdg to fstab /data'"
]
}
## Create a data volume
resource "aws_ebs_volume" "data" {
availability_zone = "eu-central-1a"
size = "10"
}
## Attach to instance
resource "aws_volume_attachment" "data_attach" {
device_name = "/dev/xvdg"
volume_id = "${aws_ebs_volume.data.id}"
instance_id = "${aws_instance.instance.id}"
}
## Configure volume
resource "null_resource" "data_config" {
depends_on = ["aws_volume_attachment.data_attach", "aws_instance.instance"]
## commands to run when creating
provisioner "remote-exec" {
connection {
type = "ssh"
agent = false
timeout = "60s"
host = "${aws_instance.instance.public_ip}"
user = "ubuntu"
private_key = "${file(var.privateKey)}"
}
inline = ["${var.dataCreate}"]
}
## run unmount commands when destroying the data volume
provisioner "remote-exec" {
when = "destroy"
on_failure = "continue"
connection {
type = "ssh"
agent = false
timeout = "60s"
host = "${aws_instance.instance.public_ip}"
user = "ubuntu"
private_key = "${file(var.privateKey)}"
}
inline = ["${var.dataUmount}"]
}
}
## Create instance
resource "aws_instance" "instance" {
depends_on = ["aws_ebs_volume.data"]
ami = .....
......
}
したがって、アイデアは、ボリュームが切り離される前にボリュームを解放することです。
それが誰かを助けることを願っています。
最も参考になるコメント
インスタンスにアタッチされたaws_ebs_volumeの破棄で同様の問題が発生しました。
アプリケーションがインスタンスでボリューム(ディスクスペース)を使用できるようにするには、次の手順を実行する必要があります。
そこで、マウントされたボリュームをインスタンスから手動でデタッチしようとしましたが、しばらくすると、次のメモで失敗しました。
.... /dev/xvdg (busy)
これに基づいて、terraformはマウントされたボリュームをインスタンスから強制的に削除できないという結論に達しました。 どちらが正しい。 したがって、ボリュームをデタッチするために、ボリュームをデタッチする前にボリュームを安全にアンマウントする、いわゆるプロシージャを作成しました。
コードでは次のようになります。
したがって、アイデアは、ボリュームが切り離される前にボリュームを解放することです。
それが誰かを助けることを願っています。