kubernetes/kops · error
failed to get 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.
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
- failed to get from ec2 meta-data
- failed to get region from ec2 metadata
- getting primary MAC address from ec2 metadata
- cannot determine challenge endpoint for instance id
- cannot revoke ingress for ID
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/f0ef6f5ec72e9641.
Report an issue: GitHub.
Appendix: 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)