Configuring Providers
เรียนวิธี config provider — ตั้ง credentials, region, alias สำหรับ multi-region/multi-account
Provider Block พื้นฐาน
providers.tf
provider "aws" {
region = "ap-southeast-1"
}
แค่นี้ Terraform ก็ deploy ที่ region สิงคโปร์ได้แล้ว — โดยใช้ credentials จาก:
- Environment variables (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - Shared credentials file (
~/.aws/credentials) - IAM role (ถ้ารันบน EC2/ECS/Lambda)
Authentication
วิธีที่ 1: AWS CLI Profile (แนะนำสำหรับ dev)
aws configure --profile dev
provider "aws" {
region = "ap-southeast-1"
profile = "dev"
}
วิธีที่ 2: Environment Variables
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_DEFAULT_REGION=ap-southeast-1
provider "aws" {
# ไม่ต้องระบุ — Terraform อ่านจาก env เอง
}
วิธีที่ 3: IAM Role + AssumeRole (production)
provider "aws" {
region = "ap-southeast-1"
assume_role {
role_arn = "arn:aws:iam::123456789012:role/TerraformAdmin"
session_name = "terraform"
}
}
วิธีที่ 4: Hard-coded (❌ อย่าทำ!)
provider "aws" {
access_key = "AKIA..." # ❌ ห้าม commit เข้า Git!
secret_key = "..." # ❌
region = "us-east-1"
}
Never commit credentials
- ห้าม hard-code credentials ใน
.tfไฟล์เด็ดขาด - ใช้ profile / env / IAM role / Vault แทน
- ใช้ git-secrets ป้องกันการเผลอ commit
Provider Alias (Multi-Region / Multi-Account)
ถ้าต้อง deploy ข้าม region หรือข้าม account → ใช้ alias
ตัวอย่าง: Multi-Region
# Default — Singapore
provider "aws" {
region = "ap-southeast-1"
}
# Alias — Tokyo
provider "aws" {
alias = "tokyo"
region = "ap-northeast-1"
}
# Alias — US East
provider "aws" {
alias = "us"
region = "us-east-1"
}
# ใช้ default
resource "aws_s3_bucket" "sg" {
bucket = "data-sg"
}
# ใช้ alias
resource "aws_s3_bucket" "tokyo" {
provider = aws.tokyo
bucket = "data-tokyo"
}
resource "aws_s3_bucket" "us" {
provider = aws.us
bucket = "data-us"
}
ตัวอย่าง: Multi-Account
provider "aws" {
alias = "prod"
region = "ap-southeast-1"
profile = "prod"
}
provider "aws" {
alias = "dev"
region = "ap-southeast-1"
profile = "dev"
}
resource "aws_s3_bucket" "prod_data" {
provider = aws.prod
bucket = "company-prod-data"
}
resource "aws_s3_bucket" "dev_data" {
provider = aws.dev
bucket = "company-dev-data"
}
Default Tags (AWS Provider)
ตั้ง tag ที่จะใส่ทุก resource อัตโนมัติ:
provider "aws" {
region = "ap-southeast-1"
default_tags {
tags = {
Environment = "production"
ManagedBy = "terraform"
Project = "my-app"
CostCenter = "engineering"
}
}
}
ทุก resource (ที่รองรับ tags) จะมี tags เหล่านี้อัตโนมัติ — ไม่ต้องเขียนซ้ำในทุก resource
Cost Allocation
ใส่ default_tags ทำให้ทำ cost allocation ใน AWS Cost Explorer ง่ายมาก
Multi-Cloud (ใช้ provider หลายตัว)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
}
}
provider "aws" {
region = "ap-southeast-1"
}
provider "google" {
project = "my-gcp-project"
region = "asia-southeast1"
}
provider "azurerm" {
features {}
}
# Resource ใน 3 clouds พร้อมกันใน config เดียว
resource "aws_s3_bucket" "data" { bucket = "my-data-aws" }
resource "google_storage_bucket" "data" { name = "my-data-gcp" }
resource "azurerm_storage_account" "data" {
name = "mydataazure"
resource_group_name = "rg1"
location = "Southeast Asia"
account_tier = "Standard"
account_replication_type = "LRS"
}
Module + Provider Alias
ส่ง provider alias เข้า module:
module "tokyo_app" {
source = "./modules/app"
providers = {
aws = aws.tokyo
}
}
ใน module:
modules/app/versions.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
configuration_aliases = [aws.tokyo]
}
}
}
Common Provider Configs
AWS
provider "aws" {
region = "ap-southeast-1"
profile = "dev"
shared_credentials_files = ["~/.aws/credentials"]
default_tags {
tags = { Environment = "dev" }
}
}
Google Cloud
provider "google" {
project = "my-project-id"
region = "asia-southeast1"
zone = "asia-southeast1-a"
credentials = file("service-account.json")
}
Azure
provider "azurerm" {
features {
resource_group {
prevent_deletion_if_contains_resources = false
}
}
}
Kubernetes
provider "kubernetes" {
config_path = "~/.kube/config"
config_context = "my-cluster"
}
สรุป
providerblock ใช้ตั้งค่า credentials + region- ห้าม hard-code credentials — ใช้ profile / env / IAM role
- Alias = ใช้ provider เดียวกันหลาย config (multi-region/account)
default_tagsใน AWS = ทาง shortcut ที่มีประโยชน์มากใน production- Multi-cloud = declare provider หลายตัวใน config เดียวกันได้
ต่อไป → Versions — เรียน version constraints