← Tổng quan series

Multi-cloud với nhiều Terraform provider

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.

Multi-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.

Xem bài nguồn Multi-cloud. Lab VPN có thể phát sinh phí và cần quyền mạng cao.