State migration
This topic describes how you can migrate and import your infrastructure state into Harness workspaces with the IaCM migration tool. Go to Remote backend initialization to find out how to configure your remote backend.
Prerequisites
Every workspace you create will be created inside a specified project, so you should:
- Ensure you have an existing Harness project.
- Configure any connectors within that project before passing their values to your migration variables file.
Migration phases
Harness IaCM migration is built in three phases to grant control over your configuration and imported state.
- Prepare your configured workspaces locally.
- Apply your new workspaces and import them to Harness.
- Import your infrastructure state into your new workspaces.
Sample Terraform file
The following sample Terraform file sets a remote AWS S3 backend and a single AWS resource.
In this case, your S3 bucket, key, and region can be set as workspace environment variables. Go to Add new environment variables to learn how to add these.
terraform {
backend "s3" {
bucket = "migration-demo"
key = "terraform.tfstate"
region = "us-east-1"
}
}
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "app1" {
instance_type = var.instance.type
ami = "ami-0bb7d64eeag57c9a9"
tags = {
"team" = "app-team"
"costcentre" = "engineering"
}
}
Ensure your AWS S3 bucket contains the above resources to prevent errors during the migration steps.
Prepare your local migration state
The migration tool utilizes a variables.tf
file to set default variables that can be shared across multiple new workspaces. You can define these variables and list your new workspaces in a list (step 2 below).
Create workspace configurations for each Terraform state file in your project with the following steps:
- Clone or fork the IaCM migration repository:
- Clone with:
git clone git@github.com:harness/iacm-migration.git
. - Fork via:
https://github.com/harness/iacm-migration/fork
.
- Clone with:
- Create and new
<filename>.tfvars
file in the local repository, see the Sample tfvars file below for an example. - In your terminal,
cd
to your repository directory and run:terraform apply -refresh=true -var-file=<filename>.tfvars
.- This will run the terraform plan command, list your proposed changes, and ask you to confirm if you want to perform these actions.
- Type yes and press enter.
Once the apply command completes, an out folder is generated within your repository with your new main.tf file listing your new Harness workspaces along with a new pipeline with a migration step that will pull the state from your remote backend and securely stores it in your Harness project.
Sample tfvars file
The following tfvars file example consists of configurations for two new workspaces with default project parameters and connectors.
account_id = "<harness-account-id>"
org = "<harness-org>"
project = "<harness-project>"
default_provisioner_type = "terraform"
default_provisioner_version = "1.5.7"
default_cost_estimation_enabled = true
default_provider_connector = "<cloud-provider-connector-name>"
default_repository_connector = "<git-repo-connector-name>"
workspaces = [
{
identifier = "workspace_demo_1"
repository = "<repo-directory>"
repository_path = "migration-demo-1"
repository_branch = "<repo-branch>"
terraform_variables = [
{
key = "instance_type"
value = "t2.micro"
value_type = "string"
}
],
},
{
identifier = "workspace_demo_2"
repository = "<repo-directory>"
repository_path = "migration-demo-2"
repository_branch = "<repo-branch>"
terraform_variables = [
{
key = "instance_type"
value = "t2.micro"
value_type = "string"
}
],
},
]
Create your new workspaces
Now that your workspaces and state are confirmed in your local environment:
- In your terminal, cd to the out folder and export your Harness API key.
export HARNESS_PLATFORM_API_KEY=<your-harness-api-key>
.
- Run
terraform init
, then runterraform apply
. - Confirm your new resources have been added to your Harness account.
Import state
- Navigate to, and run your new migration pipeline.
- Select the workspace you want to import your state to.
- Your migration pipeline will import your infrastructure state into Harness based on the parameters passed from your
<filename>.tfvars
file earlier.
Confirm your imported state
- Navigate to the workspace you ran the migration pipeline against.
- Select the State tab and confirm that your state has been imported.
- Repeat the import steps for each new workspace.