hashicorp/terraform · error
Unknown address type
Error message
Unknown address type %q for %q
What it means
Thrown from the default branch of the address-Network switch in the reattach loader. Only 'unix' and 'tcp' are recognised; any other value is rejected.
Solutions
- Set addr.Network to exactly "unix" or "tcp" (lowercase)
- Do not put the gRPC protocol name in the network field
- Re-export TF_REATTACH_PROVIDERS from a known-working debug session
Example fix
// before: {"addr":{"network":"TCP","string":"127.0.0.1:5678"}}
// after : {"addr":{"network":"tcp","string":"127.0.0.1:5678"}} Defensive patterns
Strategy: type-guard
Validate before calling
// Allow only the two recognised network types before decoding.
switch c.Addr.Network {
case "unix", "tcp":
default:
return fmt.Errorf("reattach network must be 'unix' or 'tcp', got %q", c.Addr.Network)
} Type guard
func IsKnownReattachNetwork(s string) bool {
return s == "unix" || s == "tcp"
} Try / catch
providers, err := reattach.DecodeProviders(raw)
if err != nil && strings.Contains(err.Error(), "Unknown address type") {
return fmt.Errorf("reattach addr.network must be lowercase 'unix' or 'tcp': %w", err)
} Prevention
- Always use lowercase 'unix' or 'tcp' for addr.network
- Do not place the gRPC protocol name in the network field
- Regenerate the value from a working debug session
When it happens
Trigger: c.Addr.Network is neither "unix" nor "tcp" (e.g. "TCP", "grpc", "socket", "http").
Common situations: Uppercase 'TCP'/'UNIX'; a protocol name mistakenly placed in the network field; typo such as 'ticp'; schema confusion between Protocol and Addr.Network fields.
Related errors
- Invalid TCP address for
- Invalid unix socket path
- Error parsing as a provider address
- Invalid format for
- can't set both encryption_key and kms_encryption_key
AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11).
Data as JSON: /api/errors/17ab948da7f98104.
Report an issue: GitHub.
Appendix: source
Thrown at internal/getproviders/reattach/reattach.go:74
for p, c := range m {
a, diags := addrs.ParseProviderSourceString(p)
if diags.HasErrors() {
return unmanagedProviders, fmt.Errorf("Error parsing %q as a provider address: %w", a, diags.Err())
}
var addr net.Addr
switch c.Addr.Network {
case "unix":
addr, err = net.ResolveUnixAddr("unix", c.Addr.String)
if err != nil {
return unmanagedProviders, fmt.Errorf("Invalid unix socket path %q for %q: %w", c.Addr.String, p, err)
}
case "tcp":
addr, err = net.ResolveTCPAddr("tcp", c.Addr.String)
if err != nil {
return unmanagedProviders, fmt.Errorf("Invalid TCP address %q for %q: %w", c.Addr.String, p, err)
}
default:
return unmanagedProviders, fmt.Errorf("Unknown address type %q for %q", c.Addr.Network, p)
}
unmanagedProviders[a] = &plugin.ReattachConfig{
Protocol: plugin.Protocol(c.Protocol),
ProtocolVersion: c.ProtocolVersion,
Pid: c.Pid,
Test: c.Test,
Addr: addr,
}
}
}
return unmanagedProviders, nil
}
// IsProviderReattached determines if a given provider is being supplied to Terraform via the TF_REATTACH_PROVIDERS
// environment variable.
//
// Calling code is expected to pass in a provider address and the value of os.Getenv("TF_REATTACH_PROVIDERS")
func IsProviderReattached(provider tfaddr.Provider, in string) (bool, error) {View on GitHub (pinned to d32a084675)