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

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

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

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

* `google_dataplex_task_iam_policy`: Retrieves the IAM policy for the task

~> **Note:** `google_dataplex_task_iam_policy` **cannot** be used in conjunction with `google_dataplex_task_iam_binding` and `google_dataplex_task_iam_member` or they will fight over what your policy should be.

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




## google\_dataplex\_task\_iam\_policy

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

resource "google_dataplex_task_iam_policy" "policy" {
  project = google_dataplex_task.example.project
  location = google_dataplex_task.example.location
  lake = google_dataplex_task.example.lake
  task_id = google_dataplex_task.example.task_id
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google\_dataplex\_task\_iam\_binding

```hcl
resource "google_dataplex_task_iam_binding" "binding" {
  project = google_dataplex_task.example.project
  location = google_dataplex_task.example.location
  lake = google_dataplex_task.example.lake
  task_id = google_dataplex_task.example.task_id
  role = "roles/viewer"
  members = [
    "user:jane@example.com",
  ]
}
```

## google\_dataplex\_task\_iam\_member

```hcl
resource "google_dataplex_task_iam_member" "member" {
  project = google_dataplex_task.example.project
  location = google_dataplex_task.example.location
  lake = google_dataplex_task.example.lake
  task_id = google_dataplex_task.example.task_id
  role = "roles/viewer"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:

* `location` - (Required) The location in which the task will be created in.
 Used to find the parent resource to bind the IAM policy to
* `lake` - (Required) The lake in which the task will be created in.
 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_dataplex_task_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_dataplex_task_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}}/lakes/{{lake}}/tasks/{{task_id}}
* {{project}}/{{location}}/{{lake}}/{{task_id}}
* {{location}}/{{lake}}/{{task_id}}
* {{task_id}}

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

Dataplex task 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_dataplex_task_iam_member.editor "projects/{{project}}/locations/{{location}}/lakes/{{lake}}/tasks/{{task_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_dataplex_task_iam_binding.editor "projects/{{project}}/locations/{{location}}/lakes/{{lake}}/tasks/{{task_id}} roles/viewer"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_dataplex_task_iam_policy.editor projects/{{project}}/locations/{{location}}/lakes/{{lake}}/tasks/{{task_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).
