---
# ----------------------------------------------------------------------------
#
#     ***     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 an InterconnectAttachment (VLAN attachment) resource.
---

# google_compute_interconnect_attachment

Represents an InterconnectAttachment (VLAN attachment) resource. For more
information, see Creating VLAN Attachments.



<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_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=interconnect_attachment_basic&open_in_editor=main.tf" 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 - Interconnect Attachment Basic


```hcl
resource "google_compute_interconnect_attachment" "on_prem" {
  name                     = "on-prem-attachment"
  edge_availability_domain = "AVAILABILITY_DOMAIN_1"
  type                     = "PARTNER"
  router                   = google_compute_router.foobar.id
  mtu                      = 1500
}

resource "google_compute_router" "foobar" {
  name    = "router-1"
  network = google_compute_network.foobar.name
  bgp {
    asn = 16550
  }
}

resource "google_compute_network" "foobar" {
  name                    = "network-1"
  auto_create_subnetworks = false
}
```
<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_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=compute_interconnect_attachment_ipsec_encryption&open_in_editor=main.tf" 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 - Compute Interconnect Attachment Ipsec Encryption


```hcl
resource "google_compute_interconnect_attachment" "ipsec-encrypted-interconnect-attachment" {
  name                     = "test-interconnect-attachment"
  edge_availability_domain = "AVAILABILITY_DOMAIN_1"
  type                     = "PARTNER"
  router                   = google_compute_router.router.id
  encryption               = "IPSEC"
  ipsec_internal_addresses = [
    google_compute_address.address.self_link,
  ]
}

resource "google_compute_address" "address" {
  name          = "test-address"
  address_type  = "INTERNAL"
  purpose       = "IPSEC_INTERCONNECT"
  address       = "192.168.1.0"
  prefix_length = 29
  network       = google_compute_network.network.self_link
}

resource "google_compute_router" "router" {
  name                          = "test-router"
  network                       = google_compute_network.network.name
  encrypted_interconnect_router = true
  bgp {
    asn = 16550
  }
}

resource "google_compute_network" "network" {
  name                    = "test-network"
  auto_create_subnetworks = false
}
```

## Argument Reference

The following arguments are supported:


* `router` -
  (Required)
  URL of the cloud router to be used for dynamic routing. This router must be in
  the same region as this InterconnectAttachment. The InterconnectAttachment will
  automatically connect the Interconnect to the network & region within which the
  Cloud Router is configured.

* `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.


- - -


* `admin_enabled` -
  (Optional)
  Whether the VLAN attachment is enabled or disabled.  When using
  PARTNER type this will Pre-Activate the interconnect attachment

* `interconnect` -
  (Optional)
  URL of the underlying Interconnect object that this attachment's
  traffic will traverse through. Required if type is DEDICATED, must not
  be set if type is PARTNER.

* `description` -
  (Optional)
  An optional description of this resource.

* `mtu` -
  (Optional)
  Maximum Transmission Unit (MTU), in bytes, of packets passing through
  this interconnect attachment. Currently, only 1440 and 1500 are allowed. If not specified, the value will default to 1440.

* `bandwidth` -
  (Optional)
  Provisioned bandwidth capacity for the interconnect attachment.
  For attachments of type DEDICATED, the user can set the bandwidth.
  For attachments of type PARTNER, the Google Partner that is operating the interconnect must set the bandwidth.
  Output only for PARTNER type, mutable for PARTNER_PROVIDER and DEDICATED,
  Defaults to BPS_10G
  Possible values are: `BPS_50M`, `BPS_100M`, `BPS_200M`, `BPS_300M`, `BPS_400M`, `BPS_500M`, `BPS_1G`, `BPS_2G`, `BPS_5G`, `BPS_10G`, `BPS_20G`, `BPS_50G`.

* `edge_availability_domain` -
  (Optional)
  Desired availability domain for the attachment. Only available for type
  PARTNER, at creation time. For improved reliability, customers should
  configure a pair of attachments with one per availability domain. The
  selected availability domain will be provided to the Partner via the
  pairing key so that the provisioned circuit will lie in the specified
  domain. If not specified, the value will default to AVAILABILITY_DOMAIN_ANY.

* `type` -
  (Optional)
  The type of InterconnectAttachment you wish to create. Defaults to
  DEDICATED.
  Possible values are: `DEDICATED`, `PARTNER`, `PARTNER_PROVIDER`.

* `candidate_subnets` -
  (Optional)
  Up to 16 candidate prefixes that can be used to restrict the allocation
  of cloudRouterIpAddress and customerRouterIpAddress for this attachment.
  All prefixes must be within link-local address space (169.254.0.0/16)
  and must be /29 or shorter (/28, /27, etc). Google will attempt to select
  an unused /29 from the supplied candidate prefix(es). The request will
  fail if all possible /29s are in use on Google's edge. If not supplied,
  Google will randomly select an unused /29 from all of link-local space.

* `vlan_tag8021q` -
  (Optional)
  The IEEE 802.1Q VLAN tag for this attachment, in the range 2-4094. When
  using PARTNER type this will be managed upstream.

* `ipsec_internal_addresses` -
  (Optional)
  URL of addresses that have been reserved for the interconnect attachment,
  Used only for interconnect attachment that has the encryption option as
  IPSEC.
  The addresses must be RFC 1918 IP address ranges. When creating HA VPN
  gateway over the interconnect attachment, if the attachment is configured
  to use an RFC 1918 IP address, then the VPN gateway's IP address will be
  allocated from the IP address range specified here.
  For example, if the HA VPN gateway's interface 0 is paired to this
  interconnect attachment, then an RFC 1918 IP address for the VPN gateway
  interface 0 will be allocated from the IP address specified for this
  interconnect attachment.
  If this field is not specified for interconnect attachment that has
  encryption option as IPSEC, later on when creating HA VPN gateway on this
  interconnect attachment, the HA VPN gateway's IP address will be
  allocated from regional external IP address pool.

* `encryption` -
  (Optional)
  Indicates the user-supplied encryption option of this interconnect
  attachment. Can only be specified at attachment creation for PARTNER or
  DEDICATED attachments.
  * NONE - This is the default value, which means that the VLAN attachment
  carries unencrypted traffic. VMs are able to send traffic to, or receive
  traffic from, such a VLAN attachment.
  * IPSEC - The VLAN attachment carries only encrypted traffic that is
  encrypted by an IPsec device, such as an HA VPN gateway or third-party
  IPsec VPN. VMs cannot directly send traffic to, or receive traffic from,
  such a VLAN attachment. To use HA VPN over Cloud Interconnect, the VLAN
  attachment must be created with this option.
  Default value is `NONE`.
  Possible values are: `NONE`, `IPSEC`.

* `stack_type` -
  (Optional)
  The stack type for this interconnect attachment to identify whether the IPv6
  feature is enabled or not. If not specified, IPV4_ONLY will be used.
  This field can be both set at interconnect attachments creation and update
  interconnect attachment operations.
  Possible values are: `IPV4_IPV6`, `IPV4_ONLY`.

* `subnet_length` -
  (Optional)
  Length of the IPv4 subnet mask. Allowed values: 29 (default), 30. The default value is 29,
  except for Cross-Cloud Interconnect connections that use an InterconnectRemoteLocation with a
  constraints.subnetLengthRange.min equal to 30. For example, connections that use an Azure
  remote location fall into this category. In these cases, the default value is 30, and
  requesting 29 returns an error. Where both 29 and 30 are allowed, 29 is preferred, because it
  gives Google Cloud Support more debugging visibility.

* `region` -
  (Optional)
  Region where the regional interconnect attachment resides.

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


## 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}}/regions/{{region}}/interconnectAttachments/{{name}}`

* `cloud_router_ip_address` -
  IPv4 address + prefix length to be configured on Cloud Router
  Interface for this interconnect attachment.

* `customer_router_ip_address` -
  IPv4 address + prefix length to be configured on the customer
  router subinterface for this interconnect attachment.

* `pairing_key` -
  [Output only for type PARTNER. Not present for DEDICATED]. The opaque
  identifier of an PARTNER attachment used to initiate provisioning with
  a selected partner. Of the form "XXXXX/region/domain"

* `partner_asn` -
  [Output only for type PARTNER. Not present for DEDICATED]. Optional
  BGP ASN for the router that should be supplied by a layer 3 Partner if
  they configured BGP on behalf of the customer.

* `private_interconnect_info` -
  Information specific to an InterconnectAttachment. This property
  is populated if the interconnect that this is attached to is of type DEDICATED.
  Structure is [documented below](#nested_private_interconnect_info).

* `state` -
  [Output Only] The current state of this attachment's functionality.

* `google_reference_id` -
  Google reference ID, to be used when raising support tickets with
  Google or otherwise to debug backend connectivity issues.

* `creation_timestamp` -
  Creation timestamp in RFC3339 text format.

* `cloud_router_ipv6_address` -
  IPv6 address + prefix length to be configured on Cloud Router
  Interface for this interconnect attachment.

* `customer_router_ipv6_address` -
  IPv6 address + prefix length to be configured on the customer
  router subinterface for this interconnect attachment.
* `self_link` - The URI of the created resource.


<a name="nested_private_interconnect_info"></a>The `private_interconnect_info` block contains:

* `tag8021q` -
  (Output)
  802.1q encapsulation tag to be used for traffic between
  Google and the customer, going to and from this network and region.

## 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.
- `update` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


InterconnectAttachment can be imported using any of these accepted formats:

* `projects/{{project}}/regions/{{region}}/interconnectAttachments/{{name}}`
* `{{project}}/{{region}}/{{name}}`
* `{{region}}/{{name}}`
* `{{name}}`


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

```tf
import {
  id = "projects/{{project}}/regions/{{region}}/interconnectAttachments/{{name}}"
  to = google_compute_interconnect_attachment.default
}
```

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

```
$ terraform import google_compute_interconnect_attachment.default projects/{{project}}/regions/{{region}}/interconnectAttachments/{{name}}
$ terraform import google_compute_interconnect_attachment.default {{project}}/{{region}}/{{name}}
$ terraform import google_compute_interconnect_attachment.default {{region}}/{{name}}
$ terraform import google_compute_interconnect_attachment.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).
