kubernetes/kops · error
failed to get %q from ec2 meta-data: not found
Error message
failed to get %q from ec2 meta-data: not found
What it means
getInstanceMetadataFirstValue queries the EC2 instance metadata service (IMDS) for a category (e.g. 'mac') and expects at least one value; an empty list means IMDS responded but the key was absent, so this error is returned. It indicates the instance metadata endpoint does not expose the requested field.
Source
Thrown at upup/pkg/fi/nodeup/nodetasks/prefix.go:116
response, err := t.Cloud.AssignIpv6Addresses(ctx, &ec2.AssignIpv6AddressesInput{
Ipv6PrefixCount: new(int32(1)),
NetworkInterfaceId: new(interfaceId),
})
if err != nil {
return fmt.Errorf("failed to assign prefix: %w", err)
}
klog.V(2).Infof("assigned prefix to primary network interface: %q", response.AssignedIpv6Prefixes[0])
return nil
}
func getInstanceMetadataFirstValue(ctx context.Context, category string) (string, error) {
values, err := getInstanceMetadataList(ctx, category)
if err != nil {
return "", err
}
if len(values) == 0 {
return "", fmt.Errorf("failed to get %q from ec2 meta-data: not found", category)
}
return values[0], nil
}
func getInstanceMetadataList(ctx context.Context, category string) ([]string, error) {
cfg, err := awsconfig.LoadDefaultConfig(ctx)
if err != nil {
return nil, fmt.Errorf("failed to load aws config: %v", err)
}
metadata := imds.NewFromConfig(cfg)
resp, err := metadata.GetMetadata(ctx, &imds.GetMetadataInput{Path: category})
if err != nil {
var awsErr *smithyhttp.ResponseError
if errors.As(err, &awsErr) && awsErr.HTTPStatusCode() == http.StatusNotFound {
return nil, nil
} else {
return nil, fmt.Errorf("failed to get %q from ec2 meta-data: %v", category, err)View on GitHub (pinned to 4c8573c808)
Solutions
- Run the node only on EC2 with IMDS enabled (HttpTokens/HttpEndpoint not disabled).
- Raise the IMDS hop limit (e.g. `aws ec2 modify-instance-metadata-options --http-put-response-hop-limit 2`) when accessing via a container.
- Verify the requested category path is valid for the instance (e.g. IPv6 enabled on the interface).
Defensive patterns
Strategy: fallback
Validate before calling
out, err := exec.Command("curl", "-sf", "http://169.254.169.254/latest/meta-data/").Output()
if err != nil { return errors.New("IMDS unreachable on this host") } Try / catch
if err != nil {
var opErr *net.OpError
if errors.As(err, &opErr) { /* IMDS network issue: fail fast or fallback */ }
} Prevention
- Run workloads only on EC2 instances with IMDS enabled
- Set IMDS hop limit >= 2 when nodeup runs in containers
- Confirm requested metadata categories exist for the instance type
When it happens
Trigger: IMDS returns 200 with an empty body, or getInstanceMetadataList returns a 404-mapped nil slice with no values, for categories like 'mac' or 'network/interfaces/macs/<mac>/ipv6-prefix'.
Common situations: Running nodeup outside a real EC2 instance (bare metal, containers, CI) where IMDS is absent or stubbed; hop limit too low so IMDS responses are dropped; metadata options restricting access.
Related errors
- getting primary MAC address from ec2 metadata: %w
- failed to get region from ec2 metadata: %w
- failed to get %q from ec2 meta-data: %v
- DIGITALOCEAN_ACCESS_TOKEN is required
- timed out waiting for volume to detach
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/f0ef6f5ec72e9641.
Report an issue: GitHub.