---
# ----------------------------------------------------------------------------
#
#     ***     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 Identity"
description: |-
  A Cloud Identity resource representing a Group.
---

# google\_cloud\_identity\_group

A Cloud Identity resource representing a Group.


To get more information about Group, see:

* [API documentation](https://cloud.google.com/identity/docs/reference/rest/v1beta1/groups)
* How-to Guides
    * [Official Documentation](https://cloud.google.com/identity/docs/how-to/setup)

~> **Warning:** If you are using User ADCs (Application Default Credentials) with this resource,
you must specify a `billing_project` and set `user_project_override` to true
in the provider configuration. Otherwise the Cloud Identity API will return a 403 error.
Your account must have the `serviceusage.services.use` permission on the
`billing_project` you defined.

## Example Usage - Cloud Identity Groups Basic


```hcl
resource "google_cloud_identity_group" "cloud_identity_group_basic" {
  display_name         = "my-identity-group"
  initial_group_config = "WITH_INITIAL_OWNER"

  parent = "customers/A01b123xz"

  group_key {
  	id = "my-identity-group@example.com"
  }

  labels = {
    "cloudidentity.googleapis.com/groups.discussion_forum" = ""
  }
}
```

## Argument Reference

The following arguments are supported:


* `group_key` -
  (Required)
  EntityKey of the Group.
  Structure is [documented below](#nested_group_key).

* `parent` -
  (Required)
  The resource name of the entity under which this Group resides in the
  Cloud Identity resource hierarchy.
  Must be of the form identitysources/{identity_source_id} for external-identity-mapped
  groups or customers/{customer_id} for Google Groups.

* `labels` -
  (Required)
  One or more label entries that apply to the Group. Currently supported labels contain a key with an empty value.
  Google Groups are the default type of group and have a label with a key of cloudidentity.googleapis.com/groups.discussion_forum and an empty value.
  Existing Google Groups can have an additional label with a key of cloudidentity.googleapis.com/groups.security and an empty value added to them. This is an immutable change and the security label cannot be removed once added.
  Dynamic groups have a label with a key of cloudidentity.googleapis.com/groups.dynamic.
  Identity-mapped groups for Cloud Search have a label with a key of system/groups/external and an empty value.


<a name="nested_group_key"></a>The `group_key` block supports:

* `id` -
  (Required)
  The ID of the entity.
  For Google-managed entities, the id must be the email address of an existing
  group or user.
  For external-identity-mapped entities, the id must be a string conforming
  to the Identity Source's requirements.
  Must be unique within a namespace.

* `namespace` -
  (Optional)
  The namespace in which the entity exists.
  If not specified, the EntityKey represents a Google-managed entity
  such as a Google user or a Google Group.
  If specified, the EntityKey represents an external-identity-mapped group.
  The namespace must correspond to an identity source created in Admin Console
  and must be in the form of `identitysources/{identity_source_id}`.

- - -


* `display_name` -
  (Optional)
  The display name of the Group.

* `description` -
  (Optional)
  An extended description to help users determine the purpose of a Group.
  Must not be longer than 4,096 characters.

* `initial_group_config` -
  (Optional)
  The initial configuration options for creating a Group.
  See the
  [API reference](https://cloud.google.com/identity/docs/reference/rest/v1beta1/groups/create#initialgroupconfig)
  for possible values.
  Default value is `EMPTY`.
  Possible values are: `INITIAL_GROUP_CONFIG_UNSPECIFIED`, `WITH_INITIAL_OWNER`, `EMPTY`.


## Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

* `id` - an identifier for the resource with format `{{name}}`

* `name` -
  Resource name of the Group in the format: groups/{group_id}, where group_id
  is the unique ID assigned to the Group.

* `additional_group_keys` -
  Additional group keys associated with the Group
  Structure is [documented below](#nested_additional_group_keys).

* `create_time` -
  The time when the Group was created.

* `update_time` -
  The time when the Group was last updated.


<a name="nested_additional_group_keys"></a>The `additional_group_keys` block contains:

* `id` -
  (Output)
  The ID of the entity.
  For Google-managed entities, the id must be the email address of an existing
  group or user.
  For external-identity-mapped entities, the id must be a string conforming
  to the Identity Source's requirements.
  Must be unique within a namespace.

* `namespace` -
  (Output)
  The namespace in which the entity exists.
  If not specified, the EntityKey represents a Google-managed entity
  such as a Google user or a Google Group.
  If specified, the EntityKey represents an external-identity-mapped group.
  The namespace must correspond to an identity source created in Admin Console
  and must be in the form of `identitysources/{identity_source_id}`.

## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 20 minutes.
- `update` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


Group can be imported using any of these accepted formats:

* `{{name}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import Group using one of the formats above. For example:

```tf
import {
  id = "{{name}}"
  to = google_cloud_identity_group.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), Group can be imported using one of the formats above. For example:

```
$ terraform import google_cloud_identity_group.default {{name}}
```
