Cấu trúc module Terraform cho Proxmox và AWS
Bước đầu tiên là tổ chức dự án Terraform theo mô hình modular để tách biệt logic giữa Proxmox và AWS. Việc này giúp tái sử dụng code và dễ dàng quản lý trạng thái (state) riêng biệt cho từng cloud.
Tạo cấu trúc thư mục chuẩn. Thư mục modules chứa logic chung, thư mục env chứa cấu hình cụ thể cho từng môi trường, và thư mục data chứa biến đầu vào.
mkdir -p terraform-hybrid/modules/{proxmox,aws}
mkdir -p terraform-hybrid/env/prod
mkdir -p terraform-hybrid/data
cd terraform-hybrid
Kết quả mong đợi: Cấu trúc thư mục được tạo thành công, sẵn sàng cho việc viết code.
Thiết kế module Proxmox
Module Proxmox sẽ chịu trách nhiệm tạo một VM Linux với cấu hình mạng cơ bản. Chúng ta sử dụng provider telmich/proxmox (hoặc telmich/proxmox-cloud tùy phiên bản, ở đây dùng telmich/proxmox chuẩn cho PVE 7/8).
Viết file terraform.tfvars cho Proxmox để định nghĩa biến đầu vào cần thiết như CPU, RAM, OS template path.
cat > modules/proxmox/variables.tf
Viết file main.tf cho module Proxmox. Lưu ý sử dụng proxmox_virtual_environment_vm và cấu hình network_device để gắn thẻ IP tĩnh hoặc DHCP.
cat > modules/proxmox/main.tf
Kết quả mong đợi: Module Proxmox hoàn chỉnh, có khả năng tạo VM, cấu hình Cloud-Init và xuất ra IP address.
Thiết kế module AWS
Module AWS sẽ tạo một EC2 instance tương đương để đảm bảo tính đồng nhất. Chúng ta sẽ dùng amazon provider.
cat > modules/aws/variables.tf
cat > modules/aws/main.tf
Kết quả mong đợi: Module AWS hoàn chỉnh, có Security Group mở cổng SSH từ các dải IP nội bộ (On-premise) để chuẩn bị cho VPN.
Tạo VM Linux trên Proxmox và EC2 trên AWS đồng thời
Sau khi có module, bước tiếp theo là tạo file cấu hình chính (main.tf) trong thư mục môi trường (env/prod) để gọi các module trên và khai báo state file.
Cấu hình Provider và State Backend
Tạo file providers.tf để khai báo provider Proxmox và AWS. Để đơn giản cho phần demo, ta dùng state file local (terraform.tfstate) cho Proxmox và S3 cho AWS (giả định bucket đã có sẵn).
cat > env/prod/providers.tf
Thay đổi password Proxmox bằng biến môi trường để bảo mật.
export PM_PASSWORD="YOUR_PVE_PASSWORD"
export AWS_ACCESS_KEY_ID="YOUR_AWS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET"
export AWS_DEFAULT_REGION="ap-southeast-1"
Chỉnh sửa file providers.tf để dùng biến môi trường thay vì hardcode password.
sed -i 's/YOUR_PVE_PASSWORD/\${PM_PASSWORD}/g' env/prod/providers.tf
File cấu hình triển khai (main.tf)
File này sẽ gọi module Proxmox để tạo VM pve-node-01 và module AWS để tạo VM aws-node-01.
cat > env/prod/main.tf
Thực thi lệnh terraform init để tải provider và module.
cd env/prod
terraform init
Kiểm tra plan trước khi apply.
terraform plan
Apply để tạo hạ tầng.
terraform apply
Kết quả mong đợi: Terraform sẽ tạo 1 VM trên Proxmox và 1 EC2 trên AWS. Sau khi hoàn tất, terminal hiển thị Apply complete! và output ra IP của cả 2 máy.
Verify kết quả
Truy cập SSH vào Proxmox VM (cần biết IP từ output hoặc console Proxmox) và kiểm tra file test.
ssh -i ~/.ssh/my-hybrid-key admin@
cat /tmp/hybrid_test.txt
Kết quả: Hiển thị nội dung Hello from Proxmox.
Truy cập SSH vào AWS EC2 và kiểm tra file test.
ssh -i ~/.ssh/my-hybrid-key ubuntu@
cat /tmp/hybrid_test.txt
Kết quả: Hiển thị nội dung Hello from AWS.
Cấu hình mạng liên kết (Site-to-Site VPN) giữa Proxmox và AWS VPC
Để 2 VM có thể ping nhau qua private IP, ta cần tạo đường hầm VPN. Cách phổ biến nhất và dễ tích hợp Terraform là dùng aws_vpc_peering_connection nếu Proxmox chạy trên AWS (không đúng trường hợp này) hoặc dùng aws_customer_gateway kết hợp với aws_vpn_gateway (Site-to-Site VPN) nếu Proxmox là on-premise.
Tuy nhiên, để đơn giản và nhanh chóng trong môi trường Hybrid Demo, ta sẽ giả lập bằng cách tạo một aws_vpc_peering_connection giữa VPC AWS và một VPC ảo trên Proxmox (nếu Proxmox có VPC router) HOẶC dùng giải pháp aws_customer_gateway thực tế.
Ở đây, ta chọn giải pháp chuẩn Site-to-Site VPN (IPsec) để mô phỏng môi trường thực tế nhất. Proxmox sẽ đóng vai trò Customer Gateway (CGW), AWS đóng vai trò Virtual Private Gateway (VGW).
Tài nguyên VPN trên AWS
Tạo module con cho VPN trong thư mục modules/aws hoặc file riêng. Ở đây ta thêm vào file main.tf của module AWS hoặc tạo module riêng. Để dễ quản lý, ta tạo module modules/aws-vpn.
mkdir -p modules/aws-vpn
cat > modules/aws-vpn/variables.tf
cat > modules/aws-vpn/main.tf
Tích hợp vào môi trường chính
Cập nhật file env/prod/main.tf để gọi module VPN và khai báo Public IP của Proxmox.
cat >> env/prod/main.tf
Chạy terraform apply để tạo cấu hình VPN trên AWS.
cd env/prod
terraform apply
Kết quả mong đợi: AWS tạo Customer Gateway, Virtual Private Gateway và kết nối VPN. Output hiển thị 2 IP tunnel bên trong.
Cấu hình trên Proxmox (StrongSwan)
Terraform đã tạo cấu hình trên AWS. Bây giờ cần cấu hình Proxmox để bắt kết nối này. Ta sẽ dùng strongswan trên Proxmox.
Truy cập SSH vào Proxmox VM hoặc trực tiếp vào Proxmox Node (Host) để cài đặt StrongSwan. Giả sử ta cấu hình trên Proxmox Host.
apt update && apt install -y strongswan
Tạo file cấu hình ipsec.conf trên Proxmox.
cat > /etc/ipsec.conf
Tạo file ipsec.secrets chứa Pre-Shared Key (PSK). Lưu ý: PSK này phải giống với cấu hình trên AWS (AWS Console > VPN > Edit > Add Pre-Shared Key).
cat > /etc/ipsec.secrets
Khởi động lại dịch vụ StrongSwan.
systemctl restart strongswan
ipsec statusall
Kết quả mong đợi: ipsec statusall hiển thị connection pve-aws-vpn ở trạng thái INSTALLED hoặc CONNECTED.
Configure Routing trên AWS
Để AWS biết đường quay lại Proxmox, ta cần thêm route trong Route Table của VPC AWS trỏ về Virtual Private Gateway.
cat > env/prod/route.tf
Cập nhật module aws-vpn/main.tf để xuất vgw_id.
echo 'output "vgw_id" { value = aws_virtual_private_gateway.vgw.id }' >> modules/aws-vpn/main.tf
Chạy terraform apply để áp dụng route.
cd env/prod
terraform apply
Kết quả mong đợi: Route table AWS được cập nhật, traffic từ AWS VPC đến 10.0.0.0/8 sẽ đi qua VPN Gateway.
Kiểm tra kết nối mạng và truy cập chéo giữa các môi trường
Sau khi VPN đã lên và Route đã cấu hình, bước cuối cùng là verify tính thông suốt của mạng Hybrid.
Test từ Proxmox VM sang AWS EC2
Trên VM Proxmox (pve-node-01), ping vào Private IP của EC2 (aws-node-01).
ssh admin@
ping -c 4
# Ví dụ: ping -c 4 172.31.0.50
Kết quả mong đợi: PING (172.31.0.50) 56(84) bytes of data. và 4 packets transmitted, 4 received. Nếu không ping được, kiểm tra Security Group của EC2 đã mở ICMP chưa.
Test từ AWS EC2 sang Proxmox VM
Trên EC2 (aws-node-01), ping vào Private IP của VM Proxmox.
ssh -i ~/.ssh/my-hybrid-key ubuntu@
ping -c 4
# Ví dụ: ping -c 4 10.0.0.50
Kết quả mong đợi: Tương tự như trên, ping thành công.
Test truy cập chéo (Cross-Cloud Access)
Để chứng minh khả năng Hybrid, ta sẽ chạy một lệnh từ Proxmox VM để truy cập vào một dịch vụ giả lập trên EC2 (ví dụ: SSH hoặc HTTP nếu có web server).
Trên EC2, mở một port SSH (22) từ Proxmox Network (đã cấu hình trong Security Group). Nếu chưa có, tạo một file test mới.
ssh -i ~/.ssh/my-hybrid-key ubuntu@
echo "Connected from Proxmox via VPN" > /tmp/hybrid-cross-test.txt
Trên Proxmox VM, SSH vào EC2 qua Private IP.
ssh -i ~/.ssh/my-hybrid-key ubuntu@
cat /tmp/hybrid-cross-test.txt
Kết quả mong đợi: Kết nối SSH thành công qua đường hầm VPN và hiển thị nội dung file test.
Verify State và Infrastructure
Chạy lệnh terraform show để xem toàn bộ tài nguyên đã được quản lý.
cd env/prod
terraform show
Kết quả mong đợi: Hiển thị đồ thị phụ thuộc (dependency graph) giữa Proxmox VM, AWS VM, AWS VPN Gateway và các Route Table, xác nhận hạ tầng Hybrid đã được Terraform quản lý hoàn chỉnh.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Multi-Cloud Hybrid với Terraform, Crossplane và GitOps trên hạ tầng Proxmox và AWS
« Phần 2: Cài đặt và cấu hình Terraform trên Proxmox
Phần 4: Giới thiệu Crossplane: Cài đặt và tích hợp với Kubernetes »