Skip to main content

Environment Variables

ใช้ environment variable ส่งค่า variable + ตั้งค่า Terraform behavior — เหมาะสุดสำหรับ secret + CI/CD

TF_VAR_* Pattern

ทุก variable ที่ประกาศใน variable block สามารถส่งค่าผ่าน env var ได้:

variable "region" {
type = string
}

variable "db_password" {
type = string
sensitive = true
}
export TF_VAR_region="ap-southeast-1"
export TF_VAR_db_password="super-secret"
terraform apply

→ Terraform อ่าน TF_VAR_<NAME> มาใส่ใน var.<NAME> อัตโนมัติ

Use Cases หลัก

1. Secrets (ปลอดภัยกว่าใส่ใน .tfvars)

# fetch จาก Vault
export TF_VAR_db_password=$(vault kv get -field=password secret/db)

# fetch จาก AWS Secrets Manager
export TF_VAR_api_key=$(aws secretsmanager get-secret-value \
--secret-id prod/api-key --query SecretString --output text)

terraform apply

2. CI/CD Pipeline

GitHub Actions:

- name: Apply
run: terraform apply -auto-approve
env:
TF_VAR_environment: ${{ github.ref_name }}
TF_VAR_db_password: ${{ secrets.DB_PASSWORD }}
TF_VAR_aws_region: ${{ vars.AWS_REGION }}

3. Local Development

~/.zshrc or ~/.bashrc
export TF_VAR_region="ap-southeast-1"
export TF_VAR_environment="dev"

Type Conversion ใน Env Var

env var ทุกตัวเป็น string — Terraform แปลงให้เอง:

variable "instance_count" { type = number }
variable "enabled" { type = bool }
variable "azs" { type = list(string) }
variable "tags" { type = map(string) }
# Number → OK
export TF_VAR_instance_count="3"

# Bool → OK
export TF_VAR_enabled="true"

# List/Map → ต้องเป็น HCL/JSON syntax
export TF_VAR_azs='["us-east-1a", "us-east-1b"]'
export TF_VAR_tags='{Env="prod", Team="platform"}'

Terraform CLI Environment Variables

นอกจาก TF_VAR_* ยังมี env var อื่นที่ตั้งค่า Terraform เอง:

ENVหน้าที่
TF_LOGLog level: TRACE, DEBUG, INFO, WARN, ERROR
TF_LOG_PATHเขียน log ลงไฟล์
TF_INPUT0 = ไม่ถาม input ใดๆ (good for CI)
TF_IN_AUTOMATIONบอก Terraform ว่ารันใน CI (เปลี่ยน output style)
TF_CLI_ARGSเพิ่ม CLI args ทุกครั้ง
TF_CLI_ARGS_<command>เพิ่ม args เฉพาะ command (e.g. TF_CLI_ARGS_plan)
TF_DATA_DIRเปลี่ยน path ของ .terraform/
TF_PLUGIN_CACHE_DIR⭐ Cache provider plugins (ดูข้างล่าง)
TF_WORKSPACEเลือก workspace

ตัวอย่างใช้งาน

# Debug mode
export TF_LOG=DEBUG
export TF_LOG_PATH=./terraform-debug.log
terraform apply

# CI/CD mode
export TF_INPUT=0
export TF_IN_AUTOMATION=1
terraform apply -auto-approve

Plugin Cache (ประหยัดดิสก์ + เร็วขึ้น)

หลาย project = ดาวน์โหลด provider ซ้ำๆ → กินพื้นที่ + ช้า

ตั้ง:

~/.terraformrc (or .terraform.d/cli.tfrc)
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"

หรือ env var:

export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
mkdir -p "$TF_PLUGIN_CACHE_DIR"

ครั้งต่อไปที่ terraform init — Terraform จะเช็ค cache ก่อน ถ้ามีก็ใช้เลย

ลดเวลา CI

Cache plugin ทำให้ CI เร็วขึ้น 30-60 วินาที/run — แค่ cache ~/.terraform.d/plugin-cache/

AWS Credentials Env Vars

ไม่ต้อง config ใน Terraform — provider อ่านจาก env เอง:

export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_DEFAULT_REGION="ap-southeast-1"
export AWS_PROFILE="prod"
export AWS_SESSION_TOKEN="..." # ถ้าใช้ MFA / temp credentials

Direnv (Local Dev Workflow)

direnv — auto-load env เมื่อเข้า folder

.envrc (in project folder)
export TF_VAR_environment="dev"
export TF_VAR_region="ap-southeast-1"
export AWS_PROFILE="dev"
direnv allow
# ครั้งต่อไปเข้า folder นี้ → env load ให้อัตโนมัติ

.envrc อย่า commit ลง Git ถ้ามี secret — ใส่ใน .gitignore

ลำดับ Precedence Reminder

(ตัวหลังชนะ)

  1. default ใน variable block
  2. TF_VAR_* environment variable ← อยู่ตรงนี้
  3. terraform.tfvars
  4. terraform.tfvars.json
  5. *.auto.tfvars
  6. CLI -var / -var-file

Best Practices

# ✅ ดี: secret ใน env, public ใน .tfvars
export TF_VAR_db_password=$(get-secret)
terraform apply -var-file=prod.tfvars

# ✅ ดี: CI/CD ใช้ TF_INPUT=0
export TF_INPUT=0
terraform apply -auto-approve

# ❌ ไม่ดี: hard-code secret ใน script
TF_VAR_db_password="hardcoded123" terraform apply

สรุป

  • TF_VAR_<NAME> ส่งค่า variable ผ่าน env
  • ใช้สำหรับ secrets + CI/CD pipeline
  • มี env var อื่นๆ ที่ตั้งค่า Terraform เอง (TF_LOG, TF_INPUT, TF_PLUGIN_CACHE_DIR)
  • ใช้ direnv ทำ local dev workflow
  • AWS credentials = ส่งผ่าน env ของ AWS (ไม่ใช่ TF_VAR_)

ต่อไป → Validation Rules