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

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

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

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

* `google_dataplex_asset_iam_policy`: Retrieves the IAM policy for the asset

~> **Note:** `google_dataplex_asset_iam_policy` **cannot** be used in conjunction with `google_dataplex_asset_iam_binding` and `google_dataplex_asset_iam_member` or they will fight over what your policy should be.

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



## google_dataplex_asset_iam_policy

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

resource "google_dataplex_asset_iam_policy" "policy" {
  project = google_dataplex_asset.example.project
  location = google_dataplex_asset.example.location
  lake = google_dataplex_asset.example.lake
  dataplex_zone = google_dataplex_asset.example.dataplex_zone
  asset = google_dataplex_asset.example.name
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_dataplex_asset_iam_binding

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

## google_dataplex_asset_iam_member

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


## Argument Reference

The following arguments are supported:

* `asset` - (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_asset_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_asset_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/{{dataplex_zone}}/assets/{{name}}
* {{project}}/{{location}}/{{lake}}/{{dataplex_zone}}/{{name}}
* {{location}}/{{lake}}/{{dataplex_zone}}/{{name}}
* {{name}}

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

Dataplex asset 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_asset_iam_member.editor "projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{dataplex_zone}}/assets/{{asset}} 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_asset_iam_binding.editor "projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{dataplex_zone}}/assets/{{asset}} roles/viewer"
```

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

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