{"id":31684884,"url":"https://github.com/atulkamble/terraform-cheat-sheet","last_synced_at":"2026-03-05T01:02:12.669Z","repository":{"id":139085741,"uuid":"375118450","full_name":"atulkamble/terraform-cheat-sheet","owner":"atulkamble","description":"Terraform Commands Cheatsheet © 2025","archived":false,"fork":false,"pushed_at":"2025-09-26T06:37:40.000Z","size":41,"stargazers_count":7,"open_issues_count":0,"forks_count":16,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-26T08:30:05.413Z","etag":null,"topics":["aws","azure","cheatsheet","cloud","cloudnative","gcp","hashicorp","hashicorp-terraform","terraform"],"latest_commit_sha":null,"homepage":"https://atulkamble.github.io/Terraform-Cheat-Sheet/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/atulkamble.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"atulkamble","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2021-06-08T19:11:05.000Z","updated_at":"2025-09-26T06:38:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"cdc3fcf9-e964-4732-9f70-8062c1d499f8","html_url":"https://github.com/atulkamble/terraform-cheat-sheet","commit_stats":{"total_commits":13,"total_committers":1,"mean_commits":13.0,"dds":0.0,"last_synced_commit":"2fb5b04cce62355de70528d9892d583d225e802b"},"previous_names":["atulkamble/terraform-cheat-sheet-","atulkamble/terraform-cheat-sheet"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/atulkamble/terraform-cheat-sheet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulkamble%2Fterraform-cheat-sheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulkamble%2Fterraform-cheat-sheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulkamble%2Fterraform-cheat-sheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulkamble%2Fterraform-cheat-sheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atulkamble","download_url":"https://codeload.github.com/atulkamble/terraform-cheat-sheet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atulkamble%2Fterraform-cheat-sheet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278916428,"owners_count":26068091,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","azure","cheatsheet","cloud","cloudnative","gcp","hashicorp","hashicorp-terraform","terraform"],"created_at":"2025-10-08T08:58:01.212Z","updated_at":"2025-10-08T08:58:04.671Z","avatar_url":"https://github.com/atulkamble.png","language":null,"funding_links":["https://github.com/sponsors/atulkamble"],"categories":[],"sub_categories":[],"readme":"# Terraform Cheatsheet (Commands, Codes \u0026 Steps)\n\n\u003e A fast, practical reference for everyday Terraform work — installation, init → plan → apply workflow, variables \u0026 modules, state, workspaces, backends, and common HCL patterns.\n\n---\n\n## 0) Install \u0026 Setup\n\n### macOS (Homebrew)\n\n```bash\nbrew tap hashicorp/tap\nbrew install hashicorp/tap/terraform\nterraform -install-autocomplete\nterraform version\n```\n\n### Linux (Zip release)\n\n```bash\ncurl -fsSL https://releases.hashicorp.com/terraform/ | head -n 20  # find latest version\ncurl -O https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip\nunzip terraform_1.7.5_linux_amd64.zip\nsudo mv terraform /usr/local/bin/\nterraform -install-autocomplete\nterraform version\n```\n\n### Optional: tfenv (Version Manager)\n\n```bash\ngit clone https://github.com/tfutils/tfenv.git ~/.tfenv\necho 'export PATH=\"$HOME/.tfenv/bin:$PATH\"' \u003e\u003e ~/.bash_profile\nsource ~/.bash_profile\ntfenv install 1.7.5\ntfenv use 1.7.5\n```\n\n---\n\n## 1) Project Scaffolding\n\n```\nproject/\n├─ main.tf          # root module (resources, data, providers)\n├─ variables.tf     # input variables\n├─ outputs.tf       # outputs\n├─ providers.tf     # provider blocks\n├─ versions.tf      # required_version, etc.\n├─ terraform.tfvars # variable defaults (don’t commit secrets)\n└─ modules/         # reusable child modules\n```\n\nRecommended `.gitignore`:\n\n```\n.terraform/\n.terraform.lock.hcl\n*.tfstate\n*.tfstate.*\ncrash.log\n*.tfvars\n*.auto.tfvars\noverride.tf*\n*_override.tf*\n```\n\n---\n\n## 2) Initialize Providers, Modules \u0026 Backend\n\n```bash\nterraform init                    # first command in a new repo\nterraform init -upgrade           # upgrade providers/modules\nterraform init -backend-config=backend.hcl -reconfigure\nterraform providers               # list required providers\nterraform -help \u003ccommand\u003e         # built-in help\n```\n\nExample `backend.hcl` (AWS S3 + DynamoDB):\n\n```hcl\nbucket         = \"my-tf-state-bucket\"\nkey            = \"envs/dev/terraform.tfstate\"\nregion         = \"ap-south-1\"\ndynamodb_table = \"tf-state-locks\"\nencrypt        = true\n```\n\n---\n\n## 3) Core Workflow\n\n```bash\nterraform fmt -recursive                 # format\nterraform validate                       # validate HCL\nterraform plan -out=plan.tfplan          # generate plan\nterraform apply plan.tfplan              # apply saved plan\nterraform apply [-auto-approve]          # direct apply\nterraform destroy [-auto-approve]        # destroy infra\n```\n\nTargeted \u0026 replace:\n\n```bash\nterraform plan -target=aws_s3_bucket.site\nterraform apply -replace=aws_instance.web\n```\n\nTroubleshooting:\n\n```bash\nTF_LOG=DEBUG TF_LOG_PATH=tf.log terraform apply\nterraform console\nterraform graph | dot -Tpng \u003e graph.png\n```\n\n---\n\n## 4) Variables, Locals \u0026 Outputs\n\n`variables.tf`\n\n```hcl\nvariable \"aws_region\" { type = string, default = \"ap-south-1\" }\nvariable \"tags\" {\n  type = map(string)\n  default = { project=\"demo\", owner=\"Atul\" }\n}\n```\n\n`terraform.tfvars`\n\n```hcl\naws_region = \"ap-south-1\"\ntags = { project=\"demo\", owner=\"Atul\" }\n```\n\nCLI overrides:\n\n```bash\nterraform apply -var 'aws_region=us-east-1'\nterraform apply -var-file=prod.tfvars\n```\n\nLocals:\n\n```hcl\nlocals {\n  prefix = \"${var.project}-${terraform.workspace}\"\n}\n```\n\nOutputs:\n\n```hcl\noutput \"website_url\" {\n  value = \"http://${aws_s3_bucket.site.bucket_regional_domain_name}\"\n}\n```\n\n---\n\n## 5) Resources, Data Sources \u0026 Meta-Arguments\n\nResource:\n\n```hcl\nresource \"aws_s3_bucket\" \"site\" {\n  bucket = \"${local.prefix}-site\"\n  tags   = var.tags\n}\n```\n\nData source:\n\n```hcl\ndata \"aws_ami\" \"amazon_linux\" {\n  most_recent = true\n  owners = [\"amazon\"]\n  filter {\n    name   = \"name\"\n    values = [\"al2023-ami-*\"]\n  }\n}\n```\n\nMeta-args:\n\n```hcl\ncount, for_each, depends_on, lifecycle\n```\n\n---\n\n## 6) Modules\n\nExample reusable VPC module:\n\n```hcl\nmodule \"vpc\" {\n  source = \"./modules/vpc\"\n  cidr   = \"10.0.0.0/16\"\n}\n```\n\nPull/update:\n\n```bash\nterraform get -update=true\n```\n\n---\n\n## 7) Workspaces\n\n```bash\nterraform workspace new dev\nterraform workspace select dev\nterraform workspace list\nterraform.workspace   # reference in code\n```\n\n---\n\n## 8) State Management\n\nInspect/move/import:\n\n```bash\nterraform show\nterraform state list\nterraform state show aws_s3_bucket.site\nterraform state mv aws_iam_role.old module.iam.aws_iam_role.new\nterraform state rm aws_s3_bucket.legacy\nterraform state pull \u003e terraform.tfstate\nterraform state push terraform.tfstate\nterraform state replace-provider hashicorp/aws registry.opentofu.org/aws\n```\n\nImport existing:\n\n```bash\nterraform import aws_s3_bucket.imported my-existing-bucket\n```\n\n---\n\n## 9) Terraform Cloud / Remote Runs\n\n```bash\nterraform login\nterraform logout\n```\n\nConfigure with `cloud {}` or `backend \"remote\" {}`.\n\n---\n\n## 10) Example: AWS Static Website\n\n`main.tf`:\n\n```hcl\nresource \"aws_s3_bucket\" \"site\" {\n  bucket = \"tf-site-${terraform.workspace}\"\n}\nresource \"aws_s3_bucket_website_configuration\" \"site\" {\n  bucket = aws_s3_bucket.site.id\n  index_document { suffix = \"index.html\" }\n  error_document { key = \"index.html\" }\n}\noutput \"url\" {\n  value = \"http://${aws_s3_bucket_website_configuration.site.website_endpoint}\"\n}\n```\n\nCommands:\n\n```bash\nterraform init -backend-config=backend.hcl\nterraform workspace new dev\nterraform plan -out=plan.tfplan\nterraform apply plan.tfplan\nterraform output url\n```\n\n---\n\n## 11) Extended Commands\n\nTaint \u0026 unlock:\n\n```bash\nterraform taint aws_instance.my_ec2\nterraform untaint aws_instance.my_ec2\nterraform force-unlock LOCK_ID\n```\n\nConsole:\n\n```bash\necho 'join(\",\",[\"foo\",\"bar\"])' | terraform console\n```\n\nGraph:\n\n```bash\nterraform graph | dot -Tpng \u003e graph.png\n```\n\n---\n\n## 12) Best Practices\n\n* Pin provider versions \u0026 commit `.terraform.lock.hcl`.\n* Never commit `*.tfstate` or secrets.\n* Use `for_each` instead of `count` for stable keys.\n* Minimize use of `-target`.\n* Use `terraform plan -refresh-only` for drift detection.\n* Limit concurrency with `-parallelism=N`.\n\n---\n\n## 13) One-Page Command Reference\n\n```bash\nterraform version\nterraform init [-backend-config=FILE] [-upgrade] [-reconfigure]\nterraform fmt -recursive\nterraform validate\nterraform plan [-out=plan.tfplan] [-target=ADDR] [-replace=ADDR] [-refresh-only]\nterraform apply [plan.tfplan] [-auto-approve]\nterraform destroy [-target=ADDR] [-auto-approve]\nterraform output [-raw NAME] [-json]\nterraform providers\nterraform console\nterraform graph | dot -Tpng \u003e graph.png\nterraform workspace list|new|select|show\nterraform state list|show|mv|rm|pull|push|replace-provider\nterraform import \u003cADDR\u003e \u003cID\u003e\nterraform taint|untaint \u003cADDR\u003e\nterraform force-unlock \u003cLOCK_ID\u003e\n```\n\n---\n\n## Author \u0026 Links\n\n* 📘 [Terraform Cheatsheet](https://atulkamble.github.io/Terraform-Commands-Cheatsheet/)\n* 👨‍💻 [GitHub: atulkamble](https://github.com/atulkamble)\n* 💼 [LinkedIn: atuljkamble](https://linkedin.com/in/atuljkamble)\n* 📝 [Medium: atuljkamble](https://atuljkamble.medium.com)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatulkamble%2Fterraform-cheat-sheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatulkamble%2Fterraform-cheat-sheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatulkamble%2Fterraform-cheat-sheet/lists"}