---
# ----------------------------------------------------------------------------
#
#     ***     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 a Machine Image resource.
---

# google_compute_machine_image

Represents a Machine Image resource. Machine images store all the configuration,
metadata, permissions, and data from one or more disks required to create a
Virtual machine (VM) instance.

~> **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 MachineImage, see:

* [API documentation](https://cloud.google.com/compute/docs/reference/rest/beta/machineImages)
* How-to Guides
    * [Official Documentation](https://cloud.google.com/compute/docs/machine-images)

<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_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=machine_image_basic&open_in_editor=main.tf" 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 - Machine Image Basic


```hcl
resource "google_compute_instance" "vm" {
  provider     = google-beta
  name         = "my-vm"
  machine_type = "e2-medium"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  network_interface {
    network = "default"
  }
}

resource "google_compute_machine_image" "image" {
  provider        = google-beta
  name            = "my-image"
  source_instance = google_compute_instance.vm.self_link
}
```
<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_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=compute_machine_image_kms&open_in_editor=main.tf" 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 - Compute Machine Image Kms


```hcl
resource "google_compute_instance" "vm" {
  provider     = google-beta
  name         = "my-vm"
  machine_type = "e2-medium"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  network_interface {
    network = "default"
  }
}

resource "google_compute_machine_image" "image" {
  provider        = google-beta
  name            = "my-image"
  source_instance = google_compute_instance.vm.self_link
  machine_image_encryption_key {
    kms_key_name = google_kms_crypto_key.crypto_key.id
  }
}

resource "google_kms_crypto_key" "crypto_key" {
  provider = google-beta
  name     = "key"
  key_ring = google_kms_key_ring.key_ring.id
}

resource "google_kms_key_ring" "key_ring" {
  provider = google-beta
  name     = "keyring"
  location = "us"
}
```

## Argument Reference

The following arguments are supported:


* `name` -
  (Required)
  Name of the resource.

* `source_instance` -
  (Required)
  The source instance used to create the machine image. You can provide this as a partial or full URL to the resource.


- - -


* `description` -
  (Optional)
  A text description of the resource.

* `guest_flush` -
  (Optional)
  Specify this to create an application consistent machine image by informing the OS to prepare for the snapshot process.
  Currently only supported on Windows instances using the Volume Shadow Copy Service (VSS).

* `machine_image_encryption_key` -
  (Optional)
  Encrypts the machine image using a customer-supplied encryption key.
  After you encrypt a machine image with a customer-supplied key, you must
  provide the same key if you use the machine image later (e.g. to create a
  instance from the image)
  Structure is [documented below](#nested_machine_image_encryption_key).

* `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_machine_image_encryption_key"></a>The `machine_image_encryption_key` block supports:

* `raw_key` -
  (Optional)
  Specifies a 256-bit customer-supplied encryption key, encoded in
  RFC 4648 base64 to either encrypt or decrypt this resource.

* `sha256` -
  (Output)
  The RFC 4648 base64 encoded SHA-256 hash of the
  customer-supplied encryption key that protects this resource.

* `kms_key_name` -
  (Optional)
  The name of the encryption key that is stored in Google Cloud KMS.

* `kms_key_service_account` -
  (Optional)
  The service account used for the encryption request for the given KMS key.
  If absent, the Compute Engine Service Agent service account 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}}/global/machineImages/{{name}}`

* `storage_locations` -
  The regional or multi-regional Cloud Storage bucket location where the machine image is stored.
* `self_link` - The URI of the created resource.


## 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.
- `delete` - Default is 20 minutes.

## Import


MachineImage can be imported using any of these accepted formats:

* `projects/{{project}}/global/machineImages/{{name}}`
* `{{project}}/{{name}}`
* `{{name}}`


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

```tf
import {
  id = "projects/{{project}}/global/machineImages/{{name}}"
  to = google_compute_machine_image.default
}
```

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

```
$ terraform import google_compute_machine_image.default projects/{{project}}/global/machineImages/{{name}}
$ terraform import google_compute_machine_image.default {{project}}/{{name}}
$ terraform import google_compute_machine_image.default {{name}}
```

## User Project Overrides

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