{"record":{"id":"615d3e15ad41daf0","repo":"hashicorp/terraform","slug":"failed-to-save-file-to-v-v","errorCode":null,"errorMessage":"failed to save file to %v: %v","messagePattern":"failed to save file to (.+?): (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/backend/remote-state/cos/client.go","lineNumber":247,"sourceCode":"\t\tObjectPutHeaderOptions: &cos.ObjectPutHeaderOptions{\n\t\t\tXCosMetaXXX: &http.Header{\n\t\t\t\t\"X-Cos-Meta-Md5\": []string{fmt.Sprintf(\"%x\", md5.Sum(data))},\n\t\t\t},\n\t\t},\n\t\tACLHeaderOptions: &cos.ACLHeaderOptions{\n\t\t\tXCosACL: c.acl,\n\t\t},\n\t}\n\n\tif c.encrypt {\n\t\topt.ObjectPutHeaderOptions.XCosServerSideEncryption = \"AES256\"\n\t}\n\n\tr := bytes.NewReader(data)\n\trsp, err := c.cosClient.Object.Put(c.cosContext, cosFile, r, opt)\n\tif rsp == nil {\n\t\tlog.Printf(\"[DEBUG] putObject %s: error: %v\", cosFile, err)\n\t\treturn fmt.Errorf(\"failed to save file to %v: %v\", cosFile, err)\n\t}\n\tdefer rsp.Body.Close()\n\n\tlog.Printf(\"[DEBUG] putObject %s: code: %d, error: %v\", cosFile, rsp.StatusCode, err)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to save file to %v: %v\", cosFile, err)\n\t}\n\n\treturn nil\n}\n\n// deleteObject delete remote object\nfunc (c *remoteClient) deleteObject(cosFile string) error {\n\trsp, err := c.cosClient.Object.Delete(c.cosContext, cosFile)\n\tif rsp == nil {\n\t\tlog.Printf(\"[DEBUG] deleteObject %s: error: %v\", cosFile, err)\n\t\treturn fmt.Errorf(\"failed to delete file %v: %v\", cosFile, err)\n\t}","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/backend/remote-state/cos/client.go#L229-L265","documentation":"Raised by putObject() when cosClient.Object.Put returns a nil response, meaning the HTTP request never produced a response object. The error wraps the underlying transport error. This path (rsp == nil) indicates the request failed before any COS response was received.","triggerScenarios":"At client.go:244-247, the Put call returns (nil, err). Occurs on DNS resolution failure, connection refused, TLS handshake error, context cancellation before the request was sent, or the SDK's internal retry budget being exhausted with no successful response.","commonSituations":"Wrong region/endpoint in the backend config (bucket URL typo); network outage or firewall blocking egress to cos.*.myqcloud.com; expired/invalid SecretId/SecretKey causing auth-layer failure before a response; VPN/proxy dropping the connection; terraform killed (Ctrl-C) during the write.","solutions":["Verify network connectivity and DNS to the bucket endpoint: 'curl -I https://<bucket>.cos.<region>.myqcloud.com'.","Confirm the bucket name and region in the backend block match the actual COS bucket.","Check that the Tencent Cloud credentials (SecretId/SecretKey/SecurityToken) are valid and not expired, and that the COS/Tag STS scope covers object writes.","Retry the apply — transient transport errors frequently clear on the next attempt."],"exampleFix":"# verify endpoint reachability and credentials\ncurl -I https://tf-state-1234567890.cos.ap-guangzhou.myqcloud.com\n# check region/bucket name in the backend block\nterraform init -backend=false\n","handlingStrategy":"retry","validationCode":"// Preflight: confirm the endpoint resolves and credentials work.\nfunc cosReachable(ctx context.Context, endpoint string) error {\n    req, _ := http.NewRequestWithContext(ctx, \"HEAD\", endpoint, nil)\n    _, err := http.DefaultClient.Do(req)\n    return err\n}","typeGuard":null,"tryCatchPattern":"if err := c.putObject(c.stateFile, data); err != nil {\n    if strings.Contains(err.Error(), \"failed to save file to\") {\n        // transport-level; safe to retry the Put\n    }\n}","preventionTips":["Validate bucket name/region in the backend block before init.","Run from a host with reliable egress to cos.*.myqcloud.com.","Keep credentials fresh (rotate STS before expiry)."],"tags":["cos","tencent-cloud","network","transport","write","transient"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}