{"record":{"id":"a314ea14555c5e4f","repo":"hashicorp/terraform","slug":"bucket-s-not-exists","errorCode":null,"errorMessage":"bucket %s not exists","messagePattern":"bucket (.+?) not exists","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/backend/remote-state/cos/client.go","lineNumber":285,"sourceCode":"\n\tlog.Printf(\"[DEBUG] deleteObject %s: code: %d, error: %v\", cosFile, rsp.StatusCode, err)\n\tif rsp.StatusCode == 404 {\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to delete file %v: %v\", cosFile, err)\n\t}\n\n\treturn nil\n}\n\n// getBucket list bucket by prefix\nfunc (c *remoteClient) getBucket(prefix string) (obs []cos.Object, err error) {\n\tfs, rsp, err := c.cosClient.Bucket.Get(c.cosContext, &cos.BucketGetOptions{Prefix: prefix})\n\tif rsp == nil {\n\t\tlog.Printf(\"[DEBUG] getBucket %s/%s: error: %v\", c.bucket, prefix, err)\n\t\terr = fmt.Errorf(\"bucket %s not exists\", c.bucket)\n\t\treturn\n\t}\n\tdefer rsp.Body.Close()\n\n\tlog.Printf(\"[DEBUG] getBucket %s/%s: code: %d, error: %v\", c.bucket, prefix, rsp.StatusCode, err)\n\tif rsp.StatusCode == 404 {\n\t\terr = fmt.Errorf(\"bucket %s not exists\", c.bucket)\n\t\treturn\n\t}\n\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn fs.Contents, nil\n}\n\n// putBucket create cos bucket","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/backend/remote-state/cos/client.go#L267-L303","documentation":"Raised by getBucket() when cosClient.Bucket.Get returns a nil response. The client interprets an absent response as the bucket not existing (rather than a generic network error), so the message is 'bucket %s not exists'. This is the request-never-completed branch.","triggerScenarios":"At client.go:282-286: rsp == nil from Bucket.Get. Triggered when listing objects fails before any response: DNS/transport failure, auth failure surfacing as no-response, or context cancellation. Commonly hit during deleteBucket(recursive) which calls getBucket(\"\") to enumerate objects.","commonSituations":"Wrong bucket name in backend config; bucket in a different region/endpoint than configured; credentials lack 'cos:GetBucket' (ListBucket); network outage during 'terraform destroy' that enumerates bucket contents before deletion.","solutions":["Confirm the bucket name exists and matches the configured region (coscli ls or Tencent console).","Verify network/DNS reachability to the COS endpoint.","Grant the principal 'cos:GetBucket' (list) permission in CAM.","Retry — a nil response can also be a transient transport failure."],"exampleFix":"# confirm bucket exists in the right region\ncoscli ls -e cos.ap-guangzhou.myqcloud.com | grep tf-state\n# verify CAM has cos:GetBucket\n","handlingStrategy":"validation","validationCode":"// Confirm the bucket is listable before operations that enumerate it.\nfunc canListBucket(ctx context.Context, c *cos.Client) error {\n    _, _, err := c.Bucket.Get(ctx, &cos.BucketGetOptions{Prefix: \"\"})\n    return err\n}","typeGuard":null,"tryCatchPattern":"if _, err := c.getBucket(\"\"); err != nil {\n    if strings.Contains(err.Error(), \"not exists\") {\n        // could be a real 404 OR a nil-response transport failure -> verify both\n    }\n}","preventionTips":["Validate bucket name and region in the backend config.","Grant cos:GetBucket to the principal.","Don't conflate a nil response with a true 404 — verify connectivity."],"tags":["cos","tencent-cloud","bucket","list","network","config"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}