---
subcategory: "Dataproc"
description: |-
 Collection of resources to manage IAM policy for a Dataproc cluster.
---

# IAM policy for Dataproc Cluster

Three different resources help you manage IAM policies on dataproc clusters. Each of these resources serves a different use case:

* `google_dataproc_cluster_iam_policy`: Authoritative. Sets the IAM policy for the cluster and replaces any existing policy already attached.
* `google_dataproc_cluster_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 cluster are preserved.
* `google_dataproc_cluster_iam_member`: Non-authoritative. Updates the IAM policy to grant a role to a new member. Other members for the role for the cluster are preserved.

~> **Note:** `google_dataproc_cluster_iam_policy` **cannot** be used in conjunction with `google_dataproc_cluster_iam_binding` and `google_dataproc_cluster_iam_member` or they will fight over what your policy should be. In addition, be careful not to accidentally unset ownership of the cluster as `google_dataproc_cluster_iam_policy` replaces the entire policy.

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

## google_dataproc_cluster_iam_policy

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

resource "google_dataproc_cluster_iam_policy" "editor" {
  project     = "your-project"
  region      = "your-region"
  cluster     = "your-dataproc-cluster"
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_dataproc_cluster_iam_binding

```hcl
resource "google_dataproc_cluster_iam_binding" "editor" {
  cluster = "your-dataproc-cluster"
  role    = "roles/editor"
  members = [
    "user:jane@example.com",
  ]
}
```

## google_dataproc_cluster_iam_member

```hcl
resource "google_dataproc_cluster_iam_member" "editor" {
  cluster = "your-dataproc-cluster"
  role    = "roles/editor"
  member  = "user:jane@example.com"
}
```

## Argument Reference

The following arguments are supported:

* `cluster` - (Required) The name or relative resource id of the cluster to manage IAM policies for.

For `google_dataproc_cluster_iam_member` or `google_dataproc_cluster_iam_binding`:

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

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

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

- - -

* `project` - (Optional) The project in which the cluster belongs. If it
    is not provided, Terraform will use the provider default.

* `region` - (Optional) The region in which the cluster belongs. If it
    is not provided, Terraform will use the provider default.

## Attributes Reference

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

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

## Import

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

### Importing IAM members

IAM member imports use space-delimited identifiers that contain the resource's `cluster`, `role`, and `member`. For example:

* `"projects/{project}/regions/{region}/clusters/{cluster} roles/editor user:jane@example.com"`

An [`import` block](https://developer.hashicorp.com/terraform/language/import) (Terraform v1.5.0 and later) can be used to import IAM members:

```tf
import {
  id = "projects/{project}/regions/{region}/clusters/{cluster} roles/editor user:jane@example.com"
  to = google_dataproc_cluster_iam_member.default
}
```

The [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import) can also be used:

```
$ terraform import google_dataproc_cluster_iam_member.default "projects/{{project_id}}/datasets/{{dataset_id}} roles/viewer user:foo@example.com"
```

### Importing IAM bindings

IAM binding imports use space-delimited identifiers that contain the resource's `cluster`, `role`. For example:

* `"projects/{project}/regions/{region}/clusters/{cluster} roles/editor"`

An [`import` block](https://developer.hashicorp.com/terraform/language/import) (Terraform v1.5.0 and later) can be used to import IAM bindings:

```tf
import {
  id = "projects/{project}/regions/{region}/clusters/{cluster} roles/editor"
  to = google_dataproc_cluster_iam_binding.default
}
```

The [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import) can also be used:

```
$ terraform import google_dataproc_cluster_iam_binding.default "projects/{project}/regions/{region}/clusters/{cluster} roles/editor"
```

### Importing IAM policies

IAM policy imports use the `cluster` identifier of the Dataproc Cluster resource only. For example:

* `projects/{project}/regions/{region}/clusters/{cluster}`

An [`import` block](https://developer.hashicorp.com/terraform/language/import) (Terraform v1.5.0 and later) can be used to import IAM policies:

```tf
import {
  id = projects/{project}/regions/{region}/clusters/{cluster}
  to = google_dataproc_cluster_iam_policy.default
}
```

The [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import) can also be used:

```
$ terraform import google_dataproc_cluster_iam_policy.default projects/{project}/regions/{region}/clusters/{cluster}
```
