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

  1. Run the node only on EC2 with IMDS enabled (HttpTokens/HttpEndpoint not disabled).
  2. Raise the IMDS hop limit (e.g. `aws ec2 modify-instance-metadata-options --http-put-response-hop-limit 2`) when accessing via a container.
  3. 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

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


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