Providers แบบเจาะลึก

📖 text • 10 นาที

Providers แบบเจาะลึก

Provider คือหัวใจของ Terraform — เป็น plugin ที่ทำให้ Terraform คุยกับ API ของ cloud service ต่างๆ ได้

Provider คืออะไร?

Provider เป็นตัวกลางระหว่าง Terraform กับ cloud service:

Terraform Code → Provider Plugin → Cloud API → Real Infrastructure

ไม่มี provider = Terraform ทำอะไรไม่ได้เลย

การประกาศ Provider

Required Providers

บอก Terraform ว่าโปรเจคนี้ใช้ provider อะไรบ้าง:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "~> 3.0"
    }
  }
}

Source Format

<namespace>/<type>
  • hashicorp/aws = provider ชื่อ aws จาก namespace hashicorp
  • เบื้องหลังคือ registry.terraform.io/hashicorp/aws

Version Constraints

Constraint ความหมาย ตัวอย่าง
= 5.0.0 ต้องเป็น version นี้เท่านั้น 5.0.0
>= 5.0 version 5.0 ขึ้นไป 5.0, 5.1, 6.0
~> 5.0 >= 5.0, < 6.0 (pessimistic) 5.0, 5.99 แต่ไม่ใช่ 6.0
~> 5.1.0 >= 5.1.0, < 5.2.0 5.1.0, 5.1.9 แต่ไม่ใช่ 5.2.0

Best Practice: ใช้ ~> เพื่อ lock major version แต่ยังได้ patch/minor updates

Provider Configuration

Basic Configuration

provider "aws" {
  region = "ap-southeast-1"
}

Multiple Regions ด้วย Alias

ถ้าต้องการ deploy ไปหลาย region:

# Default provider (ไม่มี alias)
provider "aws" {
  region = "ap-southeast-1"
}

# Provider สำหรับ US region
provider "aws" {
  alias  = "us"
  region = "us-east-1"
}

ใช้งาน:

# ใช้ default provider
resource "aws_s3_bucket" "data" {
  bucket = "myapp-data-sg"
}

# ใช้ US provider
resource "aws_s3_bucket" "backup" {
  provider = aws.us
  bucket   = "myapp-backup-us"
}

Provider ยอดนิยม

AWS

provider "aws" {
  region  = "ap-southeast-1"
  profile = "my-profile"  # ใช้ named profile จาก ~/.aws/credentials

  default_tags {
    tags = {
      ManagedBy = "terraform"
      Project   = "myapp"
    }
  }
}

default_tags จะติด tag ให้ทุก resource อัตโนมัติ — ไม่ต้องใส่ซ้ำทุกที่

Google Cloud

provider "google" {
  project = "my-project-id"
  region  = "asia-southeast1"
}

Kubernetes

provider "kubernetes" {
  config_path = "~/.kube/config"
  context     = "my-cluster"
}

Random (สร้างค่า random)

provider "random" {}

resource "random_id" "suffix" {
  byte_length = 4
}

resource "aws_s3_bucket" "data" {
  bucket = "myapp-${random_id.suffix.hex}"
  # ผลลัพธ์: myapp-a1b2c3d4
}

Authentication

Provider ต้อง authenticate กับ cloud — วิธีที่แนะนำ เรียงจากดีสุดไปน้อย:

1. Environment Variables (แนะนำสำหรับ CI/CD)

export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_DEFAULT_REGION="ap-southeast-1"

2. Shared Credentials File (แนะนำสำหรับ local dev)

aws configure --profile myproject
provider "aws" {
  region  = "ap-southeast-1"
  profile = "myproject"
}

3. IAM Role (แนะนำสำหรับ production)

provider "aws" {
  region = "ap-southeast-1"

  assume_role {
    role_arn = "arn:aws:iam::123456789012:role/TerraformRole"
  }
}

ห้ามทำ: ใส่ credentials ลงใน .tf file โดยตรง — จะหลุดเข้า git!

Lock File

หลัง terraform init จะมีไฟล์ .terraform.lock.hcl:

provider "registry.terraform.io/hashicorp/aws" {
  version     = "5.82.2"
  constraints = "~> 5.0"
  hashes = [
    "h1:abc123...",
  ]
}

ไฟล์นี้:

  • Lock version ที่ใช้จริง — ทุกคนในทีมได้ version เดียวกัน
  • เก็บ hash — ตรวจสอบว่า provider ไม่ถูกแก้ไข
  • ควร commit เข้า git

อัพเดท provider:

# อัพเดทตาม constraint ที่ตั้งไว้
terraform init -upgrade

สรุป

Concept ตัวอย่าง
ประกาศ provider required_providers { aws = { ... } }
Version constraint ~> 5.0
Configuration provider "aws" { region = "..." }
Multiple regions provider "aws" { alias = "us" }
Authentication Environment variables หรือ shared credentials
Lock file .terraform.lock.hcl (commit เข้า git)

บทถัดไปเราจะเรียนรู้เรื่อง Resource และ Data Source