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

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

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

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

* `google_compute_disk_iam_policy`: Retrieves the IAM policy for the disk

~> **Note:** `google_compute_disk_iam_policy` **cannot** be used in conjunction with `google_compute_disk_iam_binding` and `google_compute_disk_iam_member` or they will fight over what your policy should be.

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




## google\_compute\_disk\_iam\_policy

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

resource "google_compute_disk_iam_policy" "policy" {
  project = google_compute_disk.default.project
  zone = google_compute_disk.default.zone
  name = google_compute_disk.default.name
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google\_compute\_disk\_iam\_binding

```hcl
resource "google_compute_disk_iam_binding" "binding" {
  project = google_compute_disk.default.project
  zone = google_compute_disk.default.zone
  name = google_compute_disk.default.name
  role = "roles/viewer"
  members = [
    "user:jane@example.com",
  ]
}
```

## google\_compute\_disk\_iam\_member

```hcl
resource "google_compute_disk_iam_member" "member" {
  project = google_compute_disk.default.project
  zone = google_compute_disk.default.zone
  name = google_compute_disk.default.name
  role = "roles/viewer"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:

* `name` - (Required) Used to find the parent resource to bind the IAM policy to
* `zone` - (Optional) A reference to the zone where the disk resides. Used to find the parent resource to bind the IAM policy to. If not specified,
  the value will be parsed from the identifier of the parent resource. If no zone is provided in the parent identifier and no
  zone is specified, it is taken from the provider configuration.

* `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_compute_disk_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_compute_disk_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}}/zones/{{zone}}/disks/{{name}}
* {{project}}/{{zone}}/{{name}}
* {{zone}}/{{name}}
* {{name}}

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

Compute Engine disk 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_compute_disk_iam_member.editor "projects/{{project}}/zones/{{zone}}/disks/{{disk}} 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_compute_disk_iam_binding.editor "projects/{{project}}/zones/{{zone}}/disks/{{disk}} roles/viewer"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_compute_disk_iam_policy.editor projects/{{project}}/zones/{{zone}}/disks/{{disk}}
```

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