kubernetes/kops · error

rendering S3 file: %v

Error message

rendering S3 file: %v

What it means

Returned by MemFSPath.renderTerraformS3 (used in tests with a fake S3 backend) when the TerraformWriter rejects the embedded file content — typically a name collision in AddFileBytes or the recorded content hash already existing under a different name. The data itself was read successfully; the failure is in the writer/bookkeeping step.

Source

Thrown at util/pkg/vfs/memfs.go:283

		Provider:           terraformWriter.LiteralTokens("azurerm", "files"),
	}
	return w.RenderResource("azurerm_storage_blob", name, tf)
}

func (p *MemFSPath) renderTerraformS3(w *terraformWriter.TerraformWriter, name string, data io.Reader, acl ACL) error {
	bytes, err := io.ReadAll(data)
	if err != nil {
		return fmt.Errorf("reading data: %v", err)
	}

	tfProviderArguments := map[string]string{
		"region": "us-test-1",
	}
	w.EnsureTerraformProvider("aws", tfProviderArguments)

	content, err := w.AddFileBytes("aws_s3_object", name, "content", bytes, false)
	if err != nil {
		return fmt.Errorf("rendering S3 file: %v", err)
	}

	var requestAcl *string
	if acl != nil {
		s3Acl, ok := acl.(*S3Acl)
		if !ok {
			return fmt.Errorf("write to %s with ACL of unexpected type %T", p, acl)
		}
		if s3Acl != nil && s3Acl.RequestACL != nil {
			aclVal := string(*s3Acl.RequestACL)
			requestAcl = &aclVal
		}
	}

	tf := &terraformMemFSFile{
		Bucket:   "testingBucket",
		Key:      p.location,
		Content:  content,

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped error; if it is a duplicate-name error, derive unique resource names from the path
  2. Use a fresh TerraformWriter for each full render pass
  3. Verify the name argument passed to RenderTerraform matches kOps' expected naming scheme

Example fix

// before
content, err := w.AddFileBytes("aws_s3_object", name, "content", bytes, false)
// after
if err != nil {
    return fmt.Errorf("rendering S3 file %q: %w", name, err) // surface which name failed
}
Defensive patterns

Strategy: validation

Validate before calling

if name == "" { return errors.New("empty terraform resource name") }

Type guard

null

Try / catch

if err := p.RenderTerraform(w, name, data, acl); err != nil {
    if strings.Contains(err.Error(), "rendering S3 file") {
        klog.Errorf("s3 object render failed for %s: %v", name, err)
    }
    return err
}

Prevention

When it happens

Trigger: RenderTerraform -> renderTerraformS3 where w.AddFileBytes fails — e.g. duplicate resource names for aws_s3_object, or internal writer errors.

Common situations: Terraform-output tests for AWS mock clusters where object names collide, or a writer that was already populated by a prior render of the same objects.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/d5626b01a181ea0a. Report an issue: GitHub.