{"record":{"id":"c05e9052182d12c1","repo":"kubernetes/kops","slug":"error-deleting-elb-targetgroup-q-w","errorCode":null,"errorMessage":"error deleting ELB TargetGroup %q: %w","messagePattern":"error deleting ELB TargetGroup %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/awstasks/targetgroup.go","lineNumber":551,"sourceCode":"\treturn d\n}\n\nvar _ fi.CloudupDeletion = (*deleteTargetGroup)(nil)\n\nfunc (d *deleteTargetGroup) Delete(t fi.CloudupTarget) error {\n\tctx := context.TODO()\n\n\tawsTarget, ok := t.(*awsup.AWSAPITarget)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected target type for deletion: %T\", t)\n\t}\n\n\tarn := d.obj.ARN\n\tklog.V(2).Infof(\"deleting target group %q\", arn)\n\tif _, err := awsTarget.Cloud.ELBV2().DeleteTargetGroup(ctx, &elbv2.DeleteTargetGroupInput{\n\t\tTargetGroupArn: &arn,\n\t}); err != nil {\n\t\treturn fmt.Errorf(\"error deleting ELB TargetGroup %q: %w\", arn, err)\n\t}\n\n\treturn nil\n}\n\n// String returns a string representation of the task\nfunc (d *deleteTargetGroup) String() string {\n\treturn d.TaskName() + \"-\" + d.Item()\n}\n\nfunc (d *deleteTargetGroup) TaskName() string {\n\treturn \"target-group\"\n}\n\nfunc (d *deleteTargetGroup) Item() string {\n\treturn d.obj.ARN\n}\n","sourceCodeStart":533,"sourceCodeEnd":569,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/awstasks/targetgroup.go#L533-L569","documentation":"This wraps any error from the ELBV2 DeleteTargetGroup API during target group deletion (cluster teardown or task deprecation). Common AWS-side causes: target group still referenced by a listener/load balancer, invalid ARN, or throttling.","triggerScenarios":"`kops delete cluster` or apply removing a TargetGroup; DeleteTargetGroup fails because the group is in use by an active listener, the ARN is stale (already deleted), IAM lacks elasticloadbalancing:DeleteTargetGroup, or throttling.","commonSituations":"Deletion order races where the NLB/listener still references the group; orphaned target groups with stale ARNs from a previous failed apply; IAM policy restrictions; ResourceInUse errors during teardown.","solutions":["Check the wrapped AWS error code; ResourceInUse means delete the NLB/listeners first, then re-run deletion","If the group was already deleted (InvalidNotFound), the error is benign — re-running the delete converges","Verify IAM elasticloadbalancing:DeleteTargetGroup permission","Retry after throttling or transient 5xx"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// before delete, check for listeners referencing the group\nlgs, _ := elbv2.DescribeListeners(&elbv2.DescribeListenersInput{LoadBalancerArn: &nlbArn})\nfor _, l := range lgs.Listeners {\n  if l.TargetGroupArn != nil && *l.TargetGroupArn == arn { return errors.New(\"listener still references target group; delete listener first\") }\n}","typeGuard":null,"tryCatchPattern":"if _, err := elbv2.DeleteTargetGroup(ctx, in); err != nil {\n  var nf *types.TargetGroupNotFound\n  if errors.As(err, &nf) { return nil } // already gone: treat as success\n  return fmt.Errorf(\"error deleting ELB TargetGroup %q: %w\", arn, err)\n}","preventionTips":["Delete NLBs/listeners before target groups","Treat NotFound on delete as success for idempotent teardown","Verify IAM delete permissions","Retry throttled deletions with backoff"],"tags":["aws","elbv2","deletion","target-group"],"backgroundTag":"resource-in-use","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}