{"record":{"id":"e5257895ed933cf8","repo":"kubernetes/kops","slug":"error-deleting-eni-q-v","errorCode":null,"errorMessage":"error deleting ENI %q: %v","messagePattern":"error deleting ENI %q: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/aws/eni.go","lineNumber":53,"sourceCode":"\tc := cloud.(awsup.AWSCloud)\n\n\tid := r.ID\n\n\tklog.V(2).Infof(\"Deleting EC2 ENI %q\", id)\n\trequest := &ec2.DeleteNetworkInterfaceInput{\n\t\tNetworkInterfaceId: &id,\n\t}\n\t_, err := c.EC2().DeleteNetworkInterface(ctx, request)\n\tif err != nil {\n\t\tif awsup.AWSErrorCode(err) == \"InvalidNetworkInterfaceID.NotFound\" {\n\t\t\t// Concurrently deleted\n\t\t\treturn nil\n\t\t}\n\n\t\tif IsDependencyViolation(err) {\n\t\t\treturn err\n\t\t}\n\t\treturn fmt.Errorf(\"error deleting ENI %q: %v\", id, err)\n\t}\n\treturn nil\n}\n\nfunc DumpENI(op *resources.DumpOperation, r *resources.Resource) error {\n\tdata := make(map[string]interface{})\n\tdata[\"id\"] = r.ID\n\tdata[\"type\"] = ec2types.ResourceTypeNetworkInterface\n\tdata[\"raw\"] = r.Obj\n\n\top.Dump.Resources = append(op.Dump.Resources, data)\n\n\treturn nil\n}\n\nfunc DescribeENIs(cloud fi.Cloud, vpcID, clusterName string) (map[string]ec2types.NetworkInterface, error) {\n\tif vpcID == \"\" {\n\t\treturn nil, nil","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/aws/eni.go#L35-L71","documentation":"kOps wraps the AWS SDK error from ec2.DeleteNetworkInterface in DeleteENI. DependencyViolation errors are returned unmodified (so the resource tracker can retry later), NoSuchEntity is treated as already deleted, and anything else is wrapped with this message. It means the ENI could not be deleted for a reason other than a pending dependency or prior deletion.","triggerScenarios":"DeleteNetworkInterface returns an unexpected error: AccessDenied on ec2:DeleteNetworkInterface, AuthFailure/InvalidNetworkInterface.ID.NotFound variants not matched by the pre-checks, throttling, or request serialization failures.","commonSituations":"IAM policy restricting deletion to specific ENI ARNs; EC2 API throttling during large cluster teardown; ENI attached to a resource that keeps returning errors other than DependencyViolation (e.g. service-linked state).","solutions":["Check the wrapped error's code; if AccessDenied, grant ec2:DeleteNetworkInterface","Re-run the delete — kOps retries DependencyViolation cases automatically and treats missing ENIs as success","Check `aws ec2 describe-network-interfaces --network-interface-ids <id>` for its attachment status","If throttled, retry after backoff"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// preflight: confirm ENI exists and is available before delete\nout, err := ec2Client.DescribeNetworkInterfaces(ctx, &ec2.DescribeNetworkInterfacesInput{NetworkInterfaceIds: []string{id}})\nif err == nil && len(out.NetworkInterfaces) > 0 && out.NetworkInterfaces[0].Status == \"available\" { /* safe to delete */ }","typeGuard":"func isDependencyViolation(err error) bool {\n  return awsup.AWSErrorCode(err) == \"DependencyViolation\" || strings.Contains(err.Error(), \"DependencyViolation\")\n}","tryCatchPattern":"err := DeleteENI(ctx, cloud, eniID)\nswitch {\ncase awsup.AWSErrorCode(err) == \"InvalidNetworkInterfaceID.NotFound\": // already deleted, ok\ncase isDependencyViolation(err): // schedule retry later\ndefault: return err\n}","preventionTips":["Retry deletions with backoff — kOps re-runs cleanup on subsequent passes","Grant ec2:DeleteNetworkInterface broadly or per-VPC","Check attachment status before manual deletes","Watch for ENIs held by service-linked resources (ELB, NAT) that must be deleted first"],"tags":["aws","ec2","eni","deletion"],"backgroundTag":"aws-eni-delete-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}