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
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_LOG | Log level: TRACE, DEBUG, INFO, WARN, ERROR |
TF_LOG_PATH | เขียน log ลงไฟล์ |
TF_INPUT | 0 = ไม่ถาม 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 ซ้ำๆ → กินพื้นที่ + ช้า
ตั้ง:
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 ก่อน ถ้ามีก็ใช้เลย
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
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
(ตัวหลังชนะ)
defaultใน variable blockTF_VAR_*environment variable ← อยู่ตรงนี้terraform.tfvarsterraform.tfvars.json*.auto.tfvars- 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