{"record":{"id":"0ee4e644800a2865","repo":"kubernetes/kops","slug":"failed-to-load-aws-config-v","errorCode":null,"errorMessage":"failed to load aws config: %v","messagePattern":"failed to load aws config: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/nodeup/nodetasks/prefix.go","lineNumber":125,"sourceCode":"\treturn nil\n}\n\nfunc getInstanceMetadataFirstValue(ctx context.Context, category string) (string, error) {\n\tvalues, err := getInstanceMetadataList(ctx, category)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif len(values) == 0 {\n\t\treturn \"\", fmt.Errorf(\"failed to get %q from ec2 meta-data: not found\", category)\n\t}\n\n\treturn values[0], nil\n}\n\nfunc getInstanceMetadataList(ctx context.Context, category string) ([]string, error) {\n\tcfg, err := awsconfig.LoadDefaultConfig(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to load aws config: %v\", err)\n\t}\n\tmetadata := imds.NewFromConfig(cfg)\n\tresp, err := metadata.GetMetadata(ctx, &imds.GetMetadataInput{Path: category})\n\tif err != nil {\n\t\tvar awsErr *smithyhttp.ResponseError\n\t\tif errors.As(err, &awsErr) && awsErr.HTTPStatusCode() == http.StatusNotFound {\n\t\t\treturn nil, nil\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"failed to get %q from ec2 meta-data: %v\", category, err)\n\t\t}\n\t}\n\tdefer resp.Content.Close()\n\tlines, err := io.ReadAll(resp.Content)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read %q from ec2 meta-data: %v\", category, err)\n\t}\n\n\tvar values []string","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/nodeup/nodetasks/prefix.go#L107-L143","documentation":"getInstanceMetadataList loads AWS credentials/config via the SDK's awsconfig.LoadDefaultConfig before building an IMDS client; if no usable configuration can be resolved it wraps the error as 'failed to load aws config'. The SDK needs at least a resolvable region and credential chain.","triggerScenarios":"LoadDefaultConfig cannot resolve a region (no AWS_REGION/AWS_DEFAULT_REGION env, no ~/.aws/config, no region from IMDS) or the credential chain fails entirely.","commonSituations":"nodeup binary run in an environment without the EC2 metadata fallback (e.g. on-prem, CI); misconfigured AWS_* environment variables; stripped-down images missing shared config files when AWS_SDK_LOAD_CONFIG semantics differ.","solutions":["Run on an EC2 instance so the SDK can resolve region/credentials from IMDS.","Set AWS_REGION (or AWS_DEFAULT_REGION) and valid credentials explicitly when testing outside EC2.","Check AWS_CONFIG_FILE / AWS_SHARED_CREDENTIALS_FILE paths point to readable files."],"exampleFix":"// before (test env)\n$ nodeup\n// after\n$ AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... nodeup","handlingStrategy":"validation","validationCode":"if os.Getenv(\"AWS_REGION\") == \"\" && !runningOnEC2() {\n    return errors.New(\"set AWS_REGION or run on EC2\")\n}","typeGuard":null,"tryCatchPattern":"if err != nil {\n    return fmt.Errorf(\"AWS config unresolvable: %w; set AWS_REGION/credentials or run on EC2\", err)\n}","preventionTips":["Set AWS_REGION explicitly in non-EC2 test environments","Keep AWS_CONFIG_FILE/AWS_SHARED_CREDENTIALS_FILE valid and readable","Use the default SDK credential chain without stripping IMDS"],"tags":["aws","aws-sdk-go-v2","configuration","imds"],"backgroundTag":"missing-aws-config","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}