Skip to main content

Generate Terraform import blocks directly from a binary .plan file

Project description

generate-imports-from-plan

Generates Terraform import {} blocks directly from a binary .plan file — no terraform CLI, no provider plugins, no terraform init required.

Why?

terraform show -json does not expose all planned attribute values — computed fields like resource names and resource group names are missing from the JSON output. This tool reads the raw msgpack-encoded attributes directly from the binary plan, giving access to all values needed to construct Azure resource IDs.

For resources whose IDs are assigned at creation time (Entra ID resources, Azure role assignments), the tool calls the Azure CLI to look up the real ID interactively.

Installation

uvx generate-imports-from-plan terraform.plan

Or install permanently:

uv tool install generate-imports-from-plan
generate-imports-from-plan terraform.plan

Requirements

  • Python 3.11+
  • uv (for uvx)
  • Azure CLI (az) — required for live resolution of Entra ID resources and Azure role assignments

Workflow

# 1. Generate plan
terraform plan -out terraform.plan

# 2. Generate import blocks interactively
generate-imports-from-plan terraform.plan > imports.tf

# 3. Fill in any remaining placeholder IDs, then re-plan and apply
terraform plan -out terraform.plan
terraform apply terraform.plan

Interactive flow

The tool prompts per resource based on what it can derive:

  • Complete formula-based ID — emitted immediately, no prompt.
  • Entra ID resource or Azure role assignment — shows the az command it will run and asks confirmation.
  • Unresolvable ID — shows which attribute is computed and its HCL reference chain; asks whether to skip.
  • Unsupported import (e.g. azuread_application_password) — emits a comment block.

Use --yes to accept all without prompting, --no for a dry run.

Output

import {
  to = module.core.azurerm_resource_group.this
  id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-myapp-dev-we-01"
}

import {
  to = module.core.azuread_application.default["my-app"]
  id = "/applications/00000000-0000-0000-0000-000000000000"
}

# import not supported for azuread_application_password:
# module.core.azuread_application_password.default["my-app"]

Flags

Flag Description
--yes Accept all without prompting
--no Reject all without prompting (dry-run)
--no-resolve Skip Azure CLI lookups; use formula-based IDs only
--skip-imported Skip resources that already have an import {} block in the config
--list Print address\tid pairs instead of HCL blocks
--list --powershell Output a PowerShell array literal of resource addresses
--target ADDR [ADDR ...] Only process the specified resource addresses
--debug Dump all decoded attributes per resource

Adding a resource type

See docs/resolvers.md for how to add a formula or a live resolver.

Quick formula example — extend _ID_FORMULAS in generate_imports/ids.py:

"azurerm_my_resource":
    lambda a, s: _arm(s, _str(a, "resource_group_name"),
                      "Microsoft.MyNamespace/myResources", _str(a, "name")),

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

generate_imports_from_plan-0.2.1.tar.gz (34.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

generate_imports_from_plan-0.2.1-py3-none-any.whl (13.3 kB view details)

Uploaded Python 3

File details

Details for the file generate_imports_from_plan-0.2.1.tar.gz.

File metadata

  • Download URL: generate_imports_from_plan-0.2.1.tar.gz
  • Upload date:
  • Size: 34.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for generate_imports_from_plan-0.2.1.tar.gz
Algorithm Hash digest
SHA256 e0465f6f2f34e3d53c89def85a274769a013e33971f26670d2838267f3b08006
MD5 b4a017205fd1968430e0dcfbb0fa8c7b
BLAKE2b-256 eb42c69c26a896987a963cacc61079efb5d46a6b4737fc66f0152d4ed7e5be38

See more details on using hashes here.

File details

Details for the file generate_imports_from_plan-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: generate_imports_from_plan-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 13.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for generate_imports_from_plan-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5b98a68a2db2d9340e6d1bce4867e401538f72fe89dd7cfad1e25865e8efa2f8
MD5 d91bd184c182fc731eb8ff06e6fecb1f
BLAKE2b-256 561fc1d589b3c4f26c94a0cf8d11587e8820c7d4330abc74b5570f61d8bd724a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page