---
# ----------------------------------------------------------------------------
#
#     ***     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: "Migration Center"
description: |-
  A resource that represents an asset group.
---

# google\_migration\_center\_group

A resource that represents an asset group. The purpose of an asset group is to bundle a set of assets that have something in common, while allowing users to add annotations to the group.



<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=migration_group_basic&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Migration Group Basic


```hcl
resource "google_migration_center_group" "default" {
  location     = "us-central1"
  group_id     = "group-test"
  description  = "Terraform integration test description"
  display_name = "Terraform integration test display"
  labels       = {
    key = "value"
  }
}
```

## Argument Reference

The following arguments are supported:


* `location` -
  (Required)
  The location of the group.

* `group_id` -
  (Required)
  Required. User specified ID for the group. It will become the last component of the group name. The ID must be unique within the project, must conform with RFC-1034, is restricted to lower-cased letters, and has a maximum length of 63 characters. The ID must match the regular expression: `[a-z]([a-z0-9-]{0,61}[a-z0-9])?`.


- - -


* `labels` -
  (Optional)
  Labels as key value pairs. 
  **Note**: This field is non-authoritative, and will only manage the labels present in your configuration.
  Please refer to the field `effective_labels` for all of the labels present on the resource.

* `display_name` -
  (Optional)
  Optional. User-friendly display name.

* `description` -
  (Optional)
  Optional. The description of the group.

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.


## Attributes Reference

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

* `id` - an identifier for the resource with format `projects/{{project}}/locations/{{location}}/groups/{{group_id}}`

* `name` -
  Output only. The name of the group.

* `create_time` -
  Output only. The timestamp when the group was created.

* `update_time` -
  Output only. The timestamp when the group was last updated.

* `terraform_labels` -
  The combination of labels configured directly on the resource
   and default labels configured on the provider.

* `effective_labels` -
  All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.


## 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:

* `projects/{{project}}/locations/{{location}}/groups/{{group_id}}`
* `{{project}}/{{location}}/{{group_id}}`
* `{{location}}/{{group_id}}`


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 = "projects/{{project}}/locations/{{location}}/groups/{{group_id}}"
  to = google_migration_center_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_migration_center_group.default projects/{{project}}/locations/{{location}}/groups/{{group_id}}
$ terraform import google_migration_center_group.default {{project}}/{{location}}/{{group_id}}
$ terraform import google_migration_center_group.default {{location}}/{{group_id}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
