Terraform-provider-aws: aws_alb_target_groupは、アタッチされたリスナーで再作成できません

作成日 2017年06月13日  ·  33コメント  ·  ソース: hashicorp/terraform-provider-aws

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


やあ、

新しいリソースを強制するaws_alb_target_groupのポートを変更しました。
ターゲットグループを削除しようとしているときよりも。 次のエラーが発生します:

Error deleting Target Group: ResourceInUse: Target group 'xxxx' is currently in use by a listener or a rule status code: 400, request id: 747913f1-1213-11e7-916c-3f605d5e091b

したがって、最初にリスナーを削除する必要があると思います。 それは私が問題を解決するために手動で行ったことです。

Terraformバージョン

Terraform v0.9.1

影響を受けるリソース

  • aws_alb_target_group
  • aws_alb_listener_rule
servicelbv2

最も参考になるコメント

nametagsに移動し、 create_before_destroyを有効にすることで、問題が解決します。

resource "aws_alb_target_group" "test" {
  lifecycle {
    create_before_destroy = true
  }

  port     = "8081"
  protocol = "HTTP"
  vpc_id   = "${var.vpc_id}"


  tags {
    Name = "test"
  }
}

全てのコメント33件

私も0.9.8でこれに遭遇しています

@radeksimkoこれも難しい問題です。 私たちがそれを解決するのを手伝ってくれませんか? それを解決する適切な方法は何ですか?

私の知る限り、破壊を防ぐために「使用中のリソース」には2つの可能性があります。

  1. aws_alb_listenerのデフォルトアクション
  2. aws_alb_listener_ruleの一部

「force_destroy」のようなパラメータを追加することを検討しています。 これを有効にするには、リスナーではなく、ルールよりもすべてのロードバランサーを強制的に反復します。 ルールとの関係の場合、ルールも削除されます。 これは2番目の問題を解決します。 最初の候補についてはよくわかりませんが、次の候補targetをデフォルトの候補として設定できます。 これはそれほど悪くはないようです。

@radeksimkoはどう思いますか?

ところで、この問題は以前のトラッカーのトップの問題の1つでした。 :)

0.9.11でも同じ

追加した

  lifecycle {
    create_before_destroy = true
  }

リスナーとターゲットグループに送信し、変更を加えて再適用を正常に実行できました。 どちらがトリックをしたのかわからない。

@spanktarターゲットグループ名は一意である必要があるため、ターゲットグループ名が変更されない場合は機能しないようです。 確認または拒否できますか?

ターゲットグループ名が変更されない場合、 @spanktarのソリューションは機能しません。

@varjoinencreate_before_destroyでname_prefixを使用する必要があります。

@hoffmannliu-aylaこれが修正されたらいいでしょうhttps://github.com/terraform-providers/terraform-provider-aws/issues/1301

ライフサイクルポリシーでcreate_before_destroyを使用してターゲットグループのリソースIDにrandom_id|petを追加し、リソースを次のように循環させようとするものにランダムIDのキーパーを使用できます。回避策。

うまくいった@GrantSheehan 、ありがとう。 恐ろしいですが、それは仕事を成し遂げます。

私のユースケースでは、あなたのアイデアを少し修正することになりました。

resource "random_string" "target_group" {
  length = 8
  special = false
}


resource "aws_lb_target_group" "preview" {
  # Target group names conflict on update, hence the random 
  name     = "my-name-${random_string.target_group.result}"
  ...

  lifecycle {
    create_before_destroy = true
    ignore_changes = ["name"]
  }
}

キーパーなしで、変更があれば自動的に更新します。

@hrabanTerraformは私の側ではそれが好きではありません
エラーは
aws_alb_target_group.blabla-tg:aws_alb_target_group.blabla-tg:適用中に差分が一致しませんでした。 これはTerraformのバグであり、GitHubの問題として報告する必要があります

わかりました。バグレポートの進捗状況をお知らせください。

@hrabanのソリューションは11.1.0では機能しません

*(再度適用する前に、競合するルール/添付ファイルを手動で削除できると思いますが、これは理想的ではありません)

-机の上で顔をバタンと閉めると、傷が止まります-

nametagsに移動し、 create_before_destroyを有効にすることで、問題が解決します。

resource "aws_alb_target_group" "test" {
  lifecycle {
    create_before_destroy = true
  }

  port     = "8081"
  protocol = "HTTP"
  vpc_id   = "${var.vpc_id}"


  tags {
    Name = "test"
  }
}

この問題を回避するために、 https://www.terraform.io/docs/providers/random/r/id.htmlも使用しています。

私たちが知ったように、問題は実際には、新しいターゲットグループが作成される前にリソースを削除できないことです。 create_before_destroyをtrueに設定することで、 lifecycle属性を使用してこれを回避します。
残念ながら、リソース名が静的である場合、名前の衝突が発生するという問題が発生します。 これは、新しいターゲットグループの作成を強制する属性が変更された場合の問題にすぎません。 その動作を強制する属性は、 https://github.com/terraform-providers/terraform-provider-aws/blob/master/aws/resource_aws_lb_target_group.go#L48で明確に定義されています。

問題の解決策は、実装、モジュールでの抽象化、またはインラインでの解決が可能です。このインラインでの修正方法についての解決策を投稿します。

locals {
  LB-name = "${terraform.workspace}-LB"
  LB-protocol = "HTTP"
  LB-vpc-id = "${var.vpc-id}"
  LB-target-type = "ip"
}

resource "random_id" "LB" {
  keepers {
    name = "${local.LB-name}"
    protocol = "${local.LB-protocol}"
    vpc_id ="${local.LB-vpc-id}"
    target_type = "${local.LB-target-type}"
  }
  byte_length = 4
}

resource "aws_lb_target_group" "LB" {
  name = "${local.LB-name}-${random_id.LB.hex}"
  port = 9292
  protocol = "${local.LB-protocol}"
  vpc_id ="${local.LB-vpc-id}"
  target_type = "${local.LB-target-type}"

  lifecycle {
    create_before_destroy = true
  }
}

私の場合、 nameprotocolvpc_id 、およびtarget_typeは属性を変更する可能性があり、変更すると新しいターゲットグループが強制的に作成されます。 それらをローカル変数に抽出し、キーパーとしてrandom_idリソースに渡します。これは基本的に、「キーパーマップの属性が変更されない場合、random_idリソースの出力は静的なままです」という行を読み取ります。 portをキーパーマップ(およびローカル変数)に意図的に追加しませんでした。これは、新しいターゲットグループを強制的に作成することはありませんが、その場で更新できるためです。

target_groups名の中でrandom_id.LB.hexを使用していることに注意してください。これにより、keepers属性が変更されると、ターゲットグループの名前が変更され、名前の衝突の問題を回避できます。

とは言うものの、これは問題に対する一般的な高レベルのソリューションであり、プロバイダーまたはコア内で修正できるとよいでしょう。 ソリューションは確かにモジュールに抽象化することもできます。

私は最近この問題を経験しました。

AWSコンソールでリスナーを削除しました。 次に、テラフロム計画/適用を実行し、それが機能しました。

${substr(uuid(),0, 3)}を使用するとうまくいきました

resource "aws_lb_target_group" "preview" {
  # Target group names conflict on update, hence the random 
  name     = "my-name-${${substr(uuid(),0, 3)}}"
  ...

  lifecycle {
    create_before_destroy = true
    ignore_changes = ["name"]
  }
}

3文字のランダムな文字列をカットするポイントは実際にはわかりません。その粒度では、衝突が発生する可能性があります。

0.11.13でもまだ問題

そしてまだ0.12.3で問題

私はuuidソリューションを試しましたが、他のものが変更されていない場合は変更しないようにする必要があり、その方法がわかりません。

上記の回避策と同様に、これまでのところrandom_integerを使用して適切な成功を収めました。 私はキーパーを通して値を引き出すようにします。

resource "random_integer" "web_target_group_id" {
  min = 1
  max = 999

  keepers = {
    port        = "${local.web_port}"
    protocol    = "HTTP"
    vpc_id      = "${var.vpc_id}"
  }
}
resource "aws_lb_target_group" "web" {
  name                 = "foo-web-${random_integer.web_target_group_id.result}"
  port                 = "${random_integer.web_target_group_id.keepers.port}"
  protocol             = "${random_integer.web_target_group_id.keepers.protocol}"
  vpc_id               = "${random_integer.web_target_group_id.keepers.vpc_id}"

  lifecycle {
    create_before_destroy = true
  }

  # ...etc
}

v0.12.4でこれを見る

これをv0.12.8で見る

これをv0.12.9で見る

これをv0.12.10で見る

この号は現在3年前のものです。

これはTerraformv0.12.24とprovider.awsv2.58.0で入手しました。

v0.12.24と同じ問題:
エラー:ターゲットグループの削除中にエラーが発生しました:ResourceInUse:ターゲットグループ'arn :aws :elasticload balanceing :XXXXXXXXXXXX 'は現在リスナーまたはルールによって使用されています
ステータスコード:400、リクエストID:XXXXXXXX

これに対する回避策はありますか? 私もそれを乗り越えられないようです。

皆さんこんにちは。

ご覧のとおり、AWS APIでは、リスナールールがアタッチされている場合にターゲットグループを削除することはできません。 ターゲットグループのポート番号が変更されると、ターゲットグループが強制的に再作成されます。 残念ながら、現在Terraformには「別のリソースが削除されたときにこのリソースも削除する」と言う方法はありませんが、対処方法についてはいくつか考えています

name引数に加えて、 aws_alb_target_groupname_prefix $をサポートし、どちらも指定されていない場合はランダムな名前も生成します。 https://github.com/terraform-providers/terraform-provider-aws/issues/636#issuecomment -397459646で提案されているように、名前は代わりにNameタグで設定できます。 name_prefixの仕組みとターゲットグループ名の長さの制限により、プレフィックスは6文字のみにすることができます。

randomプロバイダーを使用して名前に一意性を追加する他のソリューションのいくつかも同様に機能します。

lifecycle { create_before_destroy = true }を設定することも、リソース間の依存関係のサイクルを断ち切るために必要です。

これはAWSAPIの制限であり、Terraformがリソースを処理する方法であり、AWSプロバイダーでは対処できないため、この問題を解決します。 この問題に対処するために使用できる回避策がいくつかあります。

aws_alb_target_groupの名前を変更したり、名前を変更したりして、これを乗り越えました

この問題は_30日間_⏳クローズされているため、ロックします。 これは、メンテナがアクティブな問題を見つけて集中するのに役立ちます。

この問題を再開する必要があると思われる場合は、コンテキストを追加するために、この問題にリンクする新しい問題を作成することをお勧めします。 ありがとう!

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