Giới thiệu
Chào các bạn tới với series về Terraform, ở bài trước chúng ta đã tìm hiểu về cách sử dụng Terraform với Jenkins. Ở bài tiếp theo 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 với 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, ở bài này chúng ta sẽ dùng Terraform để tạo connection giữa hai Virtual Private Cloud của AWS và GCP. Các bạn có thể đọc cách cấu hình bằng tay ở bài này Connect VPC Network between AWS and GCP use VPN.
Terraform and Multi Cloud
Multi-cloud là cách ta sử dụng nhiều nhà cung cấp cloud khác nhau để xây dựng hạ tầng, ví dụ ta sử dụng cả AWS và GCP cho hạ tầng.
Vì mỗi Cloud sẽ có điểm mạnh và điểm yếu khác nhau, nên khi ta có nhiều lựa chọn phù hợp thì hệ thống của ta sẽ càng mạnh mẽ.
Một vài điểm mạnh khi ta sử dụng multi-cloud:
- Flexibility: bạn có thể chọn cloud service phù hợp nhất cho ứng dụng của bạn.
- Cost savings: lựa chọn pricing models phù hợp nhất giữa các cloud vendors.
- Resilience: more resilient than single-cloud architectures.
- 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à 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 có cung cấp sẵn cho ta các provider phù hợp cho từng môi trường.
Site to Site VPN between AWS and GCP
Architecture
Hạ tầng mà ta sẽ xây như sau.
Ở trên AWS và GCP ta sẽ có một VPC, sau đó để kết nối giữa hai VPC thì ở AWS ta sẽ tạo Virtual Private Gateway, Site-to-Site VPN, Customer Gateway. Ở GCP ta sẽ tạo External IP, Cloud VPN. Sau đó ta sẽ tạo tunnel để hai bên kết nối với nhau.
Config Provider
Ok, giờ ta bắt tay vào code nào, ta tạo ba file 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
(trong series này ta đã sử dụng rất nhiều), và để sử dụng Google Cloud ta dùng provider google
. Cấu hình của provider google như sau.
provider "google" {
project = <project-id>
region = <region>
}
Create 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 and AWS Customer Gateway
Sau đó ta sẽ 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 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 and AWS Site-to-Site VPN
Tiếp theo ta sẽ tạo VPN để kết nối cả hai 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.
Sau khi Terraform chạy xong, ta lên AWS và GCP kiểm tra thì sẽ thấy các resource tương ứng đã được tạo ra. Và để hai bên có thể dễ dàng tương tác với nhau, các bạn bật Security Group cho cả hai bên nhé.
Enable Security Group
Ở AWS Console ta bấm vào Security Group của VPC, chọn default SG và sửa Inbound rules 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 memu Firewall, chọn default-allow-internal và Edit nó.
Ta thêm vào CIDR Block của AWS VPC là 10.0.0.0/16 và bấm save. 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 😁.
Github của toàn bộ series https://github.com/hoalongnatsu/terraform-series.
Kết luận
Vậy là ta đã tìm hiểu xong cách sử dụng Terraform với multi-cloud. Nếu có thắc mắc hoặc cần giải thích rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment.
Mục tìm kiếm đồng đội
Team công nghệ Hoàng Phúc của bọn mình được thành lập với nhiệm vụ là xây dựng một hệ thống công nghệ nội bộ cho công ty, Hoàng Phúc là một công ty bán lẻ trong lĩnh vực thời trang và có hơn 30 năm tuổi đời, với chuỗi cửa hàng rất nhiều trên toàn quốc, nên việc vận hành của Hoàng Phúc là rất lớn và việc xây dựng được một hệ thống công nghệ để đáp ứng việc vận hành nội bộ cho công ty là một công việc rất thử thách, đây là một quá trình chuyển đổi số và team bọn mình đã làm được những bước ban đầu.
Thứ mà team mình thấy cấn duy nhất là cái website, đây là trang web mà trước khi team mình được thành lập đã có một đội outsource khác làm, và những gì họ để lại cho bọn mình là một trang web với đống bùi nhùi, với số điểm từ google là 1 trên 100. Vậy bọn mình sẽ làm gì với trang web này đây, nản chí sao? Điều đó không có trong từ điển của hai sếp mình, và với sự dẫn dắt của hai sếp team mình sẽ biến đống website bùi nhùi đó thành kim cương, như cách bọn mình đã cải thiện hệ thống nội bộ. Bọn mình đang cải thiện trang web hằng ngày và hằng ngày, từ 1 điểm bọn mình đã cải thiện nó lên 70 điểm, và mục tiêu là trên 90 điểm.
Hiện tại team bọn mình đang cần các đồng đội tham gia để cải thiện lại trang web với số lượng người dùng truy cập khá lớn, đây là một thử thách rất thú vị, có bao giờ các bạn được tham gia thiết kế một hệ thống lớn từ đầu chưa, mình khá chắc là số lượng đó rất ít. Bọn mình đã có khách hàng, những gì còn lại là cần những đồng đội để cùng nhau phát triển một hệ thống để phục vụ rất nhiều người dùng. Mục tiêu của công ty Hoàng Phúc là trở thành nhà bán lẻ về thời trang lớn nhất Việt Nam, hãy tham gia với bọn mình nhé. Một thành viên trong team mình không yêu cần phải giỏi, chỉ cần hòa đồng, hợp tác và sẵn sàng hợp tác với nhau. Có thể bạn không là giỏi nhất nhưng nếu gia nhập với bọn mình thì bạn sẽ tạo ra được những thứ giá trị nhất.
Đồng đội Backend Engineer (Magento - PHP).
Đồng đội Senior Backend Engineer.
Đồng đội Senior Frontend Engineer.