Danh sách bài viết trong series Terraform Associate (003)
- Bài 0: Giới Thiệu Series Và Tổng Quan Về Chứng Chỉ Terraform Associate (003)
- Bài 1: Terraform Là Gì? Tổng Quan Và Vai Trò Trong IaC
- Bài 2: Cài Đặt Terraform Trên Các Hệ Điều Hành
- Bài 3: Terraform Workflow: Init, Plan, Apply, Destroy
- Bải 4: Terraform CLI Nâng Cao: Lệnh Taint, Import, Refresh
- Bài 5: Quản Lý Provider Trong Terraform
- Bài 6: Quản Lý Resource Trong Terraform
- Bài 7: Sử Dụng Biến (Variables) Trong Terraform
- Bài 8: Sử Dụng Output Trong Terraform
- Bài 9: Hiểu Terraform State Quản Lý Trạng Thái Hạ Tầng
- Bài 10: Sử Dụng Remote State Với Backend Như S3 Trong Terraform
- Bài 11: Terraform Workspace Quản Lý Nhiều Môi Trường
- Bài 12: Terraform Module: Mô-đun Hóa Cấu Hình
- Bài 13: Terraform Data Sources Truy Vấn Thông Tin Hạ Tầng
- Bài 14: Quản Lý Vòng Đời Tài Nguyên Với Terraform
- Bài 15: Tự Động Hóa Và Tích Hợp CI/CD Với Terraform
- Bài 16: Xử Lý Lỗi Và Debug Trong Terraform
- Bài 17: Tối Ưu Hóa Hiệu Suất Với Terraform
- Bài 18: Bảo Mật Cấu Hình Terraform
- Bài 19: Triển Khai Hạ Tầng Đa Vùng Với Terraform
- Bài 20: Triển Khai Hạ Tầng Serverless Với Terraform
- Bài 21: Triển Khai Hạ Tầng Container Với Terraform (ECS, EKS)
- Bài 22: Triển Khai Hạ Tầng Multi-Cloud Với Terraform
- Bài 23: Tổng Kết Series Và Chuẩn Bị Cho Kỳ Thi Terraform Associate (003)
Remote State Trong Terraform Là Gì?

Remote State trong Terraform là cơ chế lưu trữ file trạng thái (terraform.tfstate
) trên một dịch vụ từ xa (remote backend) thay vì lưu cục bộ. Các backend phổ biến bao gồm AWS S3, Google Cloud Storage, Azure Blob Storage, hoặc Terraform Cloud. Remote State giúp đồng bộ trạng thái giữa các thành viên trong nhóm, tăng cường bảo mật, và hỗ trợ quản lý hạ tầng quy mô lớn. Việc hiểu và cấu hình Remote State là kỹ năng quan trọng được kiểm tra trong kỳ thi Terraform Associate (003), liên quan đến mục tiêu 6 (Implement and Maintain State).
Vai Trò Của Remote State Trong Quản Lý Hạ Tầng
Remote State đóng vai trò quan trọng trong quản lý hạ tầng:
- Hợp tác nhóm: Nhiều người có thể làm việc trên cùng state mà không bị xung đột, nhờ khóa state (state locking).
- Bảo mật: Lưu state trong dịch vụ như S3 với mã hóa và kiểm soát truy cập.
- Khả năng chịu lỗi: Remote State tránh mất dữ liệu khi máy cục bộ hỏng.
- Tích hợp CI/CD: Dễ dàng tích hợp với pipeline tự động hóa (VD: Jenkins, GitHub Actions).
- Quản lý phiên bản: Một số backend (VD: S3 với versioning) cho phép theo dõi lịch sử state.
Cấu Hình Remote State Với Backend
Khái Niệm Về Backend
Backend là nơi lưu trữ và quản lý file terraform.tfstate
. Terraform hỗ trợ nhiều backend như:
- Local Backend: Lưu state cục bộ (mặc định).
- Remote Backend: Lưu state trên dịch vụ từ xa (VD: S3, Terraform Cloud).
- Cấu hình backend trong block
terraform
trong file.tf
:terraform { backend "s3" { bucket = "my-terraform-state" key = "state/terraform.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" encrypt = true } }
Cấu Hình Backend Với AWS S3
- Yêu cầu trước:
- Tạo S3 bucket (VD:
my-terraform-state
). - Tạo DynamoDB table (VD:
terraform-locks
) để khóa state. - Cấu hình IAM policy cho quyền truy cập S3 và DynamoDB.
- Tạo S3 bucket (VD:
-
File
main.tf
:terraform { backend "s3" { bucket = "my-terraform-state" key = "dev/terraform.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" encrypt = true } } provider "aws" { region = "us-east-1" access_key = "YOUR_ACCESS_KEY" secret_key = "YOUR_SECRET_KEY" } resource "aws_instance" "web_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "WebServer" } } output "instance_id" { value = aws_instance.web_server.id }
- Khởi tạo backend:
- Input:
terraform init
- Output:
Initializing the backend... Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... Finding hashicorp/aws versions matching "~> 5.0"... Installing hashicorp/aws v5.17.0... Installed hashicorp/aws v5.17.0 (signed by HashiCorp) Terraform has been successfully initialized!
- Input:
- Áp dụng cấu hình:
- Input:
terraform apply -auto-approve
- Output:
aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-1234567890abcdef0] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: instance_id = "i-1234567890abcdef0"
- Input:
Cấu Hình Backend Với Terraform Cloud
- Yêu cầu trước:
- Đăng ký tài khoản Terraform Cloud.
- Tạo workspace (VD:
my-workspace
).
-
File
main.tf
:terraform { backend "remote" { hostname = "app.terraform.io" organization = "your-organization" workspaces { name = "my-workspace" } } } provider "aws" { region = "us-east-1" access_key = "YOUR_ACCESS_KEY" secret_key = "YOUR_SECRET_KEY" } resource "aws_instance" "web_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "WebServer" } } output "instance_id" { value = aws_instance.web_server.id }
- Khởi tạo backend:
- Input:
terraform init
- Output:
Initializing the backend... Successfully configured the backend "remote"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... Finding hashicorp/aws versions matching "~> 5.0"... Installing hashicorp/aws v5.17.0... Installed hashicorp/aws v5.17.0 (signed by HashiCorp) Terraform has been successfully initialized!
- Input:
- Áp dụng cấu hình: Thực hiện qua giao diện Terraform Cloud hoặc CLI với token xác thực.
Quản Lý Remote State
Khởi Tạo Remote State
- Input: Chạy
terraform init
lần đầu với backend mới. - Output: Xác nhận backend được cấu hình thành công (như trên).
- Lưu ý: Nếu state đã tồn tại cục bộ, dùng
terraform init -migrate-state
để di chuyển sang remote.
Cập Nhật Và Đồng Bộ State
- Input:
terraform refresh
- Output (giả sử IP EC2 thay đổi):
aws_instance.web_server: Refreshing state... [id=i-1234567890abcdef0] [Updated public_ip from "54.123.45.67" to "54.123.45.68"] No changes. Your infrastructure matches the configuration.
- Ý nghĩa: State trên S3 được cập nhật.
Xử Lý Xung Đột State
- Tình huống: Hai người cùng sửa state.
- Giải pháp: Sử dụng khóa state (state locking) với DynamoDB.
- Output khi xung đột:
Error: Error locking state: Lock ID: s3-xxxxx Advice: Another operation is in progress. Please retry later.
- Hành động: Chờ hoặc sử dụng
terraform force-unlock
với ID khóa (cẩn thận).
Ví Dụ Thực Tế: Sử Dụng Remote State Với S3
-
File
main.tf
:terraform { backend "s3" { bucket = "my-terraform-state" key = "dev/terraform.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" encrypt = true } } provider "aws" { region = "us-east-1" access_key = "YOUR_ACCESS_KEY" secret_key = "YOUR_SECRET_KEY" } resource "aws_s3_bucket" "data_bucket" { bucket = "my-app-data-20230518" tags = { Name = "DataBucket" } } resource "aws_instance" "web_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "WebServer" } depends_on = [aws_s3_bucket.data_bucket] } output "bucket_name" { value = aws_s3_bucket.data_bucket.bucket } output "instance_id" { value = aws_instance.web_server.id }
- Quy trình:
- Khởi tạo backend:
terraform init
Output:
Initializing the backend... Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... Finding hashicorp/aws versions matching "~> 5.0"... Installing hashicorp/aws v5.17.0... Installed hashicorp/aws v5.17.0 (signed by HashiCorp) Terraform has been successfully initialized!
- Áp dụng cấu hình:
terraform apply -auto-approve
Output:
aws_s3_bucket.data_bucket: Creating... aws_s3_bucket.data_bucket: Creation complete after 5s [id=my-app-data-20230518] aws_instance.web_server: Creating... aws_instance.web_server: Creation complete after 45s [id=i-1234567890abcdef0] Apply complete! Resources: 2 added, 0 changed, 0 destroyed. Outputs: bucket_name = "my-app-data-20230518" instance_id = "i-1234567890abcdef0"
- Xem state trên S3: File
dev/terraform.tfstate
sẽ chứa trạng thái mới. - Cập nhật state:
terraform refresh
Output:
aws_s3_bucket.data_bucket: Refreshing state... [id=my-app-data-20230518] aws_instance.web_server: Refreshing state... [id=i-1234567890abcdef0] No changes. Your infrastructure matches the configuration.
- Khởi tạo backend:
Bảo Mật Và Tối Ưu Hóa Remote State
- Mã hóa: Sử dụng
encrypt = true
trong S3 để bảo vệ state. - Kiểm soát truy cập: Áp dụng IAM policy để giới hạn quyền truy cập vào bucket S3.
- Phiên bản hóa: Bật versioning trên S3 để theo dõi lịch sử state.
- Khóa state: Sử dụng DynamoDB để tránh xung đột trong nhóm làm việc.
Lưu Ý Quan Trọng Khi Sử Dụng Remote State
- Kiểm tra quyền truy cập: Đảm bảo tài khoản AWS có quyền đọc/ghi vào S3 và DynamoDB.
- Di chuyển cẩn thận: Khi đổi backend, dùng
terraform init -migrate-state
để tránh mất state. - Tránh hardcode: Không đặt access key trực tiếp trong file
.tf
, dùng biến môi trường (VD:AWS_ACCESS_KEY_ID
). - Xử lý lỗi: Nếu
init
báo lỗi “Access Denied”, kiểm tra IAM policy hoặc cấu hình S3. - Sao lưu định kỳ: Dù dùng remote state, sao lưu thủ công vào nơi an toàn.
Liên Hệ Với Chứng Chỉ Terraform Associate (003)
Kỳ thi Terraform Associate (003) kiểm tra khả năng cấu hình và quản lý remote state. Bạn cần nắm:
- Câu hỏi mẫu:
- “Backend nào thường dùng để lưu remote state?”
Đáp án: AWS S3, Terraform Cloud. - “Lệnh nào khởi tạo remote backend?”
Đáp án:terraform init
. - “Cách cấu hình backend S3 là gì?”
Đáp án: Sử dụng blockbackend "s3" { bucket = "..." key = "..." region = "..." }
.
- “Backend nào thường dùng để lưu remote state?”
- Thực hành: Kỳ thi có thể yêu cầu nhận diện cấu hình backend hoặc dự đoán output khi khởi tạo remote state.
Kết Luận
Sử dụng Remote State với backend như S3 hoặc Terraform Cloud giúp quản lý trạng thái hạ tầng hiệu quả, an toàn, và hợp tác. Hiểu cách cấu hình, quản lý, và bảo mật remote state, cùng với thực hành thực tế, sẽ giúp bạn tự tin thi đỗ Terraform Associate (003). Ở bài tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng Terraform Workspace để quản lý nhiều môi trường.