June 9, 2021

How To: Migrate Terraform State Into Scalr

Ryan Fee

Terraform open source is used across the industry for IaC deployments and as users become more familiar with it they love the flexibility but run into issues around scalability.

A DevOps administrator’s primary concern is generally around central state storage when scaling Terraform. Likely the administrator already has several state files stored locally, in S3, or potentially a remote operations backend, but hitting the point where issues around overall management, operations, or cost force the issue of proper tooling.

Scalr solves problems relating to the collaborative use of Terraform including state management, auditing, policy enforcement, and GitOps automation. However, the idea of migrating state into Scalr may seem like a daunting task. The migration of state into Scalr is a very simple process as outlined below.

How do I migrate state into Scalr?

Migrating state to Scalr is simply done by configuring your template to use Scalr as a remote backend. Regardless of where you state is now (local, S3 bucket, etc) the Terraform CLI (terraform init) will detect the change of configuration and automatically migrate the state to Scalr.

  • If you are already using a remote backend you simply need to update the terraform{} block to be similar to the example below
  • If you are migrating local state you need to add the complete terraform{} block similar to this example.
terraform {
  backend "remote" {
    hostname = "my.scalr.com"
    organization = "org-123456"
    workspaces {
      name = "migrate_demo"

Run terraform init to migrate the state and answer “yes” to the prompt. This will create the workspace and upload the state to Scalr.

terraform init
Initializing the backend...
Backend configuration changed!
Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.
Terraform detected that the backend type changed from "s3" to "remote".
Do you want to copy existing state to the new backend?
Pre-existing state was found while migrating the previous "s3" backend to the newly configured "remote" backend. No existing state was found in the newly configured "remote" backend. Do you want to copy this state to the new "remote" backend? Enter "yes" to copy and "no" to start with an empty state.
Enter a value: yes
Successfully configured the backend "remote"! Terraform will automatically use this backend unless the backend configuration changes.
Initializing provider plugins...
The following providers do not have any version constraints in configuration, so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking changes, it is recommended to add version = "..." constraints to the corresponding provider blocks in configuration, with the constraint strings suggested below.
* provider.aws: version = "~> 2.70"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work.
If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.

In the Scalr UI you can see the workspace and the state outputs.

Want to give this a try for yourself? Sign up today! Check out the docs to learn more.

Note: While this blog references Terraform, everything mentioned in here also applies to OpenTofu. New to OpenTofu? It is a fork of Terraform 1.5.7 as a result of the license change from MPL to BUSL by HashiCorp. OpenTofu is an open-source alternative to Terraform that is governed by the Linux Foundation. All features available in Terraform 1.5.7 or earlier are also available in OpenTofu. Find out the history of OpenTofu here.

Start using the Terraform platform of the future.

A screenshot of the modules page in the Scalr Platform