{"record":{"id":"c559b3a706e3c7b1","repo":"kubernetes/kops","slug":"provider-id-cannot-be-empty","errorCode":null,"errorMessage":"provider ID cannot be empty","messagePattern":"provider ID cannot be empty","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodeidentity/do/identify.go","lineNumber":122,"sourceCode":"\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn \"\", fmt.Errorf(\"droplet metadata returned non-200 status code: %d\", resp.StatusCode)\n\t}\n\n\tbodyBytes, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to read metadata information %s: %v\", url, err)\n\t}\n\n\treturn string(bodyBytes), nil\n}\n\n// IdentifyNode queries DigitalOcean for the node identity information.\nfunc (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*nodeidentity.Info, error) {\n\tproviderID := node.Spec.ProviderID\n\tif providerID == \"\" {\n\t\treturn nil, errors.New(\"provider ID cannot be empty\")\n\t}\n\n\tconst prefix = \"digitalocean://\"\n\tif !strings.HasPrefix(providerID, prefix) {\n\t\treturn nil, fmt.Errorf(\"provider ID %q is missing prefix %q\", providerID, prefix)\n\t}\n\n\tinstanceID := strings.TrimPrefix(providerID, prefix)\n\tif instanceID == \"\" {\n\t\treturn nil, errors.New(\"provider ID number cannot be empty\")\n\t}\n\n\tif i.cacheEnabled {\n\t\tif obj, exists, err := i.cache.GetByKey(instanceID); err != nil {\n\t\t\tklog.Warningf(\"Nodeidentity info cache lookup failure: %v\", err)\n\t\t} else if exists {\n\t\t\treturn obj.(*nodeidentity.Info), nil\n\t\t}","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodeidentity/do/identify.go#L104-L140","documentation":"Wraps a failure of the autoscaling DescribeTags paginator in FindAutoscalingGroups. kOps pages through ASG tags filtering by the cluster's tags to discover groups; any page-level API error is wrapped with this message.","triggerScenarios":"DescribeTags NextPage fails: missing autoscaling:DescribeTags IAM permission, throttling (common with many tag pages), invalid filter combinations, or endpoint/network failure.","commonSituations":" IAM policy scoping that omits DescribeTags; thousands of tagged resources causing heavy throttling during discovery; corporate proxy blocking the autoscaling endpoint.","solutions":["Add autoscaling:DescribeTags to the kOps IAM policy","Retry with backoff; consider smaller tag filters to reduce pages","Verify network access to the autoscaling endpoint in the cluster region","Run the DescribeTags call via aws CLI to reproduce and see the raw error"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"_, err := client.DescribeTags(ctx, &autoscaling.DescribeTagsInput{MaxRecords: aws.Int32(1)})\nif err != nil { return fmt.Errorf(\"autoscaling DescribeTags unavailable: %w\", err) }","typeGuard":null,"tryCatchPattern":"var throttle *types.ThrottlingException\nerr := cloud.GetCloudGroups(ctx, cluster, igs, true, nodes)\nif errors.As(err, &throttle) || strings.Contains(err.Error(), \"error listing autoscaling cluster tags\") {\n  retryWithExponentialBackoff()\n}","preventionTips":["Grant autoscaling:DescribeTags in the IAM policy","Use precise Filters (cluster tag key/value) to minimize pages","Apply backoff for clusters with many tagged resources","Verify endpoint reachability (VPC endpoints/proxies)"],"tags":["aws","autoscaling","tags","iam"],"backgroundTag":"aws-api-error-wrapped","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"}