---
page_title: Import - Configuration Language
description: >-
  Import and manage existing resources with Terraform using configuration-driven import.
---

# Import

-> **Note:** Import blocks are only available in Terraform v1.5.0 and later.

~> **Experimental:** While we do not expect to make backwards-incompatible changes to syntax, the `-generate-config-out` flag and how Terraform processes imports during the plan stage and generates configuration may change in future releases.

Use the `import` block to import existing infrastructure resources into Terraform, bringing them under Terraform's management. Unlike the `terraform import` command, configuration-driven import using `import` blocks is predictable, works with CICD pipelines, and lets you preview an import operation before modifying state.

Once imported, Terraform tracks the resource in your state file. You can then manage the imported resource like any other, updating its attributes and destroying it as part of a standard resource lifecycle.

The `import` block records that Terraform imported the resource and did not create it. After importing, you can optionally remove import blocks from your configuration or leave them as a record of the resource's origin.

## Syntax

You can add an `import` block to any Terraform configuration file. A common pattern is to create an `imports.tf` file, or to place each `import` block beside the `resource` block it imports into.

```hcl
import {
  to = aws_instance.example
  id = "i-abcd1234"
}

resource "aws_instance" "example" {
  name = "hashi"
  # (other resource arguments...)
}
```

The above `import` block defines an import of the AWS instance with the ID "i-abcd1234" into the `aws_instance.example` resource in the root module.

The `import` block has the following arguments:
 - `to` - The instance address this resource will have in your state file.
 - `id` - A string with the [import ID](#import-id) of the resource.
 - `provider` (optional) - An optional custom resource provider, see [The Resource provider Meta-Argument](/terraform/language/meta-arguments/resource-provider) for details.

If you do not set the `provider` argument, Terraform attempts to import from the default provider. 

### Import ID

The import block requires you to provide the `id` argument with a literal string of your resource's import ID. Terraform needs this import ID to locate the resource you want to import.

The identifier you use for a resource's import ID is resource-specific. You can find the required ID in the [provider documentation](https://registry.terraform.io/browse/providers) for the resource you wish to import.

## Plan and apply an import

Terraform processes the `import` block during the plan stage. Once a plan is approved, Terraform imports the resource into its state during the subsequent apply stage.

To import a resource using `import` blocks, you must:
1. Define an `import` block for the resource(s).
1. Add a corresponding `resource` block to your configuration , or [generate configuration](/terraform/language/import/generating-configuration) for that resource.
1. Run `terraform plan` to review how Terraform will import the resource(s).
1. Apply the configuration to import the resources and update your Terraform state.

> **Hands-on:** Try the [State Import](/terraform/tutorials/state/state-import?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS) tutorial.

The `import` block is [_idempotent_](https://en.wikipedia.org/wiki/Idempotence), meaning that applying an import action and running another plan will not generate another import action as long as that resource remains in your state.

Terraform only needs to import a given resource once. Attempting to import a resource into the same address again is a harmless no-op. You can remove `import` blocks after completing the import or safely leave them in your configuration as a record of the resource's origin for future module maintainers. For more information on maintaining configurations over time, see [Refactoring](/terraform/language/modules/develop/refactoring).

## Resource configuration

Before importing, you must add configuration for every resource you want Terraform to import. Otherwise, Terraform throws an error during planning, insisting you add resource configuration before it can successfully import. You can create resource configuration manually or [generate it using Terraform](/terraform/language/import/generating-configuration). 

We recommend writing a `resource` block if you know what most of the [resource's arguments](/terraform/language/resources/syntax#resource-arguments) will be. For example, your configuration may already contain a similar resource whose configuration you can copy and modify.

We recommend [generating configuration](/terraform/language/import/generating-configuration) when importing multiple resources or a single complex resource that you do not already have the configuration for.

### Add a `resource` block

Add a `resource` block for the resource to import. The resource address must match the import block's `to` argument. 

```hcl
import {
  to = aws_instance.example
  id = "i-abcd1234"
}

resource "aws_instance" "example" {
  name = "renderer"
}
```

### Generate configuration

Terraform can generate HCL for resources that do not already exist in configuration. 
For more details, see [Generating Configuration](/terraform/language/import/generating-configuration).

## Examples

The following example demonstrates how to import into a module.

```hcl
import {
  to = module.instances.aws_instance.example
  id = "i-abcd1234"
}
```

The below example shows how to import a resource that includes [`count`](/terraform/language/meta-arguments/count).

```hcl
import {
  to = aws_instance.example[0]
  id = "i-abcd1234"
}
```


The below example shows how to import a resource that includes [`for_each`](/terraform/language/meta-arguments/for_each).
```hcl
import {
  to = aws_instance.example["foo"]
  id = "i-abcd1234"
}
```

Finally, the below example demonstrates how to import from a custom resource provider.

```hcl
provider "aws" {
  alias = "europe"
  region = "eu-west-1"
}

import {
  provider = aws.europe
  to = aws_instance.example["foo"]
  id = "i-abcd1234"
}
```
