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)
Multi-Cloud Trong Terraform Là Gì?

Multi-Cloud trong Terraform là quá trình sử dụng Terraform để triển khai và quản lý hạ tầng trên nhiều nhà cung cấp đám mây khác nhau (VD: AWS, Azure, Google Cloud Platform – GCP) trong cùng một cấu hình. Điều này giúp tăng tính linh hoạt, giảm phụ thuộc vào một nhà cung cấp, và tối ưu chi phí hoặc hiệu suất. Terraform hỗ trợ Multi-Cloud thông qua việc cấu hình nhiều provider, quản lý tài nguyên riêng lẻ cho từng nền tảng, và đồng bộ hóa state. Đây là một kỹ năng nâng cao liên quan đến kỳ thi Terraform Associate (003), tập trung vào mục tiêu 7 (Read, Generate, and Modify Configuration).
Tại Sao Sử Dụng Terraform Cho Multi-Cloud?
- Linh hoạt hơn: Kết hợp lợi thế của nhiều nhà cung cấp (VD: AWS cho tính toán, Azure cho AI).
- Giảm rủi ro: Tránh phụ thuộc vào một nhà cung cấp duy nhất.
- Tối ưu chi phí: Chọn nhà cung cấp có giá tốt nhất cho từng dịch vụ.
- Quản lý tập trung: Sử dụng một công cụ duy nhất (Terraform) để quản lý tất cả hạ tầng.
- Tích hợp dễ dàng: Hỗ trợ các provider của AWS, Azure, GCP, và hơn thế nữa.
Cách Triển Khai Hạ Tầng Multi-Cloud Với Terraform
Cấu Hình Nhiều Provider
Terraform cho phép khai báo nhiều provider với các thông tin xác thực khác nhau.
-
Ví dụ:
provider "aws" { region = "us-east-1" access_key = var.aws_access_key secret_key = var.aws_secret_key } provider "azurerm" { features {} subscription_id = var.azure_subscription_id client_id = var.azure_client_id client_secret = var.azure_client_secret tenant_id = var.azure_tenant_id }
- Ý nghĩa: Mỗi provider được cấu hình với thông tin xác thực riêng để kết nối với AWS và Azure.
Quản Lý Tài Nguyên Multi-Cloud
- Sử dụng provider cụ thể để tạo tài nguyên trên từng nền tảng.
-
Ví dụ:
resource "aws_instance" "aws_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "AWSServer" } } resource "azurerm_virtual_machine" "azure_server" { name = "azurevm" location = "eastus" resource_group_name = azurerm_resource_group.rg.name vm_size = "Standard_B1s" network_interface_ids = [azurerm_network_interface.ni.id] os_profile { computer_name = "azurevm" admin_username = "adminuser" admin_password = var.azure_admin_password } os_profile_linux_config { disable_password_authentication = false } storage_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "16.04-LTS" version = "latest" } } resource "azurerm_resource_group" "rg" { name = "my-resource-group" location = "eastus" } resource "azurerm_network_interface" "ni" { name = "nic" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "internal" subnet_id = azurerm_subnet.sn.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_virtual_network" "vn" { name = "vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_subnet" "sn" { name = "subnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vn.name address_prefixes = ["10.0.1.0/24"] }
Đồng Bộ State Multi-Cloud
- Sử dụng remote state trên một nền tảng (VD: S3 trên AWS) để quản lý trạng thái của tất cả tài nguyên.
- File
main.tf
:terraform { backend "s3" { bucket = "my-terraform-state" key = "state/multi-cloud.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" encrypt = true } }
- Ý nghĩa: State tập trung giúp theo dõi tài nguyên trên cả AWS và Azure.
Ví Dụ Thực Tế: Triển Khai Multi-Cloud AWS và Azure
-
File
variables.tf
:variable "aws_access_key" { type = string } variable "aws_secret_key" { type = string } variable "azure_subscription_id" { type = string } variable "azure_client_id" { type = string } variable "azure_client_secret" { type = string } variable "azure_tenant_id" { type = string } variable "azure_admin_password" { type = string }
-
File
main.tf
:terraform { backend "s3" { bucket = "my-terraform-state" key = "state/multi-cloud.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" encrypt = true } } provider "aws" { region = "us-east-1" access_key = var.aws_access_key secret_key = var.aws_secret_key } provider "azurerm" { features {} subscription_id = var.azure_subscription_id client_id = var.azure_client_id client_secret = var.azure_client_secret tenant_id = var.azure_tenant_id } resource "aws_instance" "aws_server" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "AWSServer" } } resource "azurerm_resource_group" "rg" { name = "my-resource-group" location = "eastus" } resource "azurerm_virtual_network" "vn" { name = "vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_subnet" "sn" { name = "subnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vn.name address_prefixes = ["10.0.1.0/24"] } resource "azurerm_network_interface" "ni" { name = "nic" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "internal" subnet_id = azurerm_subnet.sn.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_virtual_machine" "azure_server" { name = "azurevm" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name vm_size = "Standard_B1s" network_interface_ids = [azurerm_network_interface.ni.id] os_profile { computer_name = "azurevm" admin_username = "adminuser" admin_password = var.azure_admin_password } os_profile_linux_config { disable_password_authentication = false } storage_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "16.04-LTS" version = "latest" } } output "aws_instance_id" { value = aws_instance.aws_server.id } output "azure_vm_id" { value = azurerm_virtual_machine.azure_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"... - Finding hashicorp/azurerm versions matching "~> 3.0"... - Installing hashicorp/aws v5.17.0... - Installed hashicorp/aws v5.17.0 (signed by HashiCorp) - Installing hashicorp/azurerm v3.87.0... - Installed hashicorp/azurerm v3.87.0 (signed by HashiCorp) Terraform has been successfully initialized!
- Áp dụng cấu hình (sau khi đặt biến môi trường hoặc file
terraform.tfvars
):- File
terraform.tfvars
:aws_access_key = "AKIAIOSFODNN7EXAMPLE" aws_secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" azure_subscription_id = "00000000-0000-0000-0000-000000000000" azure_client_id = "11111111-1111-1111-1111-111111111111" azure_client_secret = "secret123" azure_tenant_id = "22222222-2222-2222-2222-222222222222" azure_admin_password = "SecurePassword123!"
terraform apply -auto-approve
Output:
aws_instance.aws_server: Creating... azurerm_resource_group.rg: Creating... azurerm_resource_group.rg: Creation complete after 2s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group] azurerm_virtual_network.vn: Creating... azurerm_virtual_network.vn: Creation complete after 3s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Network/virtualNetworks/vnet] azurerm_subnet.sn: Creating... azurerm_subnet.sn: Creation complete after 2s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Network/virtualNetworks/vnet/subnets/subnet] azurerm_network_interface.ni: Creating... azurerm_network_interface.ni: Creation complete after 2s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Network/networkInterfaces/nic] azurerm_virtual_machine.azure_server: Creating... aws_instance.aws_server: Creation complete after 45s [id=i-1234567890abcdef0] azurerm_virtual_machine.azure_server: Creation complete after 90s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Compute/virtualMachines/azurevm] Apply complete! Resources: 6 added, 0 changed, 0 destroyed. Outputs: aws_instance_id = "i-1234567890abcdef0" azure_vm_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Compute/virtualMachines/azurevm"
- File
- Kiểm tra tài nguyên:
- EC2 instance trên AWS Console ở
us-east-1
. - Virtual Machine trên Azure Portal ở
eastus
.
- EC2 instance trên AWS Console ở
- Khởi tạo backend:
Lưu Ý Quan Trọng Khi Triển Khai Multi-Cloud
- Xác thực an toàn: Sử dụng biến môi trường hoặc secret management thay vì hardcode credentials.
- Khác biệt API: Mỗi nhà cung cấp có API và tài nguyên khác nhau, cần đọc tài liệu provider (VD: AWS vs Azure).
- Chi phí quản lý: Multi-Cloud có thể tăng chi phí quản lý và phức tạp.
- Đồng bộ state: Sử dụng một backend (VD: S3) để tránh xung đột state giữa các nhà cung cấp.
- Kiểm tra độ trễ: Đảm bảo kết nối giữa các tài nguyên Multi-Cloud không gây độ trễ lớn.
Liên Hệ Với Chứng Chỉ Terraform Associate (003)
Kỳ thi Terraform Associate (003) không kiểm tra trực tiếp triển khai Multi-Cloud, nhưng hiểu cách cấu hình và quản lý nhiều provider sẽ giúp bạn áp dụng kiến thức thực tiễn vào mục tiêu 7 và 8. Bạn cần nắm:
- Khái niệm liên quan:
- Cấu hình nhiều provider với alias hoặc thông tin xác thực riêng.
- Quản lý tài nguyên đa nền tảng.
- Thực hành: Biết cách triển khai Multi-Cloud sẽ giúp bạn xử lý tốt hơn trong các tình huống thực tế.
Kết Luận
Triển khai hạ tầng Multi-Cloud với Terraform giúp tận dụng lợi thế của nhiều nhà cung cấp, tăng tính linh hoạt và giảm rủi ro. Sử dụng nhiều provider, quản lý tài nguyên riêng lẻ, và đồng bộ state sẽ giúp bạn xây dựng hệ thống mạnh mẽ. Dù không phải trọng tâm của kỳ thi Terraform Associate (003), kỹ năng này rất hữu ích trong thực tế. Ở bài tiếp theo, chúng ta sẽ tổng kết series và chuẩn bị cho kỳ thi.