---
# ----------------------------------------------------------------------------
#
#     ***     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: "Compute Engine"
description: |-
  Represents an Instance Settings resource.
---

# google\_compute\_instance\_settings

Represents an Instance Settings resource. Instance settings are centralized configuration parameters that allow users to configure the default values for specific VM parameters that are normally set using GCE instance API methods.

~> **Warning:** This resource is in beta, and should be used with the terraform-provider-google-beta provider.
See [Provider Versions](https://terraform.io/docs/providers/google/guides/provider_versions.html) for more details on beta resources.

To get more information about InstanceSettings, see:

* [API documentation](https://cloud.google.com/compute/docs/reference/rest/beta/instanceSettings)
* How-to Guides
    * [Update Instance Settings](https://cloud.google.com/compute/docs/metadata/setting-custom-metadata#set-custom-project-zonal-metadata)

<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=instance_settings_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 - Instance Settings Basic


```hcl

resource "google_compute_instance_settings" "gce_instance_settings" {
  provider = google-beta
  zone = "us-east7-b"
  metadata {
    items = {
      foo = "baz"
    }
  }
}

```

## Argument Reference

The following arguments are supported:


* `zone` -
  (Required)
  A reference to the zone where the machine resides.


- - -


* `metadata` -
  (Optional)
  The metadata key/value pairs assigned to all the instances in the corresponding scope.
  Structure is [documented below](#nested_metadata).

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


<a name="nested_metadata"></a>The `metadata` block supports:

* `items` -
  (Optional)
  A metadata key/value items map. The total size of all keys and values must be less than 512KB

## 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}}/zones/{{zone}}/instanceSettings`

* `fingerprint` -
  The fingerprint used for optimistic locking of this resource.  Used
  internally during updates.


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


InstanceSettings can be imported using any of these accepted formats:

* `projects/{{project}}/zones/{{zone}}/instanceSettings`
* `{{project}}/{{zone}}`
* `{{zone}}`


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

```tf
import {
  id = "projects/{{project}}/zones/{{zone}}/instanceSettings"
  to = google_compute_instance_settings.default
}
```

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

```
$ terraform import google_compute_instance_settings.default projects/{{project}}/zones/{{zone}}/instanceSettings
$ terraform import google_compute_instance_settings.default {{project}}/{{zone}}
$ terraform import google_compute_instance_settings.default {{zone}}
```

## User Project Overrides

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