_この問題は、もともと@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 v0.9.1
私も0.9.8でこれに遭遇しています
@radeksimkoこれも難しい問題です。 私たちがそれを解決するのを手伝ってくれませんか? それを解決する適切な方法は何ですか?
私の知る限り、破壊を防ぐために「使用中のリソース」には2つの可能性があります。
aws_alb_listener
のデフォルトアクション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では機能しません
*(再度適用する前に、競合するルール/添付ファイルを手動で削除できると思いますが、これは理想的ではありません)
-机の上で顔をバタンと閉めると、傷が止まります-
name
をtags
に移動し、 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
}
}
私の場合、 name
、 protocol
、 vpc_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_group
はname_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日間_⏳クローズされているため、ロックします。 これは、メンテナがアクティブな問題を見つけて集中するのに役立ちます。
この問題を再開する必要があると思われる場合は、コンテキストを追加するために、この問題にリンクする新しい問題を作成することをお勧めします。 ありがとう!
最も参考になるコメント
name
をtags
に移動し、create_before_destroy
を有効にすることで、問題が解決します。