---
# ----------------------------------------------------------------------------
#
#     ***     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 Deployment Manager"
description: |-
  A collection of resources that are deployed and managed together using
  a configuration file
---

# google\_deployment\_manager\_deployment

A collection of resources that are deployed and managed together using
a configuration file



~> **Warning:** Deployment Manager shares similar behavior with Terraform as both
products manage GCP resource lifecycle and state. This Terraform
resource is intended only to manage a Deployment resource,
and attempts to manage the Deployment's resources in Terraform as well
will likely result in errors or unexpected behavior as the two tools
fight over ownership. We strongly discourage doing so unless you are an
experienced user of both tools.

In addition, due to limitations of the API, Terraform will treat
deployments in preview as recreate-only for any update operation other
than actually deploying an in-preview deployment (i.e. `preview=true` to
`preview=false`).

## Example Usage - Deployment Manager Deployment Basic


```hcl
resource "google_deployment_manager_deployment" "deployment" {
  name = "my-deployment"

  target {
    config {
      content = file("path/to/config.yml")
    }
  }

  labels {
    key = "foo"
    value = "bar"
  }
}
```
## Example Usage - Deployment Manager Deployment Imports


```hcl
resource "google_deployment_manager_deployment" "deployment" {
  name = "my-deployment"
  target {
    config {
      content = <<EOF
imports:
- path: service_account.jinja
- path: vm.jinja

resources:
- name: &SA_NAME my-vm-account
  type: service_account.jinja
- name: my-vm
  type: vm.jinja
  properties:
    serviceAccountId: *SA_NAME
EOF

    imports {
      name = "vm.jinja"
      content = file("path/to/vm.jinja")
    }

    imports {
      name = "service_account.jinja"
      content = file("path/to/service_account.jinja")
    }
  }
}
```

## Argument Reference

The following arguments are supported:


* `name` -
  (Required)
  Unique name for the deployment

* `target` -
  (Required)
  Parameters that define your deployment, including the deployment
  configuration and relevant templates.
  Structure is [documented below](#nested_target).


<a name="nested_target"></a>The `target` block supports:

* `config` -
  (Required)
  The root configuration file to use for this deployment.
  Structure is [documented below](#nested_config).

* `imports` -
  (Optional)
  Specifies import files for this configuration. This can be
  used to import templates or other files. For example, you might
  import a text file in order to use the file in a template.
  Structure is [documented below](#nested_imports).


<a name="nested_config"></a>The `config` block supports:

* `content` -
  (Required)
  The full YAML contents of your configuration file.

<a name="nested_imports"></a>The `imports` block supports:

* `content` -
  (Optional)
  The full contents of the template that you want to import.

* `name` -
  (Optional)
  The name of the template to import, as declared in the YAML
  configuration.

- - -


* `description` -
  (Optional)
  Optional user-provided description of deployment.

* `labels` -
  (Optional)
  Key-value pairs to apply to this labels.
  Structure is [documented below](#nested_labels).

* `create_policy` -
  (Optional)
  Set the policy to use for creating new resources. Only used on
  create and update. Valid values are `CREATE_OR_ACQUIRE` (default) or
  `ACQUIRE`. If set to `ACQUIRE` and resources do not already exist,
  the deployment will fail. Note that updating this field does not
  actually affect the deployment, just how it is updated.
  Default value is `CREATE_OR_ACQUIRE`.
  Possible values are: `ACQUIRE`, `CREATE_OR_ACQUIRE`.

* `delete_policy` -
  (Optional)
  Set the policy to use for deleting new resources on update/delete.
  Valid values are `DELETE` (default) or `ABANDON`. If `DELETE`,
  resource is deleted after removal from Deployment Manager. If
  `ABANDON`, the resource is only removed from Deployment Manager
  and is not actually deleted. Note that updating this field does not
  actually change the deployment, just how it is updated.
  Default value is `DELETE`.
  Possible values are: `ABANDON`, `DELETE`.

* `preview` -
  (Optional)
  If set to true, a deployment is created with "shell" resources
  that are not actually instantiated. This allows you to preview a
  deployment. It can be updated to false to actually deploy
  with real resources.
   ~>**NOTE:** Deployment Manager does not allow update
  of a deployment in preview (unless updating to preview=false). Thus,
  Terraform will force-recreate deployments if either preview is updated
  to true or if other fields are updated while preview is true.

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

* `key` -
  (Optional)
  Key for label.

* `value` -
  (Optional)
  Value of label.

## 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}}/deployments/{{name}}`

* `deployment_id` -
  Unique identifier for deployment. Output only.

* `manifest` -
  Output only. URL of the manifest representing the last manifest that
  was successfully deployed.

* `self_link` -
  Output only. Server defined URL for the 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 60 minutes.
- `update` - Default is 60 minutes.
- `delete` - Default is 60 minutes.

## Import


Deployment can be imported using any of these accepted formats:

* `projects/{{project}}/deployments/{{name}}`
* `{{project}}/{{name}}`
* `{{name}}`


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

```tf
import {
  id = "projects/{{project}}/deployments/{{name}}"
  to = google_deployment_manager_deployment.default
}
```

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

```
$ terraform import google_deployment_manager_deployment.default projects/{{project}}/deployments/{{name}}
$ terraform import google_deployment_manager_deployment.default {{project}}/{{name}}
$ terraform import google_deployment_manager_deployment.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).
