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จาก namespacehashicorp- เบื้องหลังคือ
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 ลงใน
.tffile โดยตรง — จะหลุดเข้า 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