---
# ----------------------------------------------------------------------------
#
#     ***     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: "BigQuery Connection"
description: |-
  Collection of resources to manage IAM policy for BigQuery Connection Connection
---

# IAM policy for BigQuery Connection Connection
Three different resources help you manage your IAM policy for BigQuery Connection Connection. Each of these resources serves a different use case:

* `google_bigquery_connection_iam_policy`: Authoritative. Sets the IAM policy for the connection and replaces any existing policy already attached.
* `google_bigquery_connection_iam_binding`: Authoritative for a given role. Updates the IAM policy to grant a role to a list of members. Other roles within the IAM policy for the connection are preserved.
* `google_bigquery_connection_iam_member`: Non-authoritative. Updates the IAM policy to grant a role to a new member. Other members for the role for the connection are preserved.

A data source can be used to retrieve policy data in advent you do not need creation

* `google_bigquery_connection_iam_policy`: Retrieves the IAM policy for the connection

~> **Note:** `google_bigquery_connection_iam_policy` **cannot** be used in conjunction with `google_bigquery_connection_iam_binding` and `google_bigquery_connection_iam_member` or they will fight over what your policy should be.

~> **Note:** `google_bigquery_connection_iam_binding` resources **can be** used in conjunction with `google_bigquery_connection_iam_member` resources **only if** they do not grant privilege to the same role.




## google\_bigquery\_connection\_iam\_policy

```hcl
data "google_iam_policy" "admin" {
  binding {
    role = "roles/viewer"
    members = [
      "user:jane@example.com",
    ]
  }
}

resource "google_bigquery_connection_iam_policy" "policy" {
  project = google_bigquery_connection.connection.project
  location = google_bigquery_connection.connection.location
  connection_id = google_bigquery_connection.connection.connection_id
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google\_bigquery\_connection\_iam\_binding

```hcl
resource "google_bigquery_connection_iam_binding" "binding" {
  project = google_bigquery_connection.connection.project
  location = google_bigquery_connection.connection.location
  connection_id = google_bigquery_connection.connection.connection_id
  role = "roles/viewer"
  members = [
    "user:jane@example.com",
  ]
}
```

## google\_bigquery\_connection\_iam\_member

```hcl
resource "google_bigquery_connection_iam_member" "member" {
  project = google_bigquery_connection.connection.project
  location = google_bigquery_connection.connection.location
  connection_id = google_bigquery_connection.connection.connection_id
  role = "roles/viewer"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:

* `connection_id` - (Required) Optional connection id that should be assigned to the created connection.
 Used to find the parent resource to bind the IAM policy to
* `location` - (Required) The geographic location where the connection should reside.
Cloud SQL instance must be in the same location as the connection
with following exceptions: Cloud SQL us-central1 maps to BigQuery US, Cloud SQL europe-west1 maps to BigQuery EU.
Examples: US, EU, asia-northeast1, us-central1, europe-west1.
Spanner Connections same as spanner region
AWS allowed regions are aws-us-east-1
Azure allowed regions are azure-eastus2 Used to find the parent resource to bind the IAM policy to

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the project will be parsed from the identifier of the parent resource. If no project is provided in the parent identifier and no project is specified, the provider project is used.

* `member/members` - (Required) Identities that will be granted the privilege in `role`.
  Each entry can have one of the following values:
  * **allUsers**: A special identifier that represents anyone who is on the internet; with or without a Google account.
  * **allAuthenticatedUsers**: A special identifier that represents anyone who is authenticated with a Google account or a service account.
  * **user:{emailid}**: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com.
  * **serviceAccount:{emailid}**: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com.
  * **group:{emailid}**: An email address that represents a Google group. For example, admins@example.com.
  * **domain:{domain}**: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
  * **projectOwner:projectid**: Owners of the given project. For example, "projectOwner:my-example-project"
  * **projectEditor:projectid**: Editors of the given project. For example, "projectEditor:my-example-project"
  * **projectViewer:projectid**: Viewers of the given project. For example, "projectViewer:my-example-project"

* `role` - (Required) The role that should be applied. Only one
    `google_bigquery_connection_iam_binding` can be used per role. Note that custom roles must be of the format
    `[projects|organizations]/{parent-name}/roles/{role-name}`.

* `policy_data` - (Required only by `google_bigquery_connection_iam_policy`) The policy data generated by
  a `google_iam_policy` data source.

## Attributes Reference

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

* `etag` - (Computed) The etag of the IAM policy.

## Import

For all import syntaxes, the "resource in question" can take any of the following forms:

* projects/{{project}}/locations/{{location}}/connections/{{connection_id}}
* {{project}}/{{location}}/{{connection_id}}
* {{location}}/{{connection_id}}
* {{connection_id}}

Any variables not passed in the import command will be taken from the provider configuration.

BigQuery Connection connection IAM resources can be imported using the resource identifiers, role, and member.

IAM member imports use space-delimited identifiers: the resource in question, the role, and the member identity, e.g.
```
$ terraform import google_bigquery_connection_iam_member.editor "projects/{{project}}/locations/{{location}}/connections/{{connection_id}} roles/viewer user:jane@example.com"
```

IAM binding imports use space-delimited identifiers: the resource in question and the role, e.g.
```
$ terraform import google_bigquery_connection_iam_binding.editor "projects/{{project}}/locations/{{location}}/connections/{{connection_id}} roles/viewer"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_bigquery_connection_iam_policy.editor projects/{{project}}/locations/{{location}}/connections/{{connection_id}}
```

-> **Custom Roles**: If you're importing a IAM resource with a custom role, make sure to use the
 full name of the custom role, e.g. `[projects/my-project|organizations/my-org]/roles/my-custom-role`.

## User Project Overrides

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