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

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

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

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

* `google_dataplex_zone_iam_policy`: Retrieves the IAM policy for the zone

~> **Note:** `google_dataplex_zone_iam_policy` **cannot** be used in conjunction with `google_dataplex_zone_iam_binding` and `google_dataplex_zone_iam_member` or they will fight over what your policy should be.

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



## google_dataplex_zone_iam_policy

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

resource "google_dataplex_zone_iam_policy" "policy" {
  project = google_dataplex_zone.example.project
  location = google_dataplex_zone.example.location
  lake = google_dataplex_zone.example.lake
  dataplex_zone = google_dataplex_zone.example.name
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_dataplex_zone_iam_binding

```hcl
resource "google_dataplex_zone_iam_binding" "binding" {
  project = google_dataplex_zone.example.project
  location = google_dataplex_zone.example.location
  lake = google_dataplex_zone.example.lake
  dataplex_zone = google_dataplex_zone.example.name
  role = "roles/viewer"
  members = [
    "user:jane@example.com",
  ]
}
```

## google_dataplex_zone_iam_member

```hcl
resource "google_dataplex_zone_iam_member" "member" {
  project = google_dataplex_zone.example.project
  location = google_dataplex_zone.example.location
  lake = google_dataplex_zone.example.lake
  dataplex_zone = google_dataplex_zone.example.name
  role = "roles/viewer"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:

* `dataplex_zone` - (Required) 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_zone_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_zone_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}}/zones/{{name}}
* {{project}}/{{location}}/{{lake}}/{{name}}
* {{location}}/{{lake}}/{{name}}
* {{name}}

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

Dataplex zone 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_zone_iam_member.editor "projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{zone}} 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_zone_iam_binding.editor "projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{zone}} roles/viewer"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_dataplex_zone_iam_policy.editor projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{zone}}
```

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