kubernetes/kops · error

error rending resource %s %v

Error message

error rending resource %s %v

What it means

TerraformTarget.AddFileResource reads a fi.Resource into bytes before writing it into the Terraform output tree. If fi.ResourceAsBytes fails, the resource cannot be rendered, and the error is wrapped as "error rending resource <type>_<name>_<key>" with the underlying cause. This is a read/render failure, not a filesystem write failure.

Source

Thrown at upup/pkg/fi/cloudup/terraform/target.go:60

func NewTerraformTarget(cloud fi.Cloud, project string, outDir string, clusterSpecTarget *kops.TargetSpec) *TerraformTarget {
	target := TerraformTarget{
		Cloud:   cloud,
		Project: project,

		outDir:            outDir,
		clusterSpecTarget: clusterSpecTarget,
	}
	target.InitTerraformWriter()
	return &target
}

var _ fi.CloudupTarget = (*TerraformTarget)(nil)

func (t *TerraformTarget) AddFileResource(resourceType string, resourceName string, key string, r fi.Resource, base64 bool) (*terraformWriter.Literal, error) {
	d, err := fi.ResourceAsBytes(r)
	if err != nil {
		id := resourceType + "_" + resourceName + "_" + key
		return nil, fmt.Errorf("error rending resource %s %v", id, err)
	}

	return t.AddFileBytes(resourceType, resourceName, key, d, base64)
}

func (t *TerraformTarget) DefaultCheckExisting() bool {
	return false
}

// tfGetProviderExtraConfig is a helper function to get extra config with safety checks on the pointers.
func tfGetProviderExtraConfig(c *kops.TargetSpec) map[string]string {
	if c != nil &&
		c.Terraform != nil {
		return c.Terraform.ProviderExtraConfig
	}
	return nil
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped underlying error (after `%v`) to find the real cause.
  2. Check that any file-backed resources exist and are readable at the referenced path.
  3. Re-run `kops update cluster --target=terraform` to regenerate from scratch after fixing the source.
  4. If using custom assets/URLs, verify they are reachable and hashes match.
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-read the resource to fail fast
if _, err := fi.ResourceAsBytes(r); err != nil {
    return fmt.Errorf("resource for %s/%s unreadable: %w", resourceType, resourceName, err)
}

Try / catch

lit, err := target.AddFileResource(resourceType, resourceName, key, res, false)
if err != nil {
    return fmt.Errorf("adding file resource %s_%s_%s failed: %w", resourceType, resourceName, key, err)
}

Prevention

When it happens

Trigger: Any call to AddFileResource whose fi.Resource fails to materialize bytes — e.g. a reader returning an error, a file-backed resource with a missing/unreadable file, a lazy resource whose producer fails.

Common situations: Certificate/key resources pointing at missing files; a custom fi.Resource whose Open()/Read() errors (permissions, deleted temp file); network-backed resources failing during cluster apply with terraform output.

Related errors


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