Skip to main content

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 จาก:

  1. Environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  2. Shared credentials file (~/.aws/credentials)
  3. 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"
}

สรุป

  • provider block ใช้ตั้งค่า 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