---
# ----------------------------------------------------------------------------
#
#     ***     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: "ContainerAttached"
description: |-
  An Anthos cluster running on customer owned infrastructure.
---

# google\_container\_attached\_cluster

An Anthos cluster running on customer owned infrastructure.


To get more information about Cluster, see:

* [API documentation](https://cloud.google.com/anthos/clusters/docs/multi-cloud/reference/rest)
* How-to Guides
    * [API reference](https://cloud.google.com/anthos/clusters/docs/multi-cloud/reference/rest/v1/projects.locations.attachedClusters)
    * [Multicloud overview](https://cloud.google.com/anthos/clusters/docs/multi-cloud)

<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=container_attached_cluster_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 - Container Attached Cluster Basic


```hcl
data "google_project" "project" {
}

data "google_container_attached_versions" "versions" {
	location       = "us-west1"
	project        = data.google_project.project.project_id
}

resource "google_container_attached_cluster" "primary" {
  name     = "basic"
  location = "us-west1"
  project = data.google_project.project.project_id
  description = "Test cluster"
  distribution = "aks"
  oidc_config {
      issuer_url = "https://oidc.issuer.url"
  }
  platform_version = data.google_container_attached_versions.versions.valid_versions[0]
  fleet {
    project = "projects/${data.google_project.project.number}"
  }
}
```
<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=container_attached_cluster_full&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 - Container Attached Cluster Full


```hcl
data "google_project" "project" {
}

data "google_container_attached_versions" "versions" {
	location       = "us-west1"
	project        = data.google_project.project.project_id
}

resource "google_container_attached_cluster" "primary" {
  name     = "basic"
  project = data.google_project.project.project_id
  location = "us-west1"
  description = "Test cluster"
  distribution = "aks"
  annotations = {
    label-one = "value-one"
  }
  authorization {
    admin_users = [ "user1@example.com", "user2@example.com"]
    admin_groups = [ "group1@example.com", "group2@example.com"]
  }
  oidc_config {
      issuer_url = "https://oidc.issuer.url"
      jwks = base64encode("{\"keys\":[{\"use\":\"sig\",\"kty\":\"RSA\",\"kid\":\"testid\",\"alg\":\"RS256\",\"n\":\"somedata\",\"e\":\"AQAB\"}]}")
  }
  platform_version = data.google_container_attached_versions.versions.valid_versions[0]
  fleet {
    project = "projects/${data.google_project.project.number}"
  }
  logging_config {
    component_config {
      enable_components = ["SYSTEM_COMPONENTS", "WORKLOADS"]
    }
  }
  monitoring_config {
    managed_prometheus_config {
      enabled = true
    }
  }
  binary_authorization {
    evaluation_mode = "PROJECT_SINGLETON_POLICY_ENFORCE"
  }
  proxy_config {
    kubernetes_secret {
      name = "proxy-config"
      namespace = "default"
    }
  }
}
```
<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=container_attached_cluster_ignore_errors&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 - Container Attached Cluster Ignore Errors


```hcl
data "google_project" "project" {
}

data "google_container_attached_versions" "versions" {
	location       = "us-west1"
	project        = data.google_project.project.project_id
}

resource "google_container_attached_cluster" "primary" {
  name     = "basic"
  location = "us-west1"
  project = data.google_project.project.project_id
  description = "Test cluster"
  distribution = "aks"
  oidc_config {
      issuer_url = "https://oidc.issuer.url"
  }
  platform_version = data.google_container_attached_versions.versions.valid_versions[0]
  fleet {
    project = "projects/${data.google_project.project.number}"
  }

  deletion_policy = "DELETE_IGNORE_ERRORS"
}
```

## Argument Reference

The following arguments are supported:


* `location` -
  (Required)
  The location for the resource

* `name` -
  (Required)
  The name of this resource.

* `oidc_config` -
  (Required)
  OIDC discovery information of the target cluster.
  Kubernetes Service Account (KSA) tokens are JWT tokens signed by the cluster
  API server. This fields indicates how GCP services
  validate KSA tokens in order to allow system workloads (such as GKE Connect
  and telemetry agents) to authenticate back to GCP.
  Both clusters with public and private issuer URLs are supported.
  Clusters with public issuers only need to specify the `issuer_url` field
  while clusters with private issuers need to provide both
  `issuer_url` and `jwks`.
  Structure is [documented below](#nested_oidc_config).

* `platform_version` -
  (Required)
  The platform version for the cluster (e.g. `1.23.0-gke.1`).

* `distribution` -
  (Required)
  The Kubernetes distribution of the underlying attached cluster. Supported values:
  "eks", "aks".

* `fleet` -
  (Required)
  Fleet configuration.
  Structure is [documented below](#nested_fleet).


<a name="nested_oidc_config"></a>The `oidc_config` block supports:

* `issuer_url` -
  (Required)
  A JSON Web Token (JWT) issuer URI. `issuer` must start with `https://`

* `jwks` -
  (Optional)
  OIDC verification keys in JWKS format (RFC 7517).

<a name="nested_fleet"></a>The `fleet` block supports:

* `membership` -
  (Output)
  The name of the managed Hub Membership resource associated to this
  cluster. Membership names are formatted as
  projects/<project-number>/locations/global/membership/<cluster-id>.

* `project` -
  (Required)
  The number of the Fleet host project where this cluster will be registered.

- - -


* `description` -
  (Optional)
  A human readable description of this attached cluster. Cannot be longer
  than 255 UTF-8 encoded bytes.

* `annotations` -
  (Optional)
  Optional. Annotations on the cluster. This field has the same
  restrictions as Kubernetes annotations. The total size of all keys and
  values combined is limited to 256k. Key can have 2 segments: prefix (optional)
  and name (required), separated by a slash (/). Prefix must be a DNS subdomain.
  Name must be 63 characters or less, begin and end with alphanumerics,
  with dashes (-), underscores (_), dots (.), and alphanumerics between.

  **Note**: This field is non-authoritative, and will only manage the annotations present in your configuration.
  Please refer to the field `effective_annotations` for all of the annotations present on the resource.

* `logging_config` -
  (Optional)
  Logging configuration.
  Structure is [documented below](#nested_logging_config).

* `authorization` -
  (Optional)
  Configuration related to the cluster RBAC settings.
  Structure is [documented below](#nested_authorization).

* `monitoring_config` -
  (Optional)
  Monitoring configuration.
  Structure is [documented below](#nested_monitoring_config).

* `binary_authorization` -
  (Optional)
  Binary Authorization configuration.
  Structure is [documented below](#nested_binary_authorization).

* `proxy_config` -
  (Optional)
  Support for proxy configuration.
  Structure is [documented below](#nested_proxy_config).

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

* `deletion_policy` - (Optional) Policy to determine what flags to send on delete.

<a name="nested_logging_config"></a>The `logging_config` block supports:

* `component_config` -
  (Optional)
  The configuration of the logging components
  Structure is [documented below](#nested_component_config).


<a name="nested_component_config"></a>The `component_config` block supports:

* `enable_components` -
  (Optional)
  The components to be enabled.
  Each value may be one of: `SYSTEM_COMPONENTS`, `WORKLOADS`.

<a name="nested_authorization"></a>The `authorization` block supports:

* `admin_users` -
  (Optional)
  Users that can perform operations as a cluster admin. A managed
  ClusterRoleBinding will be created to grant the `cluster-admin` ClusterRole
  to the users. Up to ten admin users can be provided.
  For more info on RBAC, see
  https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles

* `admin_groups` -
  (Optional)
  Groups that can perform operations as a cluster admin. A managed
  ClusterRoleBinding will be created to grant the `cluster-admin` ClusterRole
  to the groups. Up to ten admin groups can be provided.
  For more info on RBAC, see
  https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles

<a name="nested_monitoring_config"></a>The `monitoring_config` block supports:

* `managed_prometheus_config` -
  (Optional)
  Enable Google Cloud Managed Service for Prometheus in the cluster.
  Structure is [documented below](#nested_managed_prometheus_config).


<a name="nested_managed_prometheus_config"></a>The `managed_prometheus_config` block supports:

* `enabled` -
  (Optional)
  Enable Managed Collection.

<a name="nested_binary_authorization"></a>The `binary_authorization` block supports:

* `evaluation_mode` -
  (Optional)
  Configure Binary Authorization evaluation mode.
  Possible values are: `DISABLED`, `PROJECT_SINGLETON_POLICY_ENFORCE`.

<a name="nested_proxy_config"></a>The `proxy_config` block supports:

* `kubernetes_secret` -
  (Optional)
  The Kubernetes Secret resource that contains the HTTP(S) proxy configuration.
  Structure is [documented below](#nested_kubernetes_secret).


<a name="nested_kubernetes_secret"></a>The `kubernetes_secret` block supports:

* `name` -
  (Required)
  Name of the kubernetes secret containing the proxy config.

* `namespace` -
  (Required)
  Namespace of the kubernetes secret containing the proxy config.

## 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}}/locations/{{location}}/attachedClusters/{{name}}`

* `cluster_region` -
  Output only. The region where this cluster runs.
  For EKS clusters, this is an AWS region. For AKS clusters,
  this is an Azure region.

* `state` -
  The current state of the cluster. Possible values:
  STATE_UNSPECIFIED, PROVISIONING, RUNNING, RECONCILING, STOPPING, ERROR,
  DEGRADED

* `uid` -
  A globally unique identifier for the cluster.

* `reconciling` -
  If set, there are currently changes in flight to the cluster.

* `create_time` -
  Output only. The time at which this cluster was created.

* `update_time` -
  The time at which this cluster was last updated.

* `kubernetes_version` -
  The Kubernetes version of the cluster.

* `workload_identity_config` -
  Workload Identity settings.
  Structure is [documented below](#nested_workload_identity_config).

* `errors` -
  A set of errors found in the cluster.
  Structure is [documented below](#nested_errors).

* `effective_annotations` -
  All of annotations (key/value pairs) present on the resource in GCP, including the annotations configured through Terraform, other clients and services.


<a name="nested_workload_identity_config"></a>The `workload_identity_config` block contains:

* `identity_provider` -
  (Optional)
  The ID of the OIDC Identity Provider (IdP) associated to
  the Workload Identity Pool.

* `issuer_uri` -
  (Optional)
  The OIDC issuer URL for this cluster.

* `workload_pool` -
  (Optional)
  The Workload Identity Pool associated to the cluster.

<a name="nested_errors"></a>The `errors` block contains:

* `message` -
  (Optional)
  Human-friendly description of the error.

## 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


Cluster can be imported using any of these accepted formats:

* `projects/{{project}}/locations/{{location}}/attachedClusters/{{name}}`
* `{{project}}/{{location}}/{{name}}`
* `{{location}}/{{name}}`


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

```tf
import {
  id = "projects/{{project}}/locations/{{location}}/attachedClusters/{{name}}"
  to = google_container_attached_cluster.default
}
```

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

```
$ terraform import google_container_attached_cluster.default projects/{{project}}/locations/{{location}}/attachedClusters/{{name}}
$ terraform import google_container_attached_cluster.default {{project}}/{{location}}/{{name}}
$ terraform import google_container_attached_cluster.default {{location}}/{{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).
