stephane.bio
  • Invest
  • Build
  • Write
  • Think
Ketchup

magodo/tfadd: Generate valid Terraform configuration from state

URL
https://github.com/magodo/tfadd

tfadd

Generate valid Terraform configuration from state.

Install

go install github.com/magodo/tfadd@latest

Intro

The goal of this tool is to improve the import experience of Terraform, that rather than constructing the configurations from scratch, tfadd (try its best to) provide users a valid configuration automatically.

The valid here means the generated configuration should raise no error and show no diff during terraform plan.

Currently to generate the state, the tool supports full mode (with -full) or partial mode (by default).

    0e8d68c54bb24c4b8905c2d9bf6989cd

    In full mode, tfadd outputs all non-computed properties in the generated config. The generated config might be invalid for kinds of reasons, where manual modification is needed. But the benefit is that it works for any Terraform provider.

  • In partial mode, tfadd only outputs properties without Optional+Computed properties, with cross property constraints taken into consideration. This mode aims aims to generate a valid Terraform config. Currently, this mode can only works for the following providers:

    Name
    Version
    hashicorp/aws
    v4.67.0
    hashicorp/azurerm
    v3.99.0
    hashicorp/google
    v4.64.0
    azure/azapi
    v1.9.0

Usage

The typical usage is to use tfadd together with terraform import:

  1. Prepare an empty workspace (e.g. an empty directory for local backend)
  2. Identify the existing resources to import, write down the empty resource block
  3. (partial mode only) Run tfadd init [providers...] > terraform.tf to populate the Terraform setting to pin the provider version
  4. Run terraform init to initialize the providers
  5. Import the resources via terraform import
  6. Run tfadd state or tfadd state -full to generate the configuration

Limitation

  • Only the managed resources of the root module in the state file will get the config generated, any child module will be skipped.
  • No inter-resource dependency generated.
stephane.bio

Made with Notion, Published on Super - 2026 © Stephane Boghossian

LinkedInInstagramMediumGitHubXBehanceDiscordPinterest