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 bucket

View on GitHub (pinned to c9def3e214)

Solutions

  1. Confirm the bucket name exists and matches the configured region (coscli ls or Tencent console).
  2. Verify network/DNS reachability to the COS endpoint.
  3. Grant the principal 'cos:GetBucket' (list) permission in CAM.
  4. 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

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


AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07). Data as JSON: /api/errors/a314ea14555c5e4f. Report an issue: GitHub.