{"record":{"id":"9ed500455285df4f","repo":"kubernetes/kops","slug":"unable-to-determine-region-from-zone-s","errorCode":null,"errorMessage":"unable to determine region from zone %s","messagePattern":"unable to determine region from zone (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/scaleway/verifier.go","lineNumber":78,"sourceCode":"\nfunc (v scalewayVerifier) VerifyToken(ctx context.Context, rawRequest *http.Request, token string, body []byte) (*bootstrap.VerifyResult, error) {\n\tif !strings.HasPrefix(token, scalewaymetadata.ScalewayAuthenticationTokenPrefix) {\n\t\treturn nil, bootstrap.ErrNotThisVerifier\n\t}\n\tserverID := strings.TrimPrefix(token, scalewaymetadata.ScalewayAuthenticationTokenPrefix)\n\n\tmetadataAPI := instance.NewMetadataAPI()\n\tmetadata, err := metadataAPI.GetMetadata()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to retrieve server metadata: %w\", err)\n\t}\n\tzone, err := scw.ParseZone(metadata.Location.ZoneID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to parse Scaleway zone %q: %w\", metadata.Location.ZoneID, err)\n\t}\n\tregion, err := zone.Region()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to determine region from zone %s\", zone)\n\t}\n\n\tprofile, err := scalewaymetadata.CreateValidScalewayProfile()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tscwClient, err := scw.NewClient(\n\t\tscw.WithProfile(profile),\n\t\tscw.WithUserAgent(KopsUserAgentPrefix+kopsv.Version),\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"creating client for Scaleway Verifier: %w\", err)\n\t}\n\n\tserverResponse, err := instance.NewAPI(scwClient).GetServer(&instance.GetServerRequest{\n\t\tServerID: serverID,\n\t\tZone:     zone,\n\t}, scw.WithContext(ctx))","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/scaleway/verifier.go#L60-L96","documentation":"VerifyToken derives the Scaleway region from the zone reported by the instance metadata service. scw.ParseZone succeeds, but zone.Region() fails because the parsed zone string does not encode a known region (a Scaleway zone is <region><digit>, e.g. fr-par-1). kOps cannot scope the subsequent IPAM ListIPs call to a region, so it aborts token verification.","triggerScenarios":"The instance metadata service returns a Location.ZoneID that parses as a scw.Zone but has no extractable region — e.g. a zone string like 'par1' or an unexpected/custom zone identifier that is not of the <region>-<index> form known to the SDK.","commonSituations":"Running a node on a Scaleway zone the installed scaleway-sdk-go version does not know (new region launched before SDK upgrade), or a mock/custom metadata endpoint returning a non-canonical zone id during testing.","solutions":["Upgrade scaleway-sdk-go (and kOps) so scw knows the new zone/region","Check the metadata service output: curl http://169.254.42.42/conf?format=json and inspect location.zone_id for anomalies","As a last resort, patch/derive the region manually with strings.TrimRight on digits before calling zone.Region()"],"exampleFix":"// before\nregion, err := zone.Region()\nif err != nil {\n\treturn nil, fmt.Errorf(\"unable to determine region from zone %s\", zone)\n}\n// after\nregion, err := zone.Region()\nif err != nil {\n\treturn nil, fmt.Errorf(\"unable to determine region from zone %s: %w\", zone, err)\n}","handlingStrategy":"validation","validationCode":"zoneID := metadata.Location.ZoneID\nz, err := scw.ParseZone(zoneID)\nif err != nil { return err }\nif _, err := z.Region(); err != nil {\n\treturn fmt.Errorf(\"zone %q has no known region; upgrade scaleway-sdk-go\", zoneID)\n}","typeGuard":"func zoneHasRegion(zoneID string) bool {\n\tz, err := scw.ParseZone(zoneID)\n\treturn err == nil && z.Region() == nil\n}","tryCatchPattern":"if err != nil {\n\tif _, ok := err.(*scw.ResponseError); ok {\n\t\tlog.Printf(\"scaleway API error during region lookup: %v\", err)\n\t}\n\treturn fmt.Errorf(\"unable to determine region from zone %s: %w\", zone, err)\n}","preventionTips":["Keep scaleway-sdk-go and kOps current so newly launched zones are recognized","Sanity-check metadata location.zone_id before provisioning in a new region","Test new Scaleway regions in a non-production cluster first"],"tags":["scaleway","zone","region","metadata"],"backgroundTag":"unknown-zone-region","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"}