---
# ----------------------------------------------------------------------------
#
#     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
#
# ----------------------------------------------------------------------------
#
#     This file is automatically generated by Magic Modules and manual
#     changes will be clobbered when the file is regenerated.
#
#     Please read more about how to change this file in
#     .github/CONTRIBUTING.md.
#
# ----------------------------------------------------------------------------
subcategory: "Compute Engine"
description: |-
  Represents a Route resource.
---

# google\_compute\_route

Represents a Route resource.

A route is a rule that specifies how certain packets should be handled by
the virtual network. Routes are associated with virtual machines by tag,
and the set of routes for a particular virtual machine is called its
routing table. For each packet leaving a virtual machine, the system
searches that virtual machine's routing table for a single best matching
route.

Routes match packets by destination IP address, preferring smaller or more
specific ranges over larger ones. If there is a tie, the system selects
the route with the smallest priority value. If there is still a tie, it
uses the layer three and four packet headers to select just one of the
remaining matching routes. The packet is then forwarded as specified by
the next_hop field of the winning route -- either to another virtual
machine destination, a virtual machine gateway or a Compute
Engine-operated gateway. Packets that do not match any route in the
sending virtual machine's routing table will be dropped.

A Route resource must have exactly one specification of either
nextHopGateway, nextHopInstance, nextHopIp, nextHopVpnTunnel, or
nextHopIlb.


To get more information about Route, see:

* [API documentation](https://cloud.google.com/compute/docs/reference/rest/v1/routes)
* How-to Guides
    * [Using Routes](https://cloud.google.com/vpc/docs/using-routes)

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=route_basic&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Route Basic


```hcl
resource "google_compute_route" "default" {
  name        = "network-route"
  dest_range  = "15.0.0.0/24"
  network     = google_compute_network.default.name
  next_hop_ip = "10.132.1.5"
  priority    = 100
}

resource "google_compute_network" "default" {
  name = "compute-network"
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=route_ilb&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Route Ilb


```hcl
resource "google_compute_network" "default" {
  name                    = "compute-network"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "default" {
  name          = "compute-subnet"
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-central1"
  network       = google_compute_network.default.id
}

resource "google_compute_health_check" "hc" {
  name               = "proxy-health-check"
  check_interval_sec = 1
  timeout_sec        = 1

  tcp_health_check {
    port = "80"
  }
}

resource "google_compute_region_backend_service" "backend" {
  name          = "compute-backend"
  region        = "us-central1"
  health_checks = [google_compute_health_check.hc.id]
}

resource "google_compute_forwarding_rule" "default" {
  name     = "compute-forwarding-rule"
  region   = "us-central1"

  load_balancing_scheme = "INTERNAL"
  backend_service       = google_compute_region_backend_service.backend.id
  all_ports             = true
  network               = google_compute_network.default.name
  subnetwork            = google_compute_subnetwork.default.name
}

resource "google_compute_route" "route-ilb" {
  name         = "route-ilb"
  dest_range   = "0.0.0.0/0"
  network      = google_compute_network.default.name
  next_hop_ilb = google_compute_forwarding_rule.default.id
  priority     = 2000
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=route_ilb_vip&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Route Ilb Vip


```hcl
resource "google_compute_network" "producer" {
  provider                = google-beta
  name                    = "producer-vpc"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "producer" {
  provider      = google-beta
  name          = "producer-subnet"
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-central1"
  network       = google_compute_network.producer.id
}

resource "google_compute_network" "consumer" {
  provider                = google-beta
  name                    = "consumer-vpc"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "consumer" {
  provider      = google-beta
  name          = "consumer-subnet"
  ip_cidr_range = "10.0.2.0/24"
  region        = "us-central1"
  network       = google_compute_network.consumer.id
}

resource "google_compute_network_peering" "peering1" {
  provider     = google-beta
  name         = "peering-producer-to-consumer"
  network      = google_compute_network.consumer.id
  peer_network = google_compute_network.producer.id
}

resource "google_compute_network_peering" "peering2" {
  provider     = google-beta
  name         = "peering-consumer-to-producer"
  network      = google_compute_network.producer.id
  peer_network = google_compute_network.consumer.id
}

resource "google_compute_health_check" "hc" {
  provider           = google-beta
  name               = "proxy-health-check"
  check_interval_sec = 1
  timeout_sec        = 1

  tcp_health_check {
    port = "80"
  }
}

resource "google_compute_region_backend_service" "backend" {
  provider      = google-beta
  name          = "compute-backend"
  region        = "us-central1"
  health_checks = [google_compute_health_check.hc.id]
}

resource "google_compute_forwarding_rule" "default" {
  provider = google-beta
  name     = "compute-forwarding-rule"
  region   = "us-central1"

  load_balancing_scheme = "INTERNAL"
  backend_service       = google_compute_region_backend_service.backend.id
  all_ports             = true
  network               = google_compute_network.producer.name
  subnetwork            = google_compute_subnetwork.producer.name
}

resource "google_compute_route" "route-ilb" {
  provider     = google-beta
  name         = "route-ilb"
  dest_range   = "0.0.0.0/0"
  network      = google_compute_network.consumer.name
  next_hop_ilb = google_compute_forwarding_rule.default.ip_address
  priority     = 2000
  tags         = ["tag1", "tag2"]

  depends_on = [
    google_compute_network_peering.peering1,
    google_compute_network_peering.peering2
  ]
}
```

## Argument Reference

The following arguments are supported:


* `dest_range` -
  (Required)
  The destination range of outgoing packets that this route applies to.
  Only IPv4 is supported.

* `name` -
  (Required)
  Name of the resource. Provided by the client when the resource is
  created. The name must be 1-63 characters long, and comply with
  RFC1035.  Specifically, the name must be 1-63 characters long and
  match the regular expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means
  the first character must be a lowercase letter, and all following
  characters must be a dash, lowercase letter, or digit, except the
  last character, which cannot be a dash.

* `network` -
  (Required)
  The network that this route applies to.


- - -


* `description` -
  (Optional)
  An optional description of this resource. Provide this property
  when you create the resource.

* `priority` -
  (Optional)
  The priority of this route. Priority is used to break ties in cases
  where there is more than one matching route of equal prefix length.
  In the case of two routes with equal prefix length, the one with the
  lowest-numbered priority value wins.
  Default value is 1000. Valid range is 0 through 65535.

* `tags` -
  (Optional)
  A list of instance tags to which this route applies.

* `next_hop_gateway` -
  (Optional)
  URL to a gateway that should handle matching packets.
  Currently, you can only specify the internet gateway, using a full or
  partial valid URL:
  * `https://www.googleapis.com/compute/v1/projects/project/global/gateways/default-internet-gateway`
  * `projects/project/global/gateways/default-internet-gateway`
  * `global/gateways/default-internet-gateway`
  * The string `default-internet-gateway`.

* `next_hop_instance` -
  (Optional)
  URL to an instance that should handle matching packets.
  You can specify this as a full or partial URL. For example:
  * `https://www.googleapis.com/compute/v1/projects/project/zones/zone/instances/instance`
  * `projects/project/zones/zone/instances/instance`
  * `zones/zone/instances/instance`
  * Just the instance name, with the zone in `next_hop_instance_zone`.

* `next_hop_ip` -
  (Optional)
  Network IP address of an instance that should handle matching packets.

* `next_hop_vpn_tunnel` -
  (Optional)
  URL to a VpnTunnel that should handle matching packets.

* `next_hop_ilb` -
  (Optional)
  The IP address or URL to a forwarding rule of type
  loadBalancingScheme=INTERNAL that should handle matching
  packets.
  With the GA provider you can only specify the forwarding
  rule as a partial or full URL. For example, the following
  are all valid values:
  * 10.128.0.56
  * https://www.googleapis.com/compute/v1/projects/project/regions/region/forwardingRules/forwardingRule
  * regions/region/forwardingRules/forwardingRule
  When the beta provider, you can also specify the IP address
  of a forwarding rule from the same VPC or any peered VPC.
  Note that this can only be used when the destinationRange is
  a public (non-RFC 1918) IP CIDR range.

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.

* `next_hop_instance_zone` - (Optional when `next_hop_instance` is
  specified)  The zone of the instance specified in
  `next_hop_instance`.  Omit if `next_hop_instance` is specified as
  a URL.

## Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

* `id` - an identifier for the resource with format `projects/{{project}}/global/routes/{{name}}`

* `next_hop_network` -
  URL to a Network that should handle matching packets.
* `self_link` - The URI of the created resource.


## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


Route can be imported using any of these accepted formats:

* `projects/{{project}}/global/routes/{{name}}`
* `{{project}}/{{name}}`
* `{{name}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import Route using one of the formats above. For example:

```tf
import {
  id = "projects/{{project}}/global/routes/{{name}}"
  to = google_compute_route.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), Route can be imported using one of the formats above. For example:

```
$ terraform import google_compute_route.default projects/{{project}}/global/routes/{{name}}
$ terraform import google_compute_route.default {{project}}/{{name}}
$ terraform import google_compute_route.default {{name}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
