Một trường hợp lưu ý về VPC Peering
Hôm nay ngồi tạo VPC Peering connection, thì mình thấy có 1 case như thế này:
VPC A là VPC default, có CIDR block (sample) là 1.1.1.1/16
VPC B là VPC dev, có CIDR block là 2.2.2.2/16
VPC C là VPC stg, có CIDR block là 2.2.2.2/16 (trùng khớp từ CIDR block của VPC tới cả CIDR block của subnet với VPC dev)
Bài toán:
Giờ mình muốn VPC default vừa peering với VPC dev và VPC stg. Nhưng nếu update main route table của VPC default thì sẽ gặp vấn đề là không thể add 2 routing record vào route table cho 2 destination CIDR block giống nhau!
Giải quyết vấn đề:
Sau một lúc tìm hiểu thì mình đã tìm ra giải pháp
Có thể add thêm được 1 CIDR block cho VPC và dùng CIDR block đó cho mục đích peering.
Nhưng sau khi nghiên cứu lại solution thì mình phát hiện vấn đề như sau:
Theo như kiến trúc trong docs, thì quan hệ peering như sau: B – A – C (với A là default VPC). Nhưng ở case của mình, thì cái mình cần thêm 1 CIDR block (để tránh trùng CIDR block) lại phải là VPC B hoặc VPC C. Giả sử mình thêm cho VPC B, thì quan hệ peering sẽ như sau: A – B – C. Từ đó, A – B thì vẫn sử dụng bình thường, nhưng A – C thì không được, sẽ phải tạo 1 peering nữa.
Điều này sẽ khiến tăng cost, và làm kiến trúc infra trở lên phức tạp, khó quản lý hơn. Có một cách để giữ kiến trúc vẫn đơn giản là sử dụng transit gateway. Tuy nhiên, transit gateway thì chi phí lại khá là cao.
Giải pháp cuối cùng:
Ở case này của mình hơi đặc biệt xíu. Khách hàng yêu cầu bọn mình tạo 1 môi trường giống hệt với môi trường hiện tại. Nhưng cái oái oăm là sẽ tạo trên cùng 1 tài khoản, và cùng region luôn. Hiện tại khách hàng có 1 VPC dev đang peering với VPC default.
Nếu xét về quan điểm “clone môi trường”, mình có thể tạo ra 1 VPC nữa giống với VPC default và thực hiện peering để giống cả lông lẫn cánh! Nhưng mà từ từ đã nào, hãy nhớ lại 3 đặc điểm sau:
Chỉ có 1 VPC là default được thôi
Việc có tạo ra 1 VPC giống hệt với default không (trừ việc nó là non-default), và đặc điểm sử dụng VPC default hiện tại như nào thì chưa được khách hàng confirm
Giả sử, nếu sau này KH lại triển khai 1 hệ thống khác trên Lightsail chẳng hạn, và có nhu cầu muốn peering tới môi trường đang dùng, thì đặc điểm kỹ thuật của Lightsail là sẽ chỉ có thể peering với VPC default thôi, thì cái VPC giống default mình tạo ra nó rất là vớ vẩn! (dĩ nhiên, ngoài peering thì bạn có thể nghĩ đến phương án sử dụng VPN connnection. Tuy nhiên, có vấn đề là VPN connection sau khi được khởi tạo có thể communicate từ Lightsail instance sang các các resource ở non default VPC, nhưng không thể làm hành động ngược lại. Chi tiết xem thêm tại đây: shinchan.asia/2022/07/01/connection-between..)
Sau khi suy xét các phương án thì mình quyết định là: VPC stg mới tạo thôi, chưa sử dụng, nên cách đơn giản nhất vẫn là: xóa VPC stg đi, tạo lại với 1 CIDR block khác. Về quan điểm thiết kế và vận hành, thì việc để 2 VPC cùng 1 CIDR block sẽ rất dở hơi về nhiều mặt! Giả sử sau này bạn muốn peering dev với stg thì cũng không được, bởi vì bạn sẽ không thể peering 2 VPC có CIDR bị overlaped.
Bài học rút ra:
Với những case kiểu này, nếu dựng tay là một công cuộc đau thương, nếu dùng IaC thì xóa đi, update lại và phút mốt sẽ lên
Đừng bao giờ dở hơi để các VPC của các môi trường trên 1 tài khoản, cùng 1 region lại còn cùng cả CIDR block luôn :3 Khi nhận yêu cầu, nếu thấy có peering, hoặc là xu hướng sau này có peering là xem xét đặt khác CIDR block ngay. Dù là KH mong muốn, thấy cái thiết kế kiểu này là cũng phải claim ngay.
Phương án work around nếu lỡ việc xóa đi tạo lại quá mức căng thẳng, do đã sử dụng nhiều rồi:
Như trên đã nói rồi, bạn sẽ phải chấp nhận việc tạo 1 Peering connection nữa, hoặc là sử dụng transit gateway
Hoặc là consider sử dụng IPv6. Nếu dùng IPv6, thì sẽ không cần peering gì nữa luôn! Tuy nhiên, IPv6 thì là all public, nên sẽ có nhiều người lo ngại. Có điều, may mắn cho chúng ta là để kết nối được với resource bằng IPv6 thì client cũng phải được configure/hỗ trợ IPv6, và việc scan được host của IPv6 là có thể, nhưng sẽ mất rất nhiều thời gian. Ngoài ra còn có lý thuyết về IPSec. Tuy nhiên, với IPv6 thì việc triển khai dual stack là bắt buộc, còn IPSec thì không. Bạn hãy cân nhắc và triển khai cho phù hợp nếu dùng phương án này, cách mà IPv6 được triển khai sẽ ảnh hưởng nhiều đến structure và security sau này! Hơn nữa, bạn cũng phải consider tới việc sẽ ban IP như thế nào, khi sử dụng IPv6 nữa!