---
# ----------------------------------------------------------------------------
#
#     ***     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` - (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 location is provided in the parent identifier and no
  location 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_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).
