hashicorp/terraform · error
bucket %s not exists
Error message
bucket %s not exists
What it means
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.
Source
Thrown at internal/backend/remote-state/cos/client.go:285
log.Printf("[DEBUG] deleteObject %s: code: %d, error: %v", cosFile, rsp.StatusCode, err)
if rsp.StatusCode == 404 {
return nil
}
if err != nil {
return fmt.Errorf("failed to delete file %v: %v", cosFile, err)
}
return nil
}
// getBucket list bucket by prefix
func (c *remoteClient) getBucket(prefix string) (obs []cos.Object, err error) {
fs, rsp, err := c.cosClient.Bucket.Get(c.cosContext, &cos.BucketGetOptions{Prefix: prefix})
if rsp == nil {
log.Printf("[DEBUG] getBucket %s/%s: error: %v", c.bucket, prefix, err)
err = fmt.Errorf("bucket %s not exists", c.bucket)
return
}
defer rsp.Body.Close()
log.Printf("[DEBUG] getBucket %s/%s: code: %d, error: %v", c.bucket, prefix, rsp.StatusCode, err)
if rsp.StatusCode == 404 {
err = fmt.Errorf("bucket %s not exists", c.bucket)
return
}
if err != nil {
return
}
return fs.Contents, nil
}
// putBucket create cos bucketView on GitHub (pinned to c9def3e214)
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.
Example fix
# confirm bucket exists in the right region coscli ls -e cos.ap-guangzhou.myqcloud.com | grep tf-state # verify CAM has cos:GetBucket
Defensive patterns
Strategy: validation
Validate before calling
// Confirm the bucket is listable before operations that enumerate it.
func canListBucket(ctx context.Context, c *cos.Client) error {
_, _, err := c.Bucket.Get(ctx, &cos.BucketGetOptions{Prefix: ""})
return err
} Try / catch
if _, err := c.getBucket(""); err != nil {
if strings.Contains(err.Error(), "not exists") {
// could be a real 404 OR a nil-response transport failure -> verify both
}
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- failed to create bucket %v: %v
- failed to empty bucket %v: %v
- failed to delete bucket %v: %v
- failed to open file at %v: %v
- failed to save file to %v: %v
AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07).
Data as JSON: /api/errors/a314ea14555c5e4f.
Report an issue: GitHub.