diff --git a/moto/ec2/exceptions.py b/moto/ec2/exceptions.py index 6eb8d515e..780ed933c 100644 --- a/moto/ec2/exceptions.py +++ b/moto/ec2/exceptions.py @@ -444,6 +444,14 @@ class InvalidParameterValueErrorTagSpotFleetRequest(EC2ClientError): ) +class InvalidParameterValueErrorReplaceRoute(EC2ClientError): + def __init__(self, cidr: str): + super().__init__( + "InvalidParameterValue", + f"There is no route defined for '{cidr}' in the route table. Use CreateRoute instead.", + ) + + class EmptyTagSpecError(EC2ClientError): def __init__(self) -> None: super().__init__( diff --git a/moto/ec2/models/route_tables.py b/moto/ec2/models/route_tables.py index de6217d09..51c8e2e76 100644 --- a/moto/ec2/models/route_tables.py +++ b/moto/ec2/models/route_tables.py @@ -18,6 +18,7 @@ from ..exceptions import ( InvalidRouteTableIdError, InvalidAssociationIdError, InvalidDestinationCIDRBlockParameterError, + InvalidParameterValueErrorReplaceRoute, RouteAlreadyExistsError, RouteNotSupportedError, ) @@ -451,7 +452,18 @@ class RouteBackend: route_id = generate_route_id( route_table.id, destination_cidr_block, destination_ipv6_cidr_block ) - route = route_table.routes[route_id] + try: + route = route_table.routes[route_id] + except KeyError: + cidr = ( + destination_cidr_block + if destination_cidr_block + else destination_ipv6_cidr_block + ) + # This should be 'raise InvalidRouteError(route_table_id, cidr)' in + # line with the delete_route() equivalent, but for some reason AWS + # returns InvalidParameterValue instead in this case. + raise InvalidParameterValueErrorReplaceRoute(cidr) from None route.gateway = None route.nat_gateway = None