Giới thiệu
Trong bài này chúng ta sẽ tìm hiểu về một chủ đề rất thú vị là cách sử dụng Terraform để xây dựng môi trường Multi-cloud.
Điểm mạnh của Terraform so với các công cụ khác là nó giúp ta dễ dàng tạo được hạ tầng trên nhiều môi trường Cloud khác nhau. Ta sẽ làm một ví dụ tạo kết nối giữa hai Virtual Private Cloud của AWS và GCP.
Multi-cloud
Multi-cloud là cách ta sử dụng nhiều nhà cung cấp Cloud khác nhau để triển khai ứng dụng, ví dụ ta sử dụng cả AWS và GCP.
Mỗi Cloud sẽ có điểm mạnh và điểm yếu khác nhau, nên khi ta càng có nhiều lựa chọn tốt thì hệ thống của ta càng linh hoạt.
Một vài ưu điểm của Multi-cloud:
- Flexibility: bạn có thể chọn dịch vụ phù hợp nhất cho ứng dụng của bạn
- Cost savings: lựa chọn giá cả phù hợp nhất giữa các nhà cung cấp Cloud
- Resilience: sức chịu đựng cao khi hệ thống có sự cố về mặt hạ tầng
- Compliance: yếu tố nội bộ, ví dụ nếu ta phát triển ứng dụng ở Trung Quốc thì ta nên xài AliCloud
Với Terraform việc tạo hạ tầng trên nhiều môi trường Cloud khác nhau không hề khó. Terraform cung cấp cho ta các provider
phù hợp cho từng môi trường.
Ví dụ Multi-cloud
Lưu ý: đây chỉ là quan điểm cá nhân.
Ví dụ được đặt ra là ta cần xây dựng một giải pháp để thu thập hành động của khách hàng ở trên một trang thương mại điện tử với số lượng truy cập khá cao. Sau khi thu thập và tổng hợp được tất cả các hành động của khách hàng thì ta cần công cụ để xử lý dữ liệu đó.
Với yêu cầu ở trên thì hệ thống của ta sẽ có hai phần chính. Hệ thống Event Streaming và hệ thống phân tích dữ liệu. Mình sẽ chọn xây dựng hệ thống Event Streaming ở trên AWS và xây dựng hệ thống phân tích dữ liệu ở trên GCP.
Data Analysis với GCP
Tại sao nên sử dựng Google Cloud Platform cho việc phân tích dữ liệu? Nó có gì hơn AWS? Lý do mình chọn GCP cho việc phân tích dữ liệu không phải là vì các công cụ xử lý dữ liệu của GCP nó nhanh hơn hay rẻ hơn gì cả, vì mình cũng chưa có đủ kiến thức để có thể đánh giá được là hai công cụ của AWS và GCP thằng nào nhanh hơn. Mình chọn GCP vì nó phù hợp cho việc phân tích dữ liệu khách hàng. Vì Google đã đi trước trong việc phân tích dữ liệu người dùng khá lâu, Google sở hữu các dịch vụ có sẵn mà rất dễ dàng kết hợp với GCP trong việc thu thập và thống kê dữ liệu của người dùng như: Google Analysis, Gmail, Google Ads, Youtube, Google Search.
Ngoài ra các UI của các trang báo cáo dữ liệu của Google rất đẹp và dễ nhìn, phù hợp cho cả những người không chuyên về dữ liệu khi nhìn vào cũng có thể hiểu được. Mô hình ví dụ dùng GCP trong việcphân tích dữ liệu của khách hàng.
Event Streaming với AWS
Ngược lại với GCP thì AWS đi trước trong mảng Cloud khá lâu. Nên các dịch vụ dùng để xây dựng ứng dụng của AWS lại thông dụng hơn nhiều, có nhiều tài liệu, cộng đồng lớn, dễ sử dụng với nhiều công cụ IaC có sẵn. Đó là lý do mình chọn AWS cho việc xây dựng hệ thống Event Streaming. Một ví dụ cụ thể là hệ thống Kafka Cluster dành cho việc Streaming. Nếu ta tự xây dựng nó trên GCP thì sẽ mất rất nhiều công sức. Trong khi đó AWS có cung sẵn cho ta dịch vụ để xây dựng Kafka Cluster một cách dễ dàng là Amazon MSK, tội gì ta phải tự xây và quản lý một Kafka Cluster (công việc này không dễ).
Đó là lý do tại sao mình cần phải xài Multi-cloud. Nhưng ta sẽ đối mặt với một vấn đề là tất cả ứng dụng đều được đặt ở trong Private Subnet của VPC, nên bên ngoài sẽ không thể truy cập được.
Vậy thì làm sao ứng dụng của GCP có thể kết nối với AWS được và ngược lại?
Để làm được điều đó thì ta cần phải kết nối VPC của hai thằng Cloud lại với nhau, ta sẽ dùng AWS Site-to-Site VPN và Google Cloud VPN.
Tạo kết nối mạng giữa AWS và GCP
Kiến trúc
Hạ tầng ta xây dựng như sau:
Ở trên AWS và GCP ta có một VPC. Sau đó để kết nối giữa hai VPC trên thì ở AWS ta tạo Virtual Private Gateway, Site-to-Site VPN, Customer Gateway. Ở GCP ta sẽ tạo External IP, Cloud VPN. Kế tiếp ta tạo Tunnel để hai bên có thể kết nối với nhau.
Cấu hình Provider
Tạo ba tệp tin tên là main.tf
, aws.tf
, gcp.tf
.
provider "aws" {
region = "us-west-2"
}
provider "google" {
project = "hpi-111111"
region = "us-west2"
}
Để sử dụng AWS ta sẽ dùng provider aws
và để sử dụng Google Cloud ta dùng provider google
, cấu hình của Google như sau:
provider "google" {
project = <project-id>
region = <region>
}
Tạo VPC
Tiếp theo ta tạo GCP Virtual Private Cloud và AWS Virtual Private Cloud.
resource "google_compute_network" "aws_gcp" {
name = "aws-gcp"
}
data "aws_availability_zones" "available" {}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "3.14.2"
name = "aws-gcp"
cidr = "10.0.0.0/16"
azs = data.aws_availability_zones.available.names
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = true
}
GCP External IP - AWS Customer Gateway
Sau đó ta tạo GCP External IP và AWS Customer Gateway cho hai thằng VPC.
...
resource "google_compute_address" "aws_customer_gateway" {
name = "aws-customer-gateway"
}
...
resource "aws_customer_gateway" "gcp_customer_gateway" {
bgp_asn = 65000
ip_address = google_compute_address.aws_customer_gateway.address
type = "ipsec.1"
tags = {
Name = "gcp-customer-gateway"
}
}
Với ip_address
của AWS Customer Gateway ta lấy từ GCP External IP.
VPN Gateway
Tiếp đó ta tạo VPN Gateway cho GCP VPC và AWS VPC.
...
resource "google_compute_vpn_gateway" "aws_gcp" {
name = "aws-gcp"
network = google_compute_network.aws_gcp.id
}
resource "google_compute_forwarding_rule" "fr_esp" {
name = "fr-esp"
ip_protocol = "ESP"
ip_address = google_compute_address.aws_customer_gateway.address
target = google_compute_vpn_gateway.aws_gcp.id
}
resource "google_compute_forwarding_rule" "fr_udp500" {
name = "fr-udp500"
ip_protocol = "UDP"
port_range = "500"
ip_address = google_compute_address.aws_customer_gateway.address
target = google_compute_vpn_gateway.aws_gcp.id
}
resource "google_compute_forwarding_rule" "fr_udp4500" {
name = "fr-udp4500"
ip_protocol = "UDP"
port_range = "4500"
ip_address = google_compute_address.aws_customer_gateway.address
target = google_compute_vpn_gateway.aws_gcp.id
}
Chỗ này thì ta không cần hiễu kĩ lắm, phần quan trọng ta cần hiểu là ở resource google_compute_vpn_gateway
, ta sẽ chỉ định GCP VPC mà ta muốn gắn VPN Gateway này vào bằng thuộc tính network
.
...
resource "aws_vpn_gateway" "aws_gcp" {
vpc_id = module.vpc.vpc_id
tags = {
Name = "AWS-GCP"
}
}
Tương tự cho bên AWS.
GCP Cloud VPN - AWS Site-to-Site VPN
Tiếp theo ta tạo VPN để kết nối hai thằng VPC với nhau.
...
resource "google_compute_vpn_tunnel" "tunnel_1" {
name = "tunnel-1"
peer_ip = aws_vpn_connection.aws_gcp.tunnel1_address
shared_secret = aws_vpn_connection.aws_gcp.tunnel1_preshared_key
target_vpn_gateway = google_compute_vpn_gateway.aws_gcp.id
depends_on = [
google_compute_forwarding_rule.fr_esp,
google_compute_forwarding_rule.fr_udp500,
google_compute_forwarding_rule.fr_udp4500,
]
}
resource "google_compute_route" "route_1" {
name = "route-1"
network = google_compute_network.aws_gcp.name
dest_range = module.vpc.vpc_cidr_block
priority = 1000
next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel_1.id
}
Ở bên GCP ta tạo Tunnel với giá trị VPN tunnel1_address
và tunnel1_preshared_key
từ AWS.
...
resource "aws_vpn_connection" "aws_gcp" {
customer_gateway_id = aws_customer_gateway.gcp_customer_gateway.id
vpn_gateway_id = aws_vpn_gateway.aws_gcp.id
type = "ipsec.1"
static_routes_only = true
}
resource "aws_vpn_connection_route" "office" {
destination_cidr_block = "10.168.0.0/20" // fixed cidr block of gcp region on us-west-2
vpn_connection_id = aws_vpn_connection.aws_gcp.id
}
Apply
Giờ ta chạy câu lệnh apply
nào 😁.
$ terraform apply
...
Plan: 32 to add, 0 to change, 0 to destroy.
Khi Terraform chạy xong ta lên AWS và GCP kiểm tra thì sẽ thấy các tài nguyên tương ứng đã được tạo. Và để hai bên có thể dễ dàng tương tác với nhau, các bạn thêm Security Group cho cả hai bên nhé.
Security Group
Ở AWS Console ta bấm vào Security Group của VPC, chọn default
và sửa Inbound như sau:
Sau đó ta cập nhật Firewall Rule ở bên GCP để các ứng dụng của AWS có thể thoải mái truy cập tới GCP VPC. Truy cập GCP Console, bấm vào mục Firewall, chọn default-allow-internal
.
Ta thêm vào CIDR Block của AWS VPC là 10.0.0.0/16
vào. Bây giờ thì các ứng dụng của AWS và GCP của ta đã có thể nói chuyện với nhau cho dù cả hai đều nằm trong Private Network.
Kết luận
Vậy là ta đã tìm hiểu xong cách dùng Terraform để tạo môi trường Multi-cloud.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?