Bài giảng: hiểu luồng trước khi chạy lệnh
Bài toán: Cấu hình AWS và GCP trong cùng project, hiểu provider alias và thiết kế kết nối mạng thay vì chỉ copy hai resource.
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
terraform plan -destroy
terraform destroyMulti-cloud là bài toán kiến trúc
Dùng hai provider trong một file không làm hệ thống tự động “highly available”. Multi-cloud có thể để tận dụng dịch vụ, đáp ứng yêu cầu địa lý hoặc giảm phụ thuộc nhà cung cấp, nhưng kéo theo IAM, networking, observability, DNS, dữ liệu và kỹ năng vận hành phức tạp hơn.
Khai báo provider rõ ràng
terraform {
required_providers {
aws = { source = "hashicorp/aws", version = "~> 6.0" }
google = { source = "hashicorp/google", version = "~> 6.0" }
}
}
provider "aws" {
region = "ap-southeast-1"
}
provider "google" {
project = var.gcp_project
region = "asia-southeast1"
}
Nếu có nhiều account/region, alias giúp tránh nhầm:
provider "aws" {
alias = "dr"
region = "us-west-2"
}
resource "aws_vpc" "dr" {
provider = aws.dr
cidr_block = "10.60.0.0/16"
}
Kết nối AWS và GCP
Một bài lab có thể tạo VPC trên mỗi cloud, Cloud VPN/HA VPN, customer gateway, tunnel và route. Hãy thiết kế CIDR không overlap trước:
AWS VPC: 10.10.0.0/16
GCP VPC: 10.20.0.0/16
Nếu cả hai bên cùng dùng 10.0.0.0/8, route không biết gửi traffic đi đâu. Các giá trị như public IP, BGP ASN và tunnel secret phải lấy qua variable/secret manager, không commit plaintext.
Apply theo dependency
VPN cần IP gateway và network đã tồn tại. Terraform tự dựng dependency khi có tham chiếu output, nhưng các kết nối cloud đôi khi cần chờ trạng thái eventual consistency. Kiểm tra provider resource và dùng timeout phù hợp; tránh sleep provisioner để che một dependency sai.
Security group/firewall
Chỉ mở CIDR/port cần thiết. “Cho phép 0.0.0.0/0 để test” thường bị bỏ quên. Sau khi tunnel hoạt động, kiểm tra route table, firewall rule, MTU và flow logs từ cả hai phía.
Ví dụ contract cross-cloud
Thay vì để mọi resource tham chiếu chéo lẫn nhau, tạo output nhỏ ở mỗi root/module:
# AWS
output "aws_service_cidr" { value = aws_vpc.main.cidr_block }
# GCP: nếu cần CIDR, output subnetwork.ip_cidr_range thay vì network name.
output "gcp_service_network" { value = google_compute_network.app.name }
Sau đó dùng một file contract/versioned input để team biết CIDR, DNS zone, service endpoint và owner của từng phía. Với dữ liệu, quyết định “replicate hay active/passive” phải được chốt trước khi tạo network; Terraform không giải quyết conflict của database hoặc khác biệt IAM giữa cloud.
Hãy đo thời gian và tỷ lệ lỗi cross-cloud trước khi đưa traffic thật. Một kiến trúc multi-cloud chỉ có giá trị khi team có runbook cho mất một cloud, credential bị revoke, tunnel down và DNS failover.
Khi nào không nên dùng một root module?
Nếu hai cloud có vòng đời, team và quyền khác nhau, tách thành hai root module với contract rõ có thể an toàn hơn. Dùng một state chung cho mọi cloud khiến blast radius lớn; backend key và approval nên phản ánh ranh giới vận hành.
Expected state và blast-radius drills
Bắt đầu plan-only với provider aliases/account/project/region được in ra và xác nhận bằng identity API read-only. Expected state là mỗi resource gắn đúng provider alias, CIDR AWS/GCP không overlap, contract output versioned, không có credential/tunnel secret trong code và apply plan không tạo VPN/cross-cloud charge ngoài approval.
Thực hiện các drill:
- Cố ý gán resource DR vào provider default thay vì alias, đọc plan/provider identity và sửa trước apply; kiểm tra cả account/project/region.
- Nhập CIDR overlap, route/ASN/port sai hoặc tunnel dependency chưa ready, phân loại plan validation/provider/API eventual consistency/network runtime; không dùng sleep provisioner để che lỗi.
- Mô phỏng một provider credential bị revoke hoặc VPN/tunnel down, ghi partial state/rollback/runbook và xác định owner từng cloud; không rerun full apply mù.
- So sánh một root state chung với hai root module/contract versioned, đánh giá approval/backend key/secret boundary, flow logs/MTU/DNS failover và teardown cost.
Quality gate
Pass khi provider alias/account isolation được chứng minh, CIDR/route/firewall/DNS/MTU contract rõ, credentials/tunnel secrets an toàn, cross-cloud dependency/partial failure có runbook, backend/approval blast radius phù hợp và pricing/cleanup được review. Hai provider trong một file không tự tạo HA hay failover.