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

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

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

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

* `google_cloudfunctions_function_iam_policy`: Retrieves the IAM policy for the cloudfunction

~> **Note:** `google_cloudfunctions_function_iam_policy` **cannot** be used in conjunction with `google_cloudfunctions_function_iam_binding` and `google_cloudfunctions_function_iam_member` or they will fight over what your policy should be.

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



## google_cloudfunctions_function_iam_policy

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

resource "google_cloudfunctions_function_iam_policy" "policy" {
  project = google_cloudfunctions_function.function.project
  region = google_cloudfunctions_function.function.region
  cloud_function = google_cloudfunctions_function.function.name
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_cloudfunctions_function_iam_binding

```hcl
resource "google_cloudfunctions_function_iam_binding" "binding" {
  project = google_cloudfunctions_function.function.project
  region = google_cloudfunctions_function.function.region
  cloud_function = google_cloudfunctions_function.function.name
  role = "roles/viewer"
  members = [
    "user:jane@example.com",
  ]
}
```

## google_cloudfunctions_function_iam_member

```hcl
resource "google_cloudfunctions_function_iam_member" "member" {
  project = google_cloudfunctions_function.function.project
  region = google_cloudfunctions_function.function.region
  cloud_function = google_cloudfunctions_function.function.name
  role = "roles/viewer"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:

* `cloud_function` - (Required) Used to find the parent resource to bind the IAM policy to
* `region` - (Optional) The location of this cloud function. 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 region is provided in the parent identifier and no
  region 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_cloudfunctions_function_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_cloudfunctions_function_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/{{region}}/functions/{{cloud_function}}
* {{project}}/{{region}}/{{cloud_function}}
* {{region}}/{{cloud_function}}
* {{cloud_function}}

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

Cloud Functions cloudfunction 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_cloudfunctions_function_iam_member.editor "projects/{{project}}/locations/{{region}}/functions/{{cloud_function}} 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_cloudfunctions_function_iam_binding.editor "projects/{{project}}/locations/{{region}}/functions/{{cloud_function}} roles/viewer"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_cloudfunctions_function_iam_policy.editor projects/{{project}}/locations/{{region}}/functions/{{cloud_function}}
```

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