---
# ----------------------------------------------------------------------------
#
#     ***     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 (2nd gen)"
description: |-
  Collection of resources to manage IAM policy for Cloud Functions (2nd gen) function
---

# IAM policy for Cloud Functions (2nd gen) function
Three different resources help you manage your IAM policy for Cloud Functions (2nd gen) function. Each of these resources serves a different use case:

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

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

* `google_cloudfunctions2_function_iam_policy`: Retrieves the IAM policy for the function

~> **Note:** `google_cloudfunctions2_function_iam_policy` **cannot** be used in conjunction with `google_cloudfunctions2_function_iam_binding` and `google_cloudfunctions2_function_iam_member` or they will fight over what your policy should be.

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




## google\_cloudfunctions2\_function\_iam\_policy

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

resource "google_cloudfunctions2_function_iam_policy" "policy" {
  project = google_cloudfunctions2_function.function.project
  location = google_cloudfunctions2_function.function.location
  cloud_function = google_cloudfunctions2_function.function.name
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google\_cloudfunctions2\_function\_iam\_binding

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

## google\_cloudfunctions2\_function\_iam\_member

```hcl
resource "google_cloudfunctions2_function_iam_member" "member" {
  project = google_cloudfunctions2_function.function.project
  location = google_cloudfunctions2_function.function.location
  cloud_function = google_cloudfunctions2_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
* `location` - (Required) The location of this cloud function. 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_cloudfunctions2_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_cloudfunctions2_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/{{location}}/functions/{{cloud_function}}
* {{project}}/{{location}}/{{cloud_function}}
* {{location}}/{{cloud_function}}
* {{cloud_function}}

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

Cloud Functions (2nd gen) function 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_cloudfunctions2_function_iam_member.editor "projects/{{project}}/locations/{{location}}/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_cloudfunctions2_function_iam_binding.editor "projects/{{project}}/locations/{{location}}/functions/{{cloud_function}} roles/viewer"
```

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