Terraform Advanced — Import Block (HCL)

less than 1 minute read

Terraform 1.5+ introduced the import block — declarative imports written in HCL.


Import Block Syntax

import {
  to = aws_s3_bucket.legacy
  id = "my-existing-bucket"
}

resource "aws_s3_bucket" "legacy" {
  bucket = "my-existing-bucket"
}
$ terraform plan
# Shows the import plan

$ terraform apply
# Imports the resource into state

Benefits Over CLI Import

Feature terraform import CLI import block
Declarative ❌ ✅
Multiple resources One at a time All at once
Plan preview ❌ ✅
Code reviewable ❌ ✅ (in Git)
Works with for_each ❌ ✅

Import with for_each

locals {
  existing_buckets = {
    logs    = "prod-app-logs"
    assets  = "prod-app-assets"
    backups = "prod-app-backups"
  }
}

import {
  for_each = local.existing_buckets
  to       = aws_s3_bucket.this[each.key]
  id       = each.value
}

resource "aws_s3_bucket" "this" {
  for_each = local.existing_buckets
  bucket   = each.value
}

What’s Next?

Auto-generate configuration from imports.

← terraform import Command generate-config-out →

Updated: