Cloud Deployment Manager: GCPโs Native IaC Tool and Why Most Teams Skip It
Cloud Deployment Manager is Googleโs native infrastructure-as-code service โ declarative YAML (or Python/Jinja2 templated) configuration that describes GCP resources, deployed and managed as a single unit Google tracks and can update or tear down coherently. Itโs a genuinely capable tool, and itโs also the rare GCP service where the honest, practically useful advice is โunderstand it, then very likely use something elseโ โ specifically Terraform, which has become the de facto standard for GCP infrastructure-as-code even among teams running entirely on Google Cloud.
Thatโs not a knock on Deployment Managerโs technical design so much as an observation about ecosystem gravity: most teams manage infrastructure across more than one provider or tool (GCP plus a SaaS DNS provider, GCP plus GitHub Actions configuration, GCP plus a third-party monitoring tool), and a single tool that handles all of it coherently beats a GCP-only tool that requires a second system for everything else. Understanding both what Deployment Manager does well and why the ecosystem moved elsewhere is genuinely useful context for making an informed choice rather than defaulting to either option out of habit.
A Basic Deployment Manager Template
resources: - name: my-web-server type: compute.v1.instance properties: zone: us-central1-a machineType: zones/us-central1-a/machineTypes/e2-medium disks: - deviceName: boot type: PERSISTENT boot: true autoDelete: true initializeParams: sourceImage: projects/debian-cloud/global/images/family/debian-12 networkInterfaces: - network: global/networks/default accessConfigs: - name: External NAT type: ONE_TO_ONE_NATgcloud deployment-manager deployments create my-deployment \ --config=vm-template.yaml
# Update the deployment after changing the templategcloud deployment-manager deployments update my-deployment \ --config=vm-template.yaml
# Tear down everything the deployment createdgcloud deployment-manager deployments delete my-deploymentThis is a genuinely clean declarative model โ you describe desired state, Deployment Manager computes and applies the diff, and it tracks every resource it created as part of the named deployment, letting you delete the whole thing cleanly later. Functionally, this is the same core value proposition Terraform and CloudFormation offer.
Where Deployment Manager Is Genuinely Limited
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Limitation โ Practical impact โโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโ GCP-only โ A second tool is needed for any โโ โ non-GCP resource โ DNS at another โโ โ registrar, a SaaS integration, another โโ โ cloud entirely โโ Smaller community and โ Fewer community modules, examples, and โโ ecosystem โ Stack Overflow answers than Terraform โโ No built-in state โ Deployment Manager tracks state โโ inspection/drift detection โ implicitly but lacks Terraform's mature โโ as mature as alternatives โ `plan`/drift-detection workflow โโ Limited templating power โ Jinja2/Python templates work but are โโ compared to Terraform's โ less ergonomic than HCL for complex, โโ module system โ reusable, parameterized infrastructure โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโNone of these are fatal flaws for a genuinely GCP-only environment with simple infrastructure needs โ but they compound as infrastructure complexity and organizational scope grow, which is exactly the trajectory most real infrastructure teams follow over time.
Where Itโs Still a Reasonable Choice
Despite the general recommendation toward Terraform, Deployment Manager has legitimate niches:
- Teams that are strictly, permanently GCP-only with no foreseeable multi-cloud or multi-tool infrastructure need, where the native integration (no provider plugin, direct API access, no state file to manage separately) is a genuine simplicity advantage.
- Simple, foundational bootstrapping โ some organizations use Deployment Manager for the very first layer of infrastructure (creating the initial project structure, IAM bindings, and networking that everything else depends on) precisely because it doesnโt require any external tooling or state backend to get started.
- Google Cloud Marketplace solutions, some of which are built and distributed using Deployment Manager templates under the hood, meaning understanding it has some value even for teams that donโt choose to author their own infrastructure with it, simply to read and reason about what a Marketplace solution actually deploys.
Even within these niches, itโs worth periodically revisiting whether the assumptions still hold โ a โpermanently GCP-onlyโ team can find that assumption doesnโt survive contact with a genuine new business need a year or two later, and foundational bootstrapping infrastructure has a habit of quietly growing well past what anyone originally intended it to cover when it was first set up.
Terraform: Why It Won the Ecosystem
resource "google_compute_instance" "web_server" { name = "my-web-server" machine_type = "e2-medium" zone = "us-central1-a"
boot_disk { initialize_params { image = "debian-cloud/debian-12" } }
network_interface { network = "default" access_config {} }}The same resource, expressed in Terraformโs HCL, looks structurally similar to the Deployment Manager YAML โ the meaningful difference isnโt syntax, itโs ecosystem breadth. The same Terraform configuration language and workflow (plan, apply, state management) works identically whether youโre provisioning a GCP VM, an AWS S3 bucket, a Datadog monitor, or a GitHub repositoryโs branch protection rules, through the same provider plugin model. For any organization whose infrastructure genuinely spans more than one system โ which is nearly every organization past a certain size โ that consistency is worth more than any GCP-specific advantage Deployment Manager offers.
How a Deployment Actually Gets Applied and Tracked
Understanding the lifecycle mechanics is useful even if you end up choosing Terraform, since the underlying deployment model โ describe desired state, let the tool compute a diff, apply the diff โ is shared conceptually across every infrastructure-as-code tool.
The โtracked as one unitโ property is what makes deployments delete genuinely clean โ Deployment Manager knows exactly which resources belong to a given deployment and removes precisely those, rather than requiring you to manually enumerate everything that was created. This is the same fundamental guarantee Terraform state provides, just implemented as a Google-managed service rather than a state file you manage yourself (or store in a remote backend like Cloud Storage, which is the common Terraform pattern).
Real-World Use Case: Why a Team Migrated Away
A common pattern: a team starts with Deployment Manager because itโs GCP-native and requires no additional tooling, then adds a second cloud provider for disaster recovery, or starts managing DNS through Cloudflare instead of Cloud DNS, or needs to provision GitHub Actions secrets as part of their infrastructure pipeline. Each of these additions requires a separate tool alongside Deployment Manager, and the team ends up maintaining two (or more) infrastructure-as-code systems with different syntax, different state models, and different mental models โ a genuinely worse position than having started with Terraform and having one consistent tool handle everything from day one, even the GCP-only pieces.
Best Practices (If You Do Use Deployment Manager)
- Use it for genuinely GCP-only, relatively simple infrastructure, and evaluate Terraform seriously the moment a second system or provider enters the picture.
- Keep templates modular using Jinja2 or Python templating, rather than one monolithic YAML file, to get at least some of the reusability benefit Terraform modules provide more naturally.
- Version control every template and treat deployment as a reviewed, deliberate operation, exactly as you would with any infrastructure-as-code tool โ the discipline matters more than the specific tool.
- Document the decision to use Deployment Manager over Terraform explicitly, since itโs a deviation from the ecosystem default that a future team member will likely question and deserves a documented rationale.
- Revisit the decision periodically, not just once at initial adoption. An organizationโs infrastructure scope tends to grow, and what was a reasonable GCP-only assumption at adoption time is worth re-checking against current reality every year or two rather than assumed permanently settled.
Common Mistakes
Choosing Deployment Manager by default without evaluating Terraform, simply because itโs โthe GCP one.โ This is the single most common mistake โ defaulting to the native tool without considering whether the organizationโs actual infrastructure scope (likely to include more than just GCP eventually) is better served by the ecosystem standard.
Underestimating the migration cost of moving off Deployment Manager later. Infrastructure-as-code migrations are genuinely disruptive regardless of direction โ choosing deliberately upfront avoids a costly and risky migration once infrastructure has grown significantly on the โwrongโ tool for the organizationโs actual needs.
Mixing manually-created resources with Deployment Manager-tracked ones without clear boundaries. Resources modified outside Deployment Managerโs tracked deployment can cause confusing drift the next time an update is applied โ a discipline problem shared with every infrastructure-as-code tool, not unique to Deployment Manager, but worth calling out.
Frequently Asked Questions
Is Deployment Manager being deprecated? As of current guidance it remains a supported GCP service, but Googleโs own documentation and most practitioner guidance increasingly point toward Terraform (including Googleโs own contributions to and investment in the Terraform GCP provider) as the recommended path for new infrastructure-as-code work.
Can Deployment Manager and Terraform manage the same GCP project safely? Not cleanly, if theyโre managing overlapping resources โ both tools assume they own the full lifecycle of resources they track, and having two systems both believing they control the same resource leads to drift and conflicting changes. A clean split (different tools for genuinely different resource sets) can coexist, but overlapping ownership should be avoided.
Does Deployment Manager support resources beyond core GCP infrastructure, like IAM and organization policies? Yes, it supports most GCP resource types including IAM bindings and organization-level policies, which is part of why itโs a legitimate option for GCP-only foundational infrastructure specifically.
What does migrating from Deployment Manager to Terraform actually involve? Typically importing existing resources into Terraform state using terraform import, then writing equivalent HCL configuration for each resource, and validating that Terraformโs plan shows no unintended changes before considering the migration complete โ a genuinely involved process worth planning as a deliberate project, not a quick afternoon task.
Does Deployment Manager have an equivalent to Terraformโs plan command for previewing changes before applying? It has a preview capability (gcloud deployment-manager deployments update --preview) that shows what would change without applying it, conceptually similar to terraform plan, though generally considered less mature and less detailed in its diff output than Terraformโs equivalent.
Can I use Deployment Manager templates written by someone else, similar to Terraform modules? Templates can be shared and reused as files, but thereโs no equivalent to the Terraform Registryโs ecosystem of versioned, publicly shared modules โ reuse in Deployment Manager tends to be more manual, copying and adapting templates rather than pulling a versioned module dependency.
Summary
Deployment Manager is a legitimate, technically sound tool for genuinely GCP-only infrastructure โ the honest assessment isnโt that itโs bad, itโs that most organizationsโ actual infrastructure footprint outgrows โGCP-onlyโ faster than they initially expect, and Terraformโs broader ecosystem support means starting there avoids a disruptive migration later. If your infrastructure truly is and will remain GCP-only, Deployment Manager remains a reasonable, well-supported choice; for nearly everyone else, the ecosystem has already voted with its adoption patterns, and itโs worth taking that signal seriously before investing significant infrastructure-as-code effort into the native tool by default, rather than discovering the mismatch only after a second cloud provider or external tool has already entered the picture and made switching genuinely painful.