{"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":"exception","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/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/backend/remote-state/cos/client.go#L229-L265","documentation":"Returned by putObject() when the COS SDK returns a nil response pointer from Object.Put. Identical in shape to error 201 but on the write path: no HTTP response was ever received, indicating a transport-level failure to reach COS for the PUT. The original SDK error is wrapped.","triggerScenarios":"c.cosClient.Object.Put(...) returns (nil, err) — network unreachable, invalid endpoint, DNS failure, TLS handshake failure, credentials missing so the SDK cannot sign, or context cancellation before the request completed.","commonSituations":"Backend configured without a valid `region`/`endpoint`; rotated Tencent Cloud keys not refreshed in env/backend; running Terraform in a sandboxed CI runner without outbound access to `cos.<region>.myqcloud.com`; large state PUT exceeding a network middlebox limit and the connection being reset.","solutions":["Inspect the wrapped error and the DEBUG line `putObject <file>: error:`.","Verify TENCENTCLOUD_SECRETID/SECRETKEY and the bucket region/endpoint.","Test outbound HTTPS connectivity from the host to the COS endpoint.","Retry once transient issues are excluded; for large states, ensure no middlebox is truncating PUT bodies."],"exampleFix":"// before: missing region, PUT cannot be signed/sent\nbackend \"cos\" { bucket=\"tf-state\"; secret_id=\"...\"; secret_key=\"...\" }\n// after: include region\nbackend \"cos\" { bucket=\"tf-state\"; region=\"ap-shanghai\"; secret_id=\"...\"; secret_key=\"...\" }","handlingStrategy":"retry","validationCode":"// Validate write-path connectivity before applying\nfunc canWriteObject(ctx context.Context, client *cos.Client, key string) error {\n    // probe with a HEAD on the bucket; for create semantics, attempt a tiny PUT to a probe key\n    rsp, err := client.Object.Put(ctx, key+\".probe\", bytes.NewReader([]byte(\"x\")), nil)\n    if rsp == nil { return fmt.Errorf(\"transport failure writing to COS: %w\", err) }\n    rsp.Body.Close()\n    if rsp.StatusCode >= 400 { return fmt.Errorf(\"write probe failed: %d\", rsp.StatusCode) }\n    client.Object.Delete(ctx, key+\".probe\")\n    return nil\n}","typeGuard":"func isNilResponse(rsp *cos.Response) bool { return rsp == nil }","tryCatchPattern":"// On PUT with nil response, retry with exponential backoff (transport-level):\nbackoff.Retry(func() error {\n    rsp, err := client.Object.Put(ctx, key, r, opt)\n    if rsp == nil { return err } // retryable\n    defer rsp.Body.Close()\n    if err != nil { return backoff.Permanent(err) }\n    return nil\n}, backoff.NewExponentialBackOff())","preventionTips":["Run Terraform from hosts with reliable outbound HTTPS to COS.","Set sensible HTTP timeouts and retries on the COS SDK client for write paths.","Validate credentials and region before `terraform apply`.","For large states, ensure no middlebox truncates PUT bodies."],"tags":["terraform","cos","tencent-cloud","network","credentials","write-path","remote-state","go"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}