Skip to main content

Importing Existing Resources

1. Importing Resources

Resource Type Import ID Format Description
aws_instance aws_instance.example.id Import an AWS EC2 instance using its ID
aws_s3_bucket bucket-name Import an S3 bucket by name
google_compute_instance project/zone/name Import a GCP Compute instance using project, zone, and name

Example: Importing an AWS EC2 Instance

terraform import aws_instance.example i-1234567890abcdef0
Note: After importing, Terraform will show the resource in its state file and manage it as part of the configuration.
Warning: Importing resources does not automatically generate the HCL code for them. You must manually add the resource block to your configuration.

2. Writing Import Blocks

Property Description Example
import Defines an import block to bring existing infrastructure into Terraform state
import {
  to = aws_instance.example
  id = "i-1234567890abcdef0"
}

Example: Basic Import Block

import {
  to = aws_instance.example
  id = "i-1234567890abcdef0"
}
Note: The to attribute must reference a resource block defined in your configuration. The id is the unique identifier for the resource in the cloud provider.
Warning: Terraform will not manage the lifecycle of the imported resource unless it is defined in your configuration. You must define the resource block separately.

3. Using Import Address

Field Description Example
import_address Specifies the address of the resource to be imported. This is typically the Terraform resource identifier in the format resource_type.resource_name. aws_instance.example

Example: Importing an AWS Instance

terraform import aws_instance.example i-1234567890abcdef0
Note: The import_address must match the resource block defined in your configuration.
Warning: Importing resources does not automatically update your state file with all attributes. You must manually verify and adjust the state as needed.

4. Verifying Imported State

Example: Check imported resource state

terraform state show aws_instance.example
Property Description Notes
id Unique identifier for the resource Generated by Terraform after import
ami Amazon Machine Image ID Must match the existing instance's AMI
instance_type Instance type of the EC2 resource Must match existing instance configuration
tags Tags applied to the resource Should reflect existing instance tags
Note: After importing, run terraform plan to verify that no changes are expected.
Warning: If terraform plan shows changes, the imported resource may not match the configuration.

Verification Steps

  • Run terraform state show to inspect resource attributes
  • Execute terraform plan to confirm no drift from configuration
  • Review terraform.tfstate file for correct resource state

5. Importing Multiple Resources

Example: Importing Multiple Resources with a Loop

#!/bin/bash
# Import multiple S3 buckets into Terraform state
for bucket in bucket1 bucket2 bucket3; do
  terraform import aws_s3_bucket.example_$bucket $bucket
done
Resource Type Import ID Format Description
aws_s3_bucket <bucket_name> Import an S3 bucket by name
aws_instance <instance_id> Import an EC2 instance by ID
aws_elasticache_cluster <cluster_id> Import an ElastiCache cluster by ID
Note: When importing multiple resources, ensure that each resource's ID is unique and correctly formatted to avoid conflicts in the Terraform state.
Warning: Importing multiple resources in a loop can lead to state drift if not managed carefully. Always verify the imported resources match your desired configuration.

6. Generating Configuration

Example: Generate configuration for an existing AWS S3 bucket

terraform import aws_s3_bucket.my_bucket <bucket-name>
Command Description Notes
terraform import Imports an existing resource into the Terraform state Must be run after defining the resource in configuration
Note: After importing, Terraform will generate the configuration for the imported resource in your .tf files.
Warning: Importing resources does not automatically generate the full configuration. You must manually review and update the generated code to ensure it matches your desired state.

Steps to Generate Configuration

  • Define the resource in your Terraform configuration file (e.g., main.tf) with the correct type and name.
  • Run terraform import <resource-address> <id> to import the resource into state.
  • Run terraform plan to see the diff between current state and configuration.
  • Run terraform show to view the generated configuration for the imported resource.

7. Handling Import Errors

Common Import Error Scenarios and Solutions

  1. Resource Not Found: The resource does not exist in the cloud provider.
  2. Permission Denied: Insufficient permissions to read the resource.
  3. State Mismatch: Terraform state does not match the actual resource.
  4. Schema Mismatch: Resource attributes do not match the Terraform schema.
Error Type Description Solution
Resource Not Found Import target resource does not exist in the cloud provider. Verify resource exists and is accessible. Use CLI or console to confirm.
Permission Denied Terraform cannot read the resource due to insufficient IAM permissions. Ensure Terraform user has required read permissions for the resource.
State Mismatch Resource in state does not match actual resource configuration. Use terraform refresh or manually update state to match.
Schema Mismatch Resource attributes do not align with Terraform provider schema. Update resource block to match current schema or use terraform import with correct attributes.

Example: Resolving State Mismatch

terraform refresh
terraform plan
terraform apply
Note: Always backup your Terraform state before resolving import errors.
Warning: Incorrectly modifying state can lead to drift or resource loss.

8. Using For-Each with Import

Property Description Example
for_each Creates multiple instances of a resource based on a map or set for_each = { "dev" = "us-west-1", "prod" = "us-east-1" }

Example: Importing Multiple Resources with For-Each

resource "aws_instance" "web" {
  for_each = {
    dev = "us-west-1"
    prod = "us-east-1"
  }

  ami           = "ami-12345678"
  instance_type = "t2.micro"

  tags = {
    Environment = each.key
  }
}

# Import command for each instance
# terraform import aws_instance.web.dev <instance-id-dev>
# terraform import aws_instance.web.prod <instance-id-prod>
Note: When using for_each, ensure that the resource identifiers match between your configuration and the actual imported resources.

9. Importing into Modules

Property Description Example
module.source Path to the module source ./modules/web-server
module.name Name of the module block web_server

Example: Importing into a Module

terraform import module.web_server.aws_instance.example i-1234567890abcdef0
Note: Ensure the module is defined in your configuration before importing.
Warning: Importing into modules can lead to state drift if not managed carefully.

10. Documenting Imported Resources

Example: Importing and Documenting a Google Compute Instance

resource "google_compute_instance" "my_instance" {
  name         = "my-instance"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  network_interface {
    network = "default"
  }
}
Field Description Required Notes
name Name of the instance Yes
machine_type Machine type to use for the instance Yes
zone Zone where the instance will be created Yes
boot_disk Configuration for the boot disk Yes
network_interface Network interface configuration Yes
Note: When importing, ensure that the resource ID matches the actual resource in the cloud provider.
Warning: Importing resources can lead to drift if not properly managed in version control.

Best Practices for Importing Resources

  • Always document the import process in your team's documentation.
  • Use descriptive names for imported resources to avoid confusion.
  • Ensure that the Terraform state is updated after importing to prevent drift.

Was this article helpful?