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

# IAM policy for Dataproc Job

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

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

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

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

## google_dataproc_job_iam_policy

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

resource "google_dataproc_job_iam_policy" "editor" {
  project     = "your-project"
  region      = "your-region"
  job_id      = "your-dataproc-job"
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_dataproc_job_iam_binding

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

## google_dataproc_job_iam_member

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

## Argument Reference

The following arguments are supported:

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

For `google_dataproc_job_iam_member` or `google_dataproc_job_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_job_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_job_iam_policy` only:
* `policy_data` - (Required) The policy data generated by a `google_iam_policy` data source.

- - -

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

* `region` - (Optional) The region in which the job 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 jobs'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 `job_id`, `role`, and `member`. For example:

* `"projects/{project}/regions/{region}/jobs/{job_id} 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}/jobs/{job_id} roles/editor user:jane@example.com"
  to = google_dataproc_job_iam_member.default
}
```

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

```
$ terraform import google_dataproc_job_iam_member.default "projects/{project}/regions/{region}/jobs/{job_id} roles/editor user:jane@example.com"
```

### Importing IAM bindings

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

* `"projects/{project}/regions/{region}/jobs/{job_id} 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}/jobs/{job_id} roles/editor"
  to = google_dataproc_job_iam_binding.default
}
```

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

```
$ terraform import google_dataproc_job_iam_binding.default "projects/{project}/regions/{region}/jobs/{job_id} roles/editor"
```

### Importing IAM policies

IAM policy imports use the `job_id` identifier of the Dataproc Job resource only. For example:

* `projects/{project}/regions/{region}/jobs/{job_id}`

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}/jobs/{job_id}"
  to = google_dataproc_job_iam_policy.default
}
```

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

```
$ terraform import google_dataproc_job_iam_policy.default "projects/{project}/regions/{region}/jobs/{job_id}"
```
