Encrypt Terraform state at rest with OpenTofu: the short answer
Terraform state files often hold database passwords, API tokens and other secrets in plain text, and a move from Terraform to OpenTofu is a natural point to fix that. OpenTofu encrypts state and plan files on the client, before they are written to local storage or a remote backend, using key providers that include PBKDF2, AWS KMS, GCP KMS, OpenBao and Azure key options. The feature was introduced in v1.7, so the minimum version you run matters more than the license of the CLI you choose. This page covers one module of the infrastructure as code stack: the encryption of state and plan files inside the OpenTofu CLI. It does not cover the run layer that applies changes for your teams, such as Terrakube or Atlantis, which is covered in separate pages. Encryption at the CLI level protects the files wherever they sit, but it does not decide who can start a run, approve a plan or read the output of one, so those controls must be planned separately.
Before you change anything, confirm three things in your own environment: which OpenTofu version your pipelines and developer machines will run, which backend holds your state today, and which key provider your security team already operates. Decide whether a PBKDF2 passphrase is acceptable for your risk model or whether a cloud KMS or OpenBao key should hold the key material, and record who owns rotation. Also check every tool that reads state directly, including scripts, dashboards and any consumer of the terraform_remote_state data source, because they will need the same key configuration or they will fail to read the file. The OpenTofu encryption documentation is the next read for the exact configuration blocks and rotation steps.
Which state protection needs map to which open-source option
This table maps common state protection needs to the open-source option that addresses each one, and marks where OpenTofu's client-side encryption stops and the storage backend or run platform takes over. Read each row as a question to answer before enabling encryption. The main takeaway is that encryption protects the state file itself, while access control, audit logging and backend hardening remain your responsibility.
| Protection need | Open-source option | Covers it? | What to confirm |
|---|---|---|---|
| Encryption of state and plan files at rest | OpenTofu state and plan encryption | Client-side encryption of the files before they reach storage | Confirm the supported key provider list and version requirements in the OpenTofu state encryption documentation |
| Passphrase-based encryption for local or small setups | OpenTofu PBKDF2 key provider | Encrypts with a passphrase-derived key, with no external key service | Confirm how the passphrase is supplied in your CI runners and who can read it |
| Cloud KMS envelope keys | OpenTofu AWS KMS or GCP KMS key providers | Keys stay in the cloud provider's key service, managed by your cloud account | Confirm IAM permissions for encrypt and decrypt calls and how key rotation is scheduled |
| Self-hosted key management | OpenBao with its encryption as a service and key/value secret storage | Keeps key material inside your own infrastructure when cloud KMS is not an option | Confirm the OpenBao version and integration path with the OpenTofu key provider you choose |
| Key rotation and recovery | Key provider rotation plus a tested restore procedure | Rotation changes the key used for new state, so old state must still be decryptable | Confirm the documented migration path from the old key provider to the new one before rotating |
| Access control on the state backend | Backend IAM, bucket policies or database roles | Not covered by OpenTofu encryption; limits who can read or overwrite the encrypted files | Confirm least-privilege policies for CI roles, operators and any read-only consumers |
| Audit logging of state access | Backend audit logs and run platform logs such as Terrakube or Atlantis | Not covered by OpenTofu encryption; depends on the storage and run platform | Confirm which events the backend records and where they are retained |
| Tools that read state directly | Readers such as terraform_remote_state consumers, scripts and drift tooling | Encrypted state needs the same key access as the reader; plain readers will fail | Confirm each consumer can obtain the key and supports the encrypted state format |
Choosing a key provider for OpenTofu state encryption
OpenTofu encrypts state and plan files on the client, so the key provider you pick decides who can read your state, how it is recovered and what fails when a key is lost. The cards below cover the main options and the operational trade-offs that matter during a migration from Terraform.
PBKDF2 passphrase for simple cases
PBKDF2 derives the encryption key from a passphrase you supply, with no external key service to run. It suits local state, small teams and test environments. The trade-off is that the passphrase itself becomes the secret: whoever holds it can decrypt every state file, and losing it means the encrypted state cannot be recovered. Check where the passphrase is stored, who can read it in CI, and how it is rotated. Illustrative: a passphrase kept only in one engineer's password manager becomes a single point of failure.
AWS KMS for AWS-hosted teams
AWS KMS keeps the key material in AWS and lets OpenTofu request encryption and decryption under IAM permissions. It fits teams that already run state backends and CI runners in AWS and want access to state tied to existing roles. Key holders are AWS and your key policy administrators, and deleting or disabling a key makes the state unreadable, so schedule key deletion carefully. Confirm the IAM policies CI jobs need, and confirm that key policies allow break-glass access for recovery.
GCP KMS for Google Cloud teams
GCP KMS is the matching option for teams whose state and pipelines run on Google Cloud. Access is governed by IAM roles on the key, so the people and service accounts allowed to decrypt state are visible in one place. The operational risk is the same as with AWS: a disabled or destroyed key version blocks reads of state that depends on it. Confirm the key location and version lifecycle with your platform team before migrating, since moving data between regions or projects needs its own plan.
Azure keys where Azure hosts the platform
Azure keys suit organizations that host Terraform runners, state storage and identities in Azure and need key access controlled by Azure role assignments. Check the current OpenTofu documentation for the exact Azure key provider configuration and supported options before you commit, since the documented key providers should be confirmed for your OpenTofu version. Ask who administers the vault, how soft-delete and purge protection are set, and how the key is restored if an administrator leaves.
OpenBao for keys in your own infrastructure
OpenBao is an open source secrets manager and fork of Vault that you run in your own data center or cloud account. It fits organizations that cannot send key operations to a public cloud service and want the key path under their own control. OpenBao is licensed under MPL-2.0 and is a Sandbox project of the Open Source Security Foundation under Linux Foundation stewardship. The trade-off is that your team owns high availability, unseal procedures, storage backups and upgrades, so an OpenBao outage can block state access.
Backup and recovery for every provider
Whichever provider you choose, the encrypted state is useless without the key, so the key recovery plan is part of the design. Record which provider and key version protects each state file, store recovery material separately from the state backend, and test a restore into a non-production workspace. Ask your provider owner how keys are replicated or exported, and what the documented recovery path is if a key or passphrase is lost.
How to enable state encryption during a Terraform to OpenTofu migration
The cleanest time to turn on state encryption is inside the migration itself, because the migration overview already walks through the four steps that touch state: back up state and code, install OpenTofu, initialize and verify the configuration, and test with a small change. Encryption belongs in the configuration that OpenTofu reads during initialization, so it is set up as part of step three, not bolted on afterward. Treat the encryption block as a change to the configuration, reviewed like any other, and keep it out of the same commit as unrelated provider or module upgrades so that a failed verification points to one cause.
The order of operations matters. Existing state in your backend was written unencrypted, and OpenTofu will read that unencrypted state without trouble, so the safe sequence is to first confirm that OpenTofu reads and plans against the current state, then let a subsequent state write re-save it in encrypted form. Confirm with your own environment's test run that the state file on the backend has changed format after the first write, and that a no-change plan still succeeds afterward. Plan the key provider before this step: whether you use PBKDF2 with a passphrase, AWS KMS, GCP KMS, OpenBao or Azure keys, the key must be available to every operator and every CI runner that touches the workspace, or the team will be locked out of its own state.
The unencrypted backup taken in step one is now the most sensitive artifact in the migration, because it holds the same secrets the encryption is meant to protect. Keep it in a restricted location with access limited to the few people running the migration, and log who reads it. Do not delete it until the encrypted state has been verified through several normal plans and applies, and until you have confirmed that the key can decrypt it. Then destroy it through your normal secure deletion process and record that step in the change ticket. Ask your platform team to confirm how backend snapshots and versioning handle the old unencrypted objects, since copies may persist beyond the file you intended to remove.
How key rotation works for encrypted state
With PBKDF2, OpenTofu derives the encryption key from a passphrase you supply, so rotation means changing that passphrase. Older state can only be read with the old passphrase, so the previous method must stay configured as a fallback until every workspace has been planned and applied under the new one.
- Operational change: the passphrase lives wherever your pipelines read it, such as a CI secret store or a vault. Changing it affects every runner that plans or applies.
- Rotation window: set the new passphrase as the active method and the old one as the fallback, then run a plan and apply in each workspace so state is written with the new key.
- Who runs it: the security team generates and stores the new passphrase, and the platform team updates the configuration and pipeline variables.
- Passphrase quality: the passphrase is only as strong as its storage and handling, so restrict who can read it and log its access.
Before a production rotation, confirm the exact fallback syntax and the PBKDF2 settings in the OpenTofu state encryption documentation for your version.
With AWS KMS, GCP KMS or Azure keys, OpenTofu asks the cloud key service to protect the data key, so key material stays inside the provider. Rotation happens in two layers: the cloud service may rotate key versions on its own schedule, and you may change which key the configuration points to. Each layer has its own window for old state to remain readable.
- Automatic versus manual rotation: many key services can rotate versions automatically. Confirm that earlier versions stay usable for decryption, because OpenTofu still needs them to read older state.
- Changing the key reference: moving to a new key ARN, key ID or resource path requires the old key as a fallback until state has been re-encrypted.
- Permissions: the runner needs encrypt and decrypt permissions on both keys during the window. The cloud security team usually owns that grant.
- Audit trail: key service logs record each use of the key, which helps with evidence collection for compliance readiness.
- Cost drivers: key storage and request charges appear on the cloud bill, so ask the provider for current pricing for your region.
Before a production rotation, confirm how your provider handles disabled and scheduled-for-deletion key versions, and check the OpenTofu state encryption documentation for the fallback behavior.
OpenBao can act as the key provider through its encryption as a service feature. OpenTofu sends encryption requests to OpenBao, so the key material stays inside OpenBao and the runner only holds the credentials to ask for encryption and decryption. Rotation uses OpenBao's key versioning, and the operator decides when new writes use a newer version.
- Key versions: after a new key version is created, older ciphertext should remain decryptable. Confirm the rotation and minimum decryption version settings in the OpenBao documentation.
- Token and policy scope: the OpenTofu runner should authenticate with a method suited to servers, such as AppRole, and hold a policy limited to encrypt and decrypt on the named key.
- Availability: if OpenBao cannot be reached, plans and applies that read state will fail, so the cluster belongs on the critical path for infrastructure changes. Its high availability design uses one active node and standbys.
- Ownership: the security team owns OpenBao policies and key rotation, and the platform team owns the OpenTofu configuration that points to the key.
Before a production rotation, confirm the key path, policy names and fallback behavior against the OpenBao and OpenTofu documentation for the versions you run.
Run the full rotation in a non-production workspace before touching production state. The goal is to prove three things: the fallback reads state encrypted with the old method, the new method writes state correctly, and a no-change plan still succeeds afterward. The test should use the same provider, backend and runner image as production so the results carry over.
- Use a copy of real configuration: clone a workspace with a sample state that uses the same backend and encryption block as production, but no production data.
- Check reads first: confirm that a plan reads the state written under the old method before any new write happens.
- Verify after apply: a no-change plan immediately after re-encryption should show no drift and no unexpected changes.
- Test the failure path: temporarily remove access to the old key in the test workspace to see the error message and confirm the recovery steps your team would follow.
- Keep the record: save the test output and the rollback steps as change evidence for the security and audit teams.
Before running the production rotation, confirm the steps in the OpenTofu state encryption documentation and agree a rollback plan with the owner of the state.
What changes for tools that read state
Can terraform_remote_state consumers read state after OpenTofu encryption is enabled?
Not automatically. A consumer that reads another configuration's outputs through terraform_remote_state only sees decrypted data if it runs an OpenTofu version that can decrypt that state and has the matching key configuration. The OpenTofu migration overview warns that configurations sharing data this way typically need additional care during migration and links a separate guide for that case, so follow that guide before you change encryption on shared state. Confirm each consumer's behavior in your own environment by running a read against a test copy of the state before you switch the producing configuration.
Do state-reading scripts and CI jobs need the encryption key?
Yes, if they read state through OpenTofu or read the encrypted file directly. Any job that needs decrypted values must have access to the same key provider, such as an AWS KMS key, a GCP KMS key, an OpenBao transit key or a PBKDF2 passphrase, with permission limited to what the job needs. Scripts that only parse plan output or call tofu output in a runner already authorized for the key will keep working, while jobs that parse raw state JSON without the key will fail. Inventory every job that touches state, grant key access per job, and test each one in a non-production workspace.
Does the HCP Terraform state versions API still work once state is encrypted?
The state versions API is a source of state only during the migration, and its behavior depends on what the workspace stores. HCP Terraform exposes each workspace's current state through its state versions API, including a JSON state download URL for states created by Terraform 1.3 or later, and that is how state leaves the platform. Once you encrypt state in OpenTofu, the file you write locally or to your backend is encrypted, so you must decrypt it with the same key configuration before you can read it. Export the state while it is still plaintext, verify the export, then enable encryption. Confirm with HashiCorp's API documentation which download formats are available for your state version before you rely on them.
How are plan files handled in pull request workflows with Atlantis or Terrakube?
Plan files are encrypted too, so the runner that writes and later applies a saved plan must have access to the same key provider. Atlantis runs plans from pull requests and applies the saved plan after approval, so the Atlantis server needs the key configuration for the plan file it creates. Terrakube runs plans and applies inside its own executors, which also need the key. Store plan artifacts only where the workflow requires them, set retention, and confirm with each tool's documentation and a test pull request that plan and apply succeed with encryption enabled and that a plan written by one runner can be read by the next step.
Can drift detection tools read encrypted state?
Only if the tool supports OpenTofu state encryption and holds the key. Drift detection that runs tofu plan in refresh-only or read-only mode uses the same decryption path as the CLI, so it works when the runner has the key. Tools that read the state file directly, without OpenTofu, will see ciphertext and report errors or false results. Ask each drift or compliance vendor whether it reads OpenTofu encrypted state, which key providers it supports and whether it writes state back. Run a drift check against a copy of an encrypted state before you rely on its output.
How do auditing and compliance tools read state without exposing secrets?
Auditing tools should read decrypted state only inside a controlled runner, and the audit output should be scoped to what the auditor needs to see. Encryption at rest protects state in storage, but anyone or anything with the key can still decrypt it, so the key policy is the control that matters. Document which principals can use each key, log key usage in your cloud or secrets platform, and confirm that auditors' tooling reads state under the same access rules as your pipelines. Preparing this evidence is part of compliance readiness work, but an independent auditor or certification body decides whether the controls meet a given requirement.
Which state consumers should we test first before enabling encryption?
Test the consumers that read state across boundaries first, because they fail in ways that are hardest to see. Start with terraform_remote_state dependencies, then CI jobs that read outputs, then pull request workflows that create and apply plans, then drift and audit tools. For each one, record the OpenTofu version, the key provider, the principal used and the expected output, and run the same read before and after the change. Keep a rollback path that uses the exported plaintext backup, and confirm the order of steps with your platform team and the migration guides from OpenTofu.
Who should own key access for state consumers after the migration?
The platform or security team should own the key policy, and each consuming team should request access for a named job or service identity. Ownership should be written down so that a rotation or a new consumer does not depend on one engineer's knowledge. Key rotation requires updating every consumer that holds a key reference, so a register of consumers is part of the operating model. Ask any implementation partner to state in the written scope who maintains the register, who approves access changes and how rotation is tested before it reaches production.
Migration steps for enabling encryption on existing state
This sequence moves an existing Terraform state into an encrypted form with OpenTofu while keeping the migration checked at each stage. The result is encrypted state and plan files, a verified no-change plan, and a documented path back to plaintext if a rollback is needed.
Confirm provider and version support
The platform engineering lead checks which OpenTofu release is in use and confirms that every provider and module in the configuration works with it. OpenTofu's state encryption is documented as a feature introduced in v1.7, so older builds cannot be used for this work. Pin the exact OpenTofu version in your repository and CI image before any state is touched. The step is complete when a
tofu initandtofu validaterun cleanly against the pinned version in a test checkout. Confirm provider compatibility with your vendor or the provider's documentation, because OpenTofu's stated aim is feature parity with Terraform, not a guarantee for future releases.Back up the current state
The engineer responsible for the workspace exports and stores a copy of the current state before any change. For HCP Terraform or a remote backend, this means downloading the state through the state versions API or the backend's own export tooling and storing it in an access-controlled location separate from the live backend. Record the state serial and checksum next to the backup. This copy is the plaintext recovery path, so keep it encrypted by your own storage controls and make sure it is covered by your retention policy. The step is complete when the backup can be opened and its serial matches the live state.
Enable encryption in a non-production workspace
The infrastructure team adds the state and plan encryption block to the configuration of a non-production workspace, choosing a key provider such as PBKDF2 for a passphrase, or AWS KMS, GCP KMS, OpenBao or Azure keys where your key governance requires them. Keys and passphrases are supplied through environment variables or a secrets manager, never committed to the repository. Run the migration path that rewrites state into encrypted form and confirm that the remote backend now stores ciphertext. The step is complete when the non-production state can be read only with the configured key and a plain text search of the stored object finds no resource attributes.
Verify with a no-change plan
The team runs a plan against the encrypted non-production workspace and checks that it reports no changes to infrastructure. This confirms that the encryption change did not alter resource addresses, outputs or dependencies. Compare the plan output with a plan taken from the unencrypted state before the change, and run an apply only if the difference is limited to expected state metadata. The OpenTofu migration guidance describes this kind of small, reversible test as the way to confirm the move is safe. The step is complete when the plan is empty and the team has signed off the comparison in the change record.
Update CI and key access
The platform team updates pipeline definitions so every job that reads or writes state has the OpenTofu version, the key provider configuration and the credentials it needs. Only the runner identities and named operators who need to decrypt state should receive key access, and those grants are recorded in the access review. Check tools that read state directly, such as scripts, data sources that read another configuration's state, and monitoring jobs, because they will fail without the key. Where configurations depend on terraform_remote_state, follow OpenTofu's guidance on those dependencies before changing the consuming workspaces. The step is complete when a CI run on a feature branch plans successfully with the new configuration and every consumer has been listed and tested.
Migrate production state in a change window
The change owner repeats the verified steps on each production workspace, starting with the lowest-risk one and keeping the backup for every workspace until the next stage is approved. Freeze concurrent runs during the encryption step so no other apply writes plaintext state in the middle of the change. After each workspace, run a no-change plan and check that the backend holds only encrypted content. The step is complete when every production workspace has a verified encrypted state, a no-change plan result, and a recorded rollback owner.
Rotate keys on a schedule
The security team sets a key rotation schedule for each key provider and records who approves a rotation and who executes it. Rotation should be rehearsed in the non-production workspace first, with a new key or passphrase added, state re-encrypted, and a no-change plan run to confirm access. Confirm with your key provider how versioned keys, deletion protection and audit logs behave, because those details differ by provider and are not covered in this sequence. The step is complete when the first scheduled rotation has been rehearsed, the old key is retired only after a successful plan, and the rotation is recorded as evidence.
Decommission unencrypted backups under retention rules
The compliance lead reviews the plaintext backups created in the backup step and destroys them only when the retention policy and legal hold requirements allow it. Keep at least one plaintext recovery path until the encrypted state has run through the planned operating period, because reverting to unencrypted state requires that copy to remain available. Log the destruction with the workspace name, state serial and approver. The step is complete when the retention decision is documented, the approved copies are deleted, and any retained copy is stored under the same access controls as the live state.
Questions teams ask before encrypting Terraform state
What does it cost to encrypt Terraform state with OpenTofu?
The cost is made up of separate components, and only some of them are paid to a vendor. The OpenTofu CLI is free to use under the Mozilla Public License 2.0, so the encryption feature itself carries no license fee. Cloud KMS usage is billed by your cloud provider and depends on the number of keys and requests your workspaces generate. If you use OpenBao as the key provider, you pay for the hosting and for the people who operate it, either your own staff or a partner. Implementation effort rises with the number of workspaces, backends and state consumers. Ask any partner to price each component separately in a written quote, and to state which costs are one-time and which recur each month.
How long does enabling state encryption take?
The duration depends on scope, mainly the number of workspaces and the number of tools and pipelines that read state. A single backend with one team is a much smaller task than a multi-account estate where state is shared across several groups. Work usually includes choosing the key provider, configuring the encryption block, migrating existing state, testing a plan against encrypted state, and updating every consumer. Ask for a written timeline with milestones tied to the scope you agree, and ask which tasks depend on other teams being available.
What do we need from our team before the work starts?
You need three things ready before the work starts. First, access to every state backend, including the storage buckets, databases or remote backends where state is kept, with rights to read and rewrite state. Second, named key administrators who can create, rotate and revoke keys in KMS or OpenBao and who approve changes to key policies. Third, a current list of state readers, meaning every pipeline, script, dashboard and tool that reads state, including any workspace that uses the terraform_remote_state data source. Missing readers are the most common cause of delays, because they fail once state is encrypted unless they are updated first.
Can our own engineers enable state encryption without a partner?
Yes, for simple setups. A small number of workspaces with one key provider, one backend and a single team can usually be handled in-house by engineers who already run OpenTofu. Multi-account estates, shared backends, several key providers and many state consumers are a better fit for a fixed-scope engagement. In that case, the partner should document the design, the key rotation procedure and the test plan in writing before any state is changed. Whichever route you take, test the change on a non-production workspace first and keep a tested rollback path.
Does OpenTofu state encryption replace access control on the backend?
No. Encryption protects state at rest, but it does not replace access control on the backend. Anyone who can read the storage location and who holds the key can still decrypt state, so the key policy is as important as the encryption itself. Keep backend permissions narrow, separate the people who manage keys from the people who manage state, and log key use in your cloud or OpenBao audit trail. Use encryption together with least privilege, not as a substitute for it.
What breaks when state becomes encrypted, and what should we check?
Tools that read state directly will fail until they support the encrypted format or receive the key. This includes custom scripts, reporting tools and any consumer that parses the raw state file. Check each consumer against the OpenTofu encryption documentation before you change the backend. Also confirm that the key provider is reachable from every runner, that CI jobs have permission to call the KMS or OpenBao endpoint, and that a plan against migrated state shows no unexpected changes.
How do we rotate encryption keys without losing access to state?
Key rotation depends on the key provider you choose. In OpenTofu, you add the new key as a fallback before you remove the old one, so state can be decrypted during the transition. Confirm the exact steps for your provider in the OpenTofu encryption documentation and test them on a copy of state. Record who approved each rotation, schedule rotations under a written policy, and keep the previous key available until every consumer has moved to the new one.
What should a written quote for state encryption include?
A useful quote lists the scope in concrete terms: the number of workspaces, backends, key providers and state consumers covered. It should separate one-time work, such as design, migration and testing, from recurring work, such as key rotation, upgrades and monitoring. Ask for the deliverables in writing, including the encryption configuration, the rotation runbook, the rollback plan and the list of consumers updated. Ask which cloud or OpenBao costs are excluded and who pays for them, and confirm what happens if scope grows during the work.
What encryption does not cover and what to confirm with your team
State encryption protects state at the storage layer, and nothing more. OpenTofu encrypts state and plan files before they reach local storage or a remote backend, but the encrypted file is only as safe as the access around it. Anyone who can read the key provider's credentials, the backend bucket or the CI variables that unlock decryption can still recover the state. Encryption does not replace least privilege on the backend, the key provider policy, or the runner identities that run tofu plan and tofu apply. It also does not stop secrets from being written into state in the first place, so review resource arguments and data sources that return credentials, and move secret values into a secrets manager where the provider supports it. Logs from CI jobs and backend access logs remain a separate control to design and retain.
Before rollout, confirm the exact key providers, required OpenTofu version and configuration syntax against the state and plan encryption documentation and the release notes for the version you will pin, since the feature has changed across releases. Check that every tool reading state, including drift detection scripts, dashboards and any remote state consumers, supports the encrypted format before you switch the backend over. OpenTofu's compatibility with future Terraform releases is not guaranteed, so record which version of each tool you tested. Ask your key management team how keys are rotated and who can disable a key, because losing access to the key means losing access to the state.
Your compliance obligations are yours to define and verify. DeployOpen can prepare configurations, evidence of key policies and access reviews for an assessment, but it does not issue audit reports or certifications. Ask your assessor early whether encryption at rest with customer-managed keys satisfies the control objectives you are tested against, and whether they expect evidence of key rotation, access logs and backup handling for the state store. Settle those questions before the migration window, not after it.
How DeployOpen scopes state encryption and migration work
DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside your own cloud accounts, data centers or air-gapped networks. For state encryption, we start from your existing state files and key management setup, then agree in writing which backends, key providers and tools will be covered before any change is made to production state.
How we scope
- Inventory which workspaces hold secrets in state and which backends store them today
- Confirm the key provider for each environment, such as AWS KMS, GCP KMS, OpenBao or PBKDF2 for local use
- Record which tools, pipelines and data sources read state and need checks after encryption is enabled
How we build
- Configure the encryption block for state and plan files, with key provider settings kept out of version control
- Test migration of a non-production workspace first, then verify a no-change plan before touching production
- Set up key rotation steps and confirm that older state can still be decrypted during the transition window
How we hand over
- Deliver runbooks for enabling encryption, rotating keys and recovering from a lost or misconfigured key
- Document which terraform_remote_state consumers were checked and which required changes
- Provide test evidence and configuration records that your internal or external auditors can review
How we support
- Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts
- Ongoing support, upgrades when new OpenTofu releases ship, and continuous testing are available as a retainer
- DeployOpen prepares systems and evidence for compliance assessments but does not issue audit reports or certifications

