kubernetes/kops · error

create Route request failed: %v

Error message

create Route request failed: %v

What it means

After EC2 CreateRoute returns without an error, kOps checks the response's Return flag; when it is false the call technically succeeded at the transport level but AWS reports the route was not created, so this error is thrown. This is a defensive check against silent API-level failure where no Go error is returned.

Source

Thrown at upup/pkg/fi/cloudup/awstasks/route.go:235

			request.InstanceId = checkNotNil(e.Instance.ID)
		}

		klog.V(2).Infof("Creating Route with RouteTable:%q CIDR:%q IPv6CIDR:%q",
			aws.ToString(e.RouteTable.ID), aws.ToString(e.CIDR), aws.ToString(e.IPv6CIDR))

		response, err := t.Cloud.EC2().CreateRoute(ctx, request)
		if err != nil {
			code := awsup.AWSErrorCode(err)
			message := awsup.AWSErrorMessage(err)
			if code == "InvalidNatGatewayID.NotFound" {
				klog.V(4).Infof("error creating Route: %s", message)
				return fi.NewTryAgainLaterError("waiting for the NAT Gateway to be created")
			}
			return fmt.Errorf("error creating Route: %s", message)
		}

		if !aws.ToBool(response.Return) {
			return fmt.Errorf("create Route request failed: %v", response)
		}
	} else {
		request := &ec2.ReplaceRouteInput{}
		request.RouteTableId = checkNotNil(e.RouteTable.ID)

		if e.CIDR != nil || e.IPv6CIDR != nil {
			request.DestinationCidrBlock = e.CIDR
			request.DestinationIpv6CidrBlock = e.IPv6CIDR
		} else {
			klog.Fatal("both CIDR and IPv6CIDR were unexpectedly nil")
		}

		if e.InternetGateway == nil && e.NatGateway == nil && e.TransitGatewayID == nil && e.VPCPeeringConnectionID == nil {
			return fmt.Errorf("missing target for route")
		} else if e.InternetGateway != nil {
			request.GatewayId = checkNotNil(e.InternetGateway.ID)
		} else if e.NatGateway != nil {
			request.NatGatewayId = checkNotNil(e.NatGateway.ID)

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Re-run kops update cluster to retry route creation
  2. Check AWS service health for EC2 in the region
  3. Inspect the dumped response object in the error message for details
  4. If persistent, capture the full response and report to kOps with AWS request IDs
Defensive patterns

Strategy: retry

Try / catch

resp, err := cloud.EC2().CreateRoute(ctx, req)
if err != nil { return err }
if !aws.ToBool(resp.Return) {
	// transient API anomaly — retry with backoff
	return fi.NewTryAgainLaterError("create Route returned Return=false")
}

Prevention

When it happens

Trigger: EC2 CreateRoute returning a 200 with Return=false, typically during partial failures, API inconsistencies, or edge-case service errors not mapped to a Go error.

Common situations: Rare AWS service-side anomalies; intermittent issues during cluster bring-up; retrying after an earlier ambiguous failure.

Related errors


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