Comparison

Drift detection for teams not ready for HCP Terraform

HCP Terraform gates drift detection behind Standard or Premium and scopes it to workspaces it manages. If your state lives elsewhere, or you are not moving to it, that is the gap Cloudkeel-DD fills.

HCP Terraform (formerly Terraform Cloud) does drift detection through health assessments. If you already run your Terraform there, on a paid tier, it is the obvious answer and this page is not for you.

This page is for the teams who are not there, and there are more of them than the tooling market usually admits.

The question it does not ask

Health assessments compare declared state against reality. So does terraform plan. Neither can see a resource that is in no state file, because the comparison starts from state, and something absent from state has nothing to compare against.

That category is where most of the uncomfortable findings live: a security group opened by hand during an incident, a “temporary” resource that outlived its test, a managed identity nobody remembers creating. Cloudkeel-DD enumerates live resources and subtracts what Terraform declares, which is a different operation with a different answer.

It also does not say who. A plan diff and a health assessment both report what changed; neither reports the actor. We read the native cloud audit logs (Azure Activity Log, AWS CloudTrail, GCP Audit Logs) on a best-effort basis within a lookback window. Attribution is not mentioned in HCP Terraform’s health-assessment documentation.

And two things gate what it does ask

Edition. Health assessments, which is where drift detection lives, require Standard or Premium. They are excluded from the Free edition.

Scope. The mechanism is workspace-scoped: it assesses what HCP Terraform manages. If your state is in an S3 bucket, an Azure storage account, a GCS bucket, or on someone’s disk, it is not in scope, because it is not a workspace.

That second one is the real dividing line. Moving state into HCP Terraform is a migration, not a setting, and plenty of teams have good reasons not to do it yet: an estate split across accounts, a self-hosted requirement, a procurement cycle that has not started.

Where that leaves you

Ordered by the gap first, then by the mechanics.

Cloudkeel-DDHCP Terraform
Unmanaged resource discoveryYes: AWS, Azure, GCPNot addressed; the mechanism is state-scoped
KubernetesLive cluster read: Helm, ArgoCD, Flux, sixteen kindsNo
Change attribution (who made it)Best-effort, all three clouds, within a lookback windowNot mentioned in the health-assessment docs
Where state can liveS3, Azure Blob, GCS, local, or a plan fileHCP Terraform workspaces
Drift detection available onany tier: it is the productStandard or Premium
Cloud write accessNone (read-only, enforced in code)Applies runs
DeploymentSelf-hosted Helm chartSaaS, or Terraform Enterprise

Where HCP Terraform is ahead

What we do not do

If you are already on HCP Terraform

Then use its health assessments for the workspaces it manages, and consider this only for the two things it does not cover: state that lives outside HCP Terraform, and resources that live in no state at all.

What about the clouds’ own tools?

Azure Policy, AWS Config and GCP Asset Inventory each answer part of this: inside their own cloud, in their own query language, without reference to your Terraform. If your estate is one cloud, evaluate them first; they are already paid for. If it spans clouds, the check becomes three different checks, and none of them can say “this resource is in no Terraform state”, because that comparison needs your state, which is the input they do not take.

Read more

Sources

Read 2026-07-31; re-read for change attribution 2026-08-15. If this has changed, tell us and we will correct it.