---
# ----------------------------------------------------------------------------
#
#     ***     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: "Security Command Center (SCC)"
description: |-
  Collection of resources to manage IAM policy for Security Command Center (SCC) Source
---

# IAM policy for Security Command Center (SCC) Source
Three different resources help you manage your IAM policy for Security Command Center (SCC) Source. Each of these resources serves a different use case:

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

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

* `google_scc_source_iam_policy`: Retrieves the IAM policy for the source

~> **Note:** `google_scc_source_iam_policy` **cannot** be used in conjunction with `google_scc_source_iam_binding` and `google_scc_source_iam_member` or they will fight over what your policy should be.

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



## google_scc_source_iam_policy

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

resource "google_scc_source_iam_policy" "policy" {
  source = google_scc_source.custom_source.name
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_scc_source_iam_binding

```hcl
resource "google_scc_source_iam_binding" "binding" {
  source = google_scc_source.custom_source.name
  role = "roles/viewer"
  members = [
    "user:jane@example.com",
  ]
}
```

## google_scc_source_iam_member

```hcl
resource "google_scc_source_iam_member" "member" {
  source = google_scc_source.custom_source.name
  role = "roles/viewer"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:

* `source` - (Required) Used to find the parent resource to bind the IAM policy to

* `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_scc_source_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_scc_source_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:

* organizations/{{organization}}/sources/{{source}}
* {{organization}}/{{source}}
* {{source}}

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

Security Command Center (SCC) source 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_scc_source_iam_member.editor "organizations/{{organization}}/sources/{{source}} 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_scc_source_iam_binding.editor "organizations/{{organization}}/sources/{{source}} roles/viewer"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_scc_source_iam_policy.editor organizations/{{organization}}/sources/{{source}}
```

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