Terraform-provider-aws: ボリュームのあるAWSノードの破棄に失敗しました:* aws_volume_attachment.jenkins_disk_attachment:ボリューム(vol-XXXX)がインスタンスからデタッチするのを待機中にエラーが発生しました:i-XXXXX

作成日 2017年10月20日  ·  3コメント  ·  ソース: hashicorp/terraform-provider-aws

_この問題は、もともと@evgeniagusakovaによってhashicorp / terraform#16167として開かれました。 プロバイダー分割の結果、ここに移行されました。 問題の元の本文は以下のとおりです。_


こんにちはチーム!

terraformによって作成されたボリュームでインスタンスを破棄できないときに問題が発生しました

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。 グループは削除されません
インスタンスは削除されません
ボリュームはデタッチされません

回避策

ノード上:

  1. ディスクマウントポイントを使用してすべてのプロセスを停止します( lsofはすべてのプロセスを見つけるのに役立ちます)
  2. ディスクを同期してアンマウントします
  3. Amazonコンソールを使用してボリュームをデアタッチします
  4. 状態terraform state rm aws_volume_attachment.jenkins_disk_attachmentから添付ファイルを削除します
  5. インスタンスを破棄する: terraform destroy -var ....

追加の詳細

ディスクがマウントされて使用されていたため、ディスクが取り外されなかったと確信しています。 Amazonコンソールから、ディスクをアンマウントした後でのみ、アタッチを解除できました。

しかし、(構成可能な?)タイムアウトが発生した後、テラフォームから強制的にアタッチ解除することを期待していました。

したがって、これが予想される動作である場合は、このバグレポートを機能リクエストに変換する必要があると思います:)

参考文献

よくわかりませんが、この問題は私の近くにあります。
古いテラフォームバージョンだったので、新しい号を作成することにしました。

bug servicec2

最も参考になるコメント

インスタンスにアタッチされたaws_ebs_volumeの破棄で同様の問題が発生しました。
アプリケーションがインスタンスでボリューム(ディスクスペース)を使用できるようにするには、次の手順を実行する必要があります。

  • AWSボリュームを作成する
  • インスタンスにアタッチします
  • そのディスク上にファイルシステムを作成する
  • マウントポイントフォルダを作成します
  • fstabにマウントポイントを追加します
  • マウントする
  • 使用を開始します(通常はアプリケーションを実行します)

そこで、マウントされたボリュームをインスタンスから手動でデタッチしようとしましたが、しばらくすると、次のメモで失敗しました。
.... /dev/xvdg (busy)
これに基づいて、terraformはマウントされたボリュームをインスタンスから強制的に削除できないという結論に達しました。 どちらが正しい。 したがって、ボリュームをデタッチするために、ボリュームをデタッチする前にボリュームを安全にアンマウントする、いわゆるプロシージャを作成しました。

  • ボリュームの使用を停止します(アプリケーションを停止します)
  • マウントを解除します
  • fstabからマウントポイントを削除します(永続的な場合はオプション)
  • マウントフォルダを削除します(永続的な場合はオプション)
  • インスタンスから切り離す
  • AWSボリュームを削除します

コードでは次のようになります。

# 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 = .....
......
}

したがって、アイデアは、ボリュームが切り離される前にボリュームを解放することです。
それが誰かを助けることを願っています。

全てのコメント3件

@evgeniagusakova skip_destroyをtrueに設定してみてください。 https://www.terraform.io/docs/providers/aws/r/volume_attachment.html#skip_destroy

1017は一見の価値があります。

私は同じ問題に直面していて、 skip_destroyを設定するのに役立ちます

インスタンスにアタッチされたaws_ebs_volumeの破棄で同様の問題が発生しました。
アプリケーションがインスタンスでボリューム(ディスクスペース)を使用できるようにするには、次の手順を実行する必要があります。

  • AWSボリュームを作成する
  • インスタンスにアタッチします
  • そのディスク上にファイルシステムを作成する
  • マウントポイントフォルダを作成します
  • fstabにマウントポイントを追加します
  • マウントする
  • 使用を開始します(通常はアプリケーションを実行します)

そこで、マウントされたボリュームをインスタンスから手動でデタッチしようとしましたが、しばらくすると、次のメモで失敗しました。
.... /dev/xvdg (busy)
これに基づいて、terraformはマウントされたボリュームをインスタンスから強制的に削除できないという結論に達しました。 どちらが正しい。 したがって、ボリュームをデタッチするために、ボリュームをデタッチする前にボリュームを安全にアンマウントする、いわゆるプロシージャを作成しました。

  • ボリュームの使用を停止します(アプリケーションを停止します)
  • マウントを解除します
  • fstabからマウントポイントを削除します(永続的な場合はオプション)
  • マウントフォルダを削除します(永続的な場合はオプション)
  • インスタンスから切り離す
  • AWSボリュームを削除します

コードでは次のようになります。

# 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 = .....
......
}

したがって、アイデアは、ボリュームが切り離される前にボリュームを解放することです。
それが誰かを助けることを願っています。

このページは役に立ちましたか?
0 / 5 - 0 評価