Terraform Cheatsheet
Providers
Use this Terraform reference while you build software engineering projects, review code, or refresh the syntax you reach for most.
What Providers Are
Providers are plugins that translate Terraform resource blocks into API calls for a specific platform (AWS, GCP, Azure, GitHub, Kubernetes, etc.). The Terraform Registry hosts thousands of them.
Declaring Providers
terraform {
required_providers {
aws = {
source = "hashicorp/aws" # <namespace>/<type>
version = "~> 6.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
}Configuring a Provider
provider "aws" { region = "us-east-1" profile = "myprofile" # ~/.aws/credentials profile }
Most providers pick up credentials from environment variables automatically:
export AWS_ACCESS_KEY_ID="AKIA..." export AWS_SECRET_ACCESS_KEY="..." export AWS_DEFAULT_REGION="us-east-1"
Multiple Provider Instances (alias)
Use alias when you need the same provider in different configurations (e.g., two AWS regions).
provider "aws" { region = "us-east-1" } provider "aws" { alias = "west" region = "us-west-2" } resource "aws_s3_bucket" "backup" { provider = aws.west # reference with <type>.<alias> bucket = "my-west-backup" }
Common Providers Quick Reference
| Provider | Source | Auth env vars |
|---|---|---|
| AWS | hashicorp/aws | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY |
| GCP | hashicorp/google | GOOGLE_CREDENTIALS or ADC |
| Azure | hashicorp/azurerm | ARM_CLIENT_ID, ARM_CLIENT_SECRET, ARM_TENANT_ID |
| Kubernetes | hashicorp/kubernetes | kubeconfig or in-cluster |
| GitHub | integrations/github | GITHUB_TOKEN |
| Datadog | DataDog/datadog | DD_API_KEY, DD_APP_KEY |
| Cloudflare | cloudflare/cloudflare | CLOUDFLARE_API_TOKEN |
AWS Provider — Common Config Options
provider "aws" { region = var.aws_region profile = var.aws_profile allowed_account_ids = ["123456789012"] # safety guard default_tags { tags = { ManagedBy = "terraform" Project = var.project_name } } assume_role { role_arn = "arn:aws:iam::ACCOUNT_ID:role/TerraformRole" session_name = "terraform" } }
GCP Provider
provider "google" { project = var.gcp_project region = "us-central1" zone = "us-central1-a" } # Credentials via file: provider "google" { credentials = file("sa-key.json") project = var.gcp_project region = "us-central1" }
Azure Provider
provider "azurerm" { features {} # required empty block subscription_id = var.subscription_id tenant_id = var.tenant_id }
Kubernetes Provider
provider "kubernetes" { config_path = "~/.kube/config" config_context = "my-cluster" } # Or from EKS data source: provider "kubernetes" { host = data.aws_eks_cluster.main.endpoint cluster_ca_certificate = base64decode(data.aws_eks_cluster.main.certificate_authority[0].data) token = data.aws_eks_cluster_auth.main.token }
Provider-Level Meta-Arguments
resource "aws_instance" "west" { provider = aws.west # use aliased provider ami = "ami-..." instance_type = "t3.micro" }
Locking Provider Versions
terraform init writes .terraform.lock.hcl — commit this file to lock exact versions across the team.
terraform providers lock \
-platform=linux_amd64 \
-platform=darwin_arm64 # add hashes for multiple platformsUseful Provider Commands
terraform providers # list providers used in current config terraform providers schema # dump provider schema as JSON terraform init -upgrade # upgrade to latest allowed versions (updates lock file)