| name | terraformer |
| description | Terraformer tool for reverse-engineering existing cloud infrastructure into Terraform code. Import resources from AWS, Azure, GCP, Kubernetes, and other providers. Generate Terraform configurations from running infrastructure for migration, disaster recovery, and infrastructure documentation. |
| allowed-tools | ["Bash","Read","Write","Edit","Glob","Grep","Task","WebFetch","WebSearch"] |
| dependencies | ["terraform-enterprise"] |
| triggers | ["terraformer","reverse engineer","import infrastructure","terraform import","cloud import","infrastructure discovery","terraform generate","import aws","import azure","import gcp","infrastructure migration"] |
Terraformer Skill
Comprehensive Terraformer tool expertise for reverse-engineering existing cloud infrastructure into Terraform code. Transform brownfield infrastructure into infrastructure-as-code with automated resource discovery and code generation.
When to Use This Skill
Activate this skill when:
- Migrating existing infrastructure to Terraform
- Documenting undocumented infrastructure
- Creating disaster recovery configurations
- Reverse-engineering manually created resources
- Auditing cloud resource configurations
- Generating Terraform code from existing resources
- Consolidating multi-account or multi-region infrastructure
- Creating baseline configurations for new environments
- Importing resources from multiple cloud providers
- Validating infrastructure drift
What is Terraformer?
Terraformer is a CLI tool that generates Terraform configuration files from existing infrastructure. It uses cloud provider APIs to discover resources and automatically creates:
- Terraform resource blocks (.tf files)
- Terraform state files (.tfstate)
- Variable definitions
- Provider configurations
Best for: Brownfield infrastructure, migration projects, infrastructure discovery, documentation generation
Supported Providers
Terraformer supports 40+ providers including:
Major Cloud Providers
- AWS: 150+ resource types including VPC, EC2, RDS, S3, IAM, Lambda, EKS, etc.
- Azure: Resource Groups, VNets, VMs, AKS, Storage, Key Vault, App Services
- GCP: Projects, VPC, GCE, GKE, Cloud SQL, IAM, Cloud Functions, Storage
- Oracle Cloud Infrastructure (OCI): Compute, networking, storage, databases
Container & Orchestration
- Kubernetes: Deployments, Services, ConfigMaps, Secrets, Ingress, PVCs
- OpenShift: Routes, DeploymentConfigs, BuildConfigs
- Cloud Foundry: Apps, services, routes
Other Providers
- GitHub: Repositories, teams, webhooks
- Datadog: Monitors, dashboards, users
- New Relic: Alerts, dashboards
- Cloudflare: DNS, firewall rules
- Fastly: Services, backends
- Heroku: Apps, addons, pipelines
Core Capabilities
Resource Discovery
- Automated scanning of cloud accounts
- Multi-region resource discovery
- Filtered imports by resource type, tag, or name
- Bulk import operations
- Cross-account discovery
Code Generation
- HCL (Terraform language) file generation
- State file creation
- Variable extraction
- Output definitions
- Provider configurations
Import Strategies
- Full account import: All resources in an account/subscription
- Selective import: Specific resource types or services
- Filtered import: By tags, names, or patterns
- Region-specific import: Single or multi-region
- Resource dependency mapping: Maintains relationships
State Management
- Generates valid Terraform state
- Supports remote state backends
- State file splitting by resource type
- Incremental state updates
Installation
brew install terraformer
curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-linux-amd64
chmod +x terraformer-linux-amd64
sudo mv terraformer-linux-amd64 /usr/local/bin/terraformer
choco install terraformer
terraformer version
Basic Usage Pattern
terraformer import <provider> \
--resources=<resource_types> \
--regions=<regions> \
--filter=<filters> \
--path-pattern=<output_path> \
--compact
terraformer import aws \
--resources=vpc,subnet,security_group \
--regions=us-east-1 \
--compact
Common Workflows
1. Discover Existing Infrastructure
terraformer import aws --resources=* --regions=us-east-1 --dry-run
terraformer import aws list
terraformer import azure list
terraformer import google list
2. Selective Resource Import
terraformer import aws \
--resources=vpc,subnet,route_table,internet_gateway \
--regions=us-east-1,us-west-2 \
--compact
terraformer import aws \
--resources=ec2_instance \
--regions=us-east-1 \
--filter="Name=tag:Environment;Value=production" \
--compact
terraformer import aws \
--resources=s3 \
--filter="Name=id;Value=my-bucket-name" \
--compact
3. Full Account Import
terraformer import aws \
--resources=* \
--regions=us-east-1 \
--compact \
--path-pattern={output}/aws/{region}/{service}
terraformer import azure \
--resources=* \
--resource-group=my-resource-group
terraformer import google \
--resources=* \
--projects=my-project-id \
--regions=us-central1
4. Multi-Region Import
terraformer import aws \
--resources=vpc,ec2_instance,rds \
--regions=us-east-1,us-west-2,eu-west-1 \
--compact \
--path-pattern={output}/aws/{region}
5. Kubernetes Import
terraformer import kubernetes \
--resources=deployments,services,configmaps,secrets \
--namespace=production
terraformer import kubernetes \
--resources=* \
--namespace=default
Output Structure
After running Terraformer, the output directory contains:
generated/
└── aws/
└── us-east-1/
├── vpc/
│ ├── vpc.tf # Resource definitions
│ ├── terraform.tfstate # Generated state
│ ├── variables.tf # Variable definitions
│ └── outputs.tf # Output definitions
├── ec2_instance/
│ ├── ec2_instance.tf
│ ├── terraform.tfstate
│ └── variables.tf
└── security_group/
├── security_group.tf
└── terraform.tfstate
Post-Import Workflow
1. Review Generated Code
cd generated/aws/us-east-1/vpc
cat vpc.tf
terraform state list
2. Clean Up and Refactor
3. Initialize and Validate
terraform init
terraform validate
terraform plan
4. Integrate with Existing Projects
terraform state pull > original.tfstate
terraform import aws_vpc.main vpc-12345678
Advanced Features
Filtering Strategies
terraformer import aws \
--resources=ec2_instance \
--filter="Name=tag:Team;Value=platform"
terraformer import aws \
--resources=s3 \
--filter="Name=id;Value=prod-*"
terraformer import aws \
--resources=rds \
--filter="Name=tag:Environment;Value=production" \
--filter="Name=engine;Value=postgres"
terraformer import aws \
--resources=vpc \
--excludes="default-vpc-*"
Custom Path Patterns
terraformer import aws \
--resources=* \
--regions=us-east-1 \
--path-pattern=generated/{provider}/{region}/{environment}
terraformer import aws \
--resources=vpc,subnet,route_table \
--path-pattern=generated/networking/{service}
Compact Mode
terraformer import aws \
--resources=vpc \
--compact
Plan File Generation
terraformer plan aws \
--resources=vpc \
--regions=us-east-1
terraform show plan.out
Integration with Terraform Enterprise
Migrating to Remote State
terraformer import aws --resources=vpc --regions=us-east-1
cat > backend.tf <<EOF
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "imported/vpc/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
EOF
terraform init
terraform state push terraform.tfstate
Creating Modules from Imports
terraformer import aws --resources=vpc,subnet --compact
mkdir -p modules/vpc
mv generated/aws/us-east-1/vpc/*.tf modules/vpc/
cat > main.tf <<EOF
module "vpc" {
source = "./modules/vpc"
cidr_block = "10.0.0.0/16"
name = "production-vpc"
}
EOF
Best Practices
Before Import
- Audit existing infrastructure: Document what exists
- Plan resource organization: Decide on module structure
- Set up version control: Initialize git repository
- Configure authentication: Set up cloud provider credentials
- Test on non-production first: Validate process safely
During Import
- Use filters: Import only what you need
- Import incrementally: Start with core services
- Use compact mode: Improve readability
- Organize by service: Use path patterns
- Document decisions: Add comments explaining why
After Import
- Review all generated code: Don't blindly trust output
- Run terraform plan: Verify no drift
- Refactor immediately: Clean up before it grows
- Extract variables: Remove hardcoded values
- Add validation: Implement input validation
- Create modules: Consolidate repeated patterns
- Document architecture: Update documentation
- Set up CI/CD: Automate validation and deployment
- Enable state locking: Prevent concurrent modifications
- Implement policy checks: Add Sentinel/OPA policies
Common Use Cases
1. Disaster Recovery Setup
terraformer import aws \
--resources=vpc,subnet,ec2_instance,rds,s3 \
--regions=us-east-1 \
--filter="Name=tag:Environment;Value=production"
terraform apply -var="region=us-west-2"
2. Multi-Account Consolidation
export AWS_PROFILE=account-a
terraformer import aws \
--resources=* \
--regions=us-east-1 \
--path-pattern=generated/account-a/{service}
export AWS_PROFILE=account-b
terraformer import aws \
--resources=* \
--regions=us-east-1 \
--path-pattern=generated/account-b/{service}
3. Infrastructure Documentation
terraformer import aws --resources=* --regions=us-east-1
terraform-docs markdown . > INFRASTRUCTURE.md
terraform graph | dot -Tpng > architecture.png
4. Migration to Terraform
terraformer import aws --resources=vpc,subnet,route_table
terraform plan
Troubleshooting
Issue: Import Fails with Authentication Error
Solution: Verify cloud provider credentials
aws sts get-caller-identity
export AWS_PROFILE=my-profile
az account show
az login
gcloud auth list
gcloud config set project my-project
Issue: Too Many Resources Generated
Solution: Use filters to limit scope
terraformer import aws --resources=*
terraformer import aws --resources=vpc,ec2_instance,rds
Issue: Plan Shows Drift After Import
Solution: Review for default values and formatting
Issue: State File Too Large
Solution: Split into smaller state files
terraformer import aws \
--resources=* \
--path-pattern=generated/{service}
Issue: Missing Dependencies
Solution: Import dependent resources together
terraformer import aws \
--resources=vpc,subnet,route_table,internet_gateway,nat_gateway,security_group \
--regions=us-east-1
Issue: Resource Names Not Meaningful
Solution: Refactor after import
terraform state mv \
'aws_instance.tfer--i-0123456789abcdef0' \
'aws_instance.web_server_1'
Provider-Specific Notes
AWS
- Requires AWS credentials (env vars, AWS CLI, or IAM role)
- Supports 150+ resource types
- Can import across multiple accounts with profiles
- Best filtering support via tags and resource IDs
Azure
- Requires Azure CLI authentication
- Organizes by resource groups
- Supports managed identities
- Use
--resource-group flag for scoped imports
GCP
- Requires gcloud authentication
- Organizes by projects
- Use
--projects flag for project selection
- Supports service account authentication
Kubernetes
- Uses current kubeconfig context
- Can specify namespace with
--namespace
- Supports multiple clusters via context switching
- Imports CRDs (Custom Resource Definitions)
Performance Optimization
Speed Up Large Imports
terraformer import aws \
--resources=ec2_instance \
--regions=us-east-1,us-west-2 \
--parallel=4
terraformer import aws \
--resources=ec2_instance \
--filter="Name=launch-time;Value=2024-01-01"
terraformer import aws \
--resources=* \
--compact
Reduce Output Size
terraformer import aws \
--resources=* \
--excludes="default-*,terraform-*"
terraformer import aws \
--resources=vpc \
--path-pattern=generated/{service}
Security Considerations
- Credential Management: Use temporary credentials or IAM roles
- State File Security: State files contain sensitive data
- Audit Logging: Enable CloudTrail/Activity Logs for import operations
- Least Privilege: Use read-only permissions for import
- Sensitive Data: Review for secrets, passwords, API keys
- Encryption: Encrypt state files at rest and in transit
- Access Control: Restrict who can run terraformer
File References
Core References
references/providers.md - Provider-specific import patterns and examples
references/import-workflow.md - Step-by-step import process and best practices
references/filters.md - Advanced filtering techniques and patterns
references/post-import.md - Cleanup, refactoring, and optimization guide
Examples
examples/aws-import.sh - AWS infrastructure import script
examples/azure-import.sh - Azure resource import script
examples/gcp-import.sh - GCP project import script
examples/kubernetes-import.sh - Kubernetes cluster import script
examples/multi-cloud-import.sh - Multi-cloud consolidated import
Integration Points
With Other Skills
- terraform-enterprise: Use imported code with Terraform workflows
- iac-architecture: Design patterns for organizing imported infrastructure
- vault-operations: Manage secrets discovered during import
With Commands
/iac:import: Guided terraformer import workflow
/iac:validate: Validate imported Terraform code
/iac:refactor: Refactor imported code into modules
With Agents
- terraform-import-specialist: Orchestrate complex imports
- terraform-architect: Review and optimize imported code
- infrastructure-auditor: Analyze imported infrastructure for compliance
Related Documentation
Version Compatibility
- Terraformer >= 0.8.24 (latest stable)
- Terraform >= 1.0.0 (required)
- Provider versions: Latest stable recommended
- Cloud provider CLI tools for authentication
Quick Reference
Essential Commands
terraformer --help
terraformer import aws list
terraformer import aws --resources=vpc --dry-run
terraformer import aws --resources=vpc --regions=us-east-1
terraformer import aws --resources=vpc --filter="Name=tag:Env;Value=prod"
terraformer import aws --resources=vpc --regions=us-east-1,us-west-2
terraformer import aws --resources=* --regions=us-east-1 --compact
Common Filters
--filter="Name=tag:Environment;Value=production"
--filter="Name=id;Value=vpc-12345678"
--filter="Name=name;Value=prod-*"
--filter="Name=tag:Team;Value=platform" --filter="Name=tag:Env;Value=prod"
Output Organization
--path-pattern=generated/{service}
--path-pattern=generated/{region}/{service}
--path-pattern=generated/{environment}/{service}
--path-pattern=infrastructure/{provider}/{region}/{environment}/{service}