หนึ่งในเคสพื้นฐานที่สุดเวลาใช้ server บน cloud ก็คือ
“อยากให้เครื่องออกอินเตอร์เน็ตได้ แต่ไม่อยากเปิด public IP”
บทความนี้จะสรุปเปรียบเทียบวิธีมาตรฐานที่ AWS และ GCP ใช้แก้ปัญหานี้ แบบภาพรวม
จุดประสงค์ของบทความคือเพื่อเห็นภาพรวมคร่าวๆ และจะละรายละเอียดส่วนที่คิดว่าไม่จำเป็นต้องลงรายละเอียด
เป้าหมาย
ต้องการให้ server สื่อสารกับอินเตอร์เน็ตได้ (HTTP/HTTPS) แต่ไม่ต้องการเปิด public IP
แนวคิดหลัก
Inbound Traffic
ในเคสนี้เราจะใช้ Load Balancer เป็นทางเข้าสำหรับรับ traffic จากภายนอก
ซึ่งจริงๆ มี instance เครื่องเดียวก็ต่อกับ LB ก็ได้ แต่โดยปกติจะใช้เป็น instance group (และมี auto-scaling / auto-healing)
หมายความว่าเราจะต้องเตรียมส่วนหลักๆ ตามนี้
- Load Balancer: สำหรับเป็นทางเข้า
- Instance Group: คือกลุ่มเครื่องปลายทางที่ต้องการใช้งาน
- Network Security: อนุญาต traffic จาก Load Balancer ไปที่กลุ่มเครื่องปลายทาง
Outbound Traffic
มีส่วนที่สำคัญ 2 ส่วน คือ
- Internet Gateway: ประตูทางออกไปอินเตอร์เน็ต
- NAT Gateway: เนื่องจาก private IP ไม่สามารถคุยกับอินเตอร์เน็ตได้โดยตรง จึงจำเป็นต้องมีตัวกลาง คือ Network Address Translation (NAT) ทำหน้าที่แปลง private IP เป็น public IP ก่อนออกอินเตอร์เน็ต
เปรียบเทียบความต่างในแต่ละส่วน
1) Network Architecture
AWS:
ต้องสร้าง Subnet แบ่งเป็น 2 วงในแต่ละ AZ (กรณีทำ HA จะต้องมีอย่างน้อย 2 AZ) และต้องจัดการ Route แยกกัน:
- Public Subnet: เอาไว้วางสิ่งที่ต้องคุยกับอินเตอร์เน็ตโดยตรง เช่น NAT Gateway (กรณีที่เลือกแบบ Zonal) และ Application Load Balancer (ALB)
- Private Subnet: เอาไว้วางสิ่งที่ต้องการให้เป็น private เช่น EC2
GCP:
สร้าง Subnet เดียวได้เลย ไม่มีคอนเซปท์ของ Public/Private Subnet
2) Internet Gateway
AWS:
ต้องสร้าง Internet Gateway (IGW) แล้วผูกกับ VPC เอง
GCP:
ไม่จำเป็นต้องสร้าง Internet Gateway เอง เพราะ GCP มี Default Internet Gateway ให้ใช้อัตโนมัติอยู่แล้ว
3) NAT Gateway
AWS:
ต้องสร้าง NAT Gateway ซึ่งสามารถเลือกได้ทั้งแบบ Regional (ใช้งานข้ามหลาย AZ ใน VPC) หรือ Zonal (ผูกกับ Subnet) โดยถ้าเลือก Zonal จะต้องวางไว้ที่ Public Subnet
GCP:
ต้องสร้าง Cloud NAT โดยตั้งค่าให้ใช้กับ Subnet ที่มีเครื่องปลายทาง
4) เส้นทางไปยังทางออก (Routing)
AWS:
ต้องกำหนด Route Table เองทั้งหมด
- Public Subnet:
0.0.0.0/0-> IGW - Private Subnet:
0.0.0.0/0-> NAT Gateway (ถ้าเลือกแบบ Zonal จะต้องสร้าง Route Table แยกกันแต่ละ AZ เพราะชี้ไปที่ NAT Gateway คนละตัว แต่สำหรับแบบ Regional สามารถใช้ Route Table เดียวกันแชร์กันทุก AZ เพราะใช้ NAT Gateway ตัวเดียวกัน)
GCP:
ไม่จำเป็นต้องตั้งค่าอะไร
- VPC มีเส้นทางออกอินเตอร์เน็ตให้ใน Default Route อยู่แล้ว:
0.0.0.0/0-> Default Internet Gateway - เมื่อสร้าง Cloud NAT gateway ผูกกับ Subnet แล้ว traffic จาก VM จะวิ่งออกอินเตอร์เน็ตได้โดยใช้ Default Route ของ VPC ได้โดยไม่ต้องมี public IP
5) Network Security
AWS:
- หลักการ: ใช้ Security Group เป็นหลัก
-
สำหรับขาเข้า: ต้องอนุญาต traffic 2 ขา:
-
Internet -> ALB: ตั้งค่า Security Group สำหรับ ALB อนุญาต traffic จากอินเตอร์เน็ต -
ALB -> EC2: ตั้งค่า Security Group สำหรับ EC2 อนุญาต traffic จาก ALB
-
- สำหรับขาออก: ไม่ต้องตั้งค่าอะไร เพราะ traffic ขาออกสามารถวิ่งผ่านได้โดย default อยู่แล้ว
GCP:
- หลักการ: ใช้ Firewall Rules / Policy แล้วใช้ Tags เลือกเครื่องเป้าหมาย
-
สำหรับขาเข้า: ต้องตั้งค่าแค่ขาเดียว อนุญาต traffic จาก LB เข้ามาหาเครื่อง
-
Internet -> LB: ไม่ต้องตั้งค่าอะไร เพราะ LB อยู่ที่ Google Front End (นอก VPC) รับ traffic จากอินเตอร์เน็ตได้อยู่แล้ว -
LB -> VM: สร้าง Firewall Rule อนุญาต LB / Health Check (130.211.0.0/22กับ35.191.0.0/16) ให้วิ่งเข้าเครื่องเป้าหมายได้
-
- สำหรับขาออก: ไม่ต้องตั้งค่าอะไร เพราะ traffic ขาออกสามารถวิ่งผ่านได้โดย default อยู่แล้ว
6) Instance Group
AWS:
ใช้ Auto Scaling Group (ASG)
GCP:
ใช้ Managed Instance Group (MIG)
7) Load Balancer
AWS:
- ใช้ Application Load Balancer (ALB)
- กลุ่มเครื่องปลายทางคือ Target Group (มีได้หลาย Target Group)
- ต้องสร้าง Target Group และตั้งค่า Health Check ของแต่ละกลุ่ม แล้วตั้งค่าให้ Listener ชี้ไปที่ Target Group
- ต้องผูก ASG เข้ากับ Target Group (ASG ใช้สำหรับสเกลจำนวน ต้องเชื่อมเข้ากับ Target Group ของ ALB เพื่อใช้เป็นปลายทาง)
GCP:
- ใช้ Global External Application Load Balancer
- กลุ่มเครื่องปลายทางคือ Backend Service (มีได้หลาย Backend Service)
- ต้องผูก Instance Group เข้ากับ Backend Service
- การตั้งค่า Health Check ใน Backend Service:
- สามารถสร้าง Health Check ใหม่ในขั้นตอนการตั้งค่า Backend Service ได้เลย
- หรือจะสร้าง Health Check แยกไว้ก่อนแล้วค่อยเลือกมาผูกกับ Backend Service ทีหลังก็ได้
- ใช้ Routing Rules ซึ่งเป็น URL Map กำหนดเส้นทางว่าจะไปที่ Backend Service ไหน
8) Health Check
AWS:
- ผูกอยู่กับ Target Group ของ ALB เป็นหลัก
- โดย default แล้ว ASG จะใช้ EC2 status เป็น Health Check ซึ่งเช็คแค่ว่าเปิดเครื่องติดรึเปล่า
- ถ้าผูก ASG กับ Target Group จะสามารถเลือกให้ใช้ ELB Health Check ได้ (Health Check ของ Target Group)
GCP:
- สามารถสร้างแยกไว้ก่อนแล้วเอาไปผูกกับ LB หรือ MIG ทีหลังได้
- ผูกกับ LB สำหรับการกระจายโหลด (เช็คว่าจะส่ง traffic ไปให้เครื่องได้รึเปล่า)
- ผูกกับ MIG สำหรับจัดการ auto scaling / auto healing (เช็คว่าเครื่องยังทำงานได้อยู่รึเปล่า)
ภาพรวมการไหลของ traffic (logical)
| Flow | AWS | GCP |
|---|---|---|
| Inbound | Internet -> Internet Gateway -> ALB -> Private EC2 | Internet -> Global External LB -> Private VM |
| Outbound | Private EC2 -> NAT Gateway -> Internet Gateway -> Internet | Private VM -> Cloud NAT -> Internet Gateway -> Internet |
เปรียบเทียบขั้นตอนคร่าวๆ
สำหรับ AWS:
1) เตรียม Network
- สร้าง VPC
- ในแต่ละ AZ ที่ต้องการ สร้าง Subnet 2 วง สำหรับ Public Subnet และ Private Subnet
2) จัดการทางออก
- สร้าง Internet Gateway (IGW) ผูกกับ VPC
- สร้าง NAT Gateway:
- เลือก Regional หรือถ้าเลือก Zonal ให้ตั้งค่าให้อยู่ใน Public Subnet ที่สร้างไว้
- เลือก Connectivity Type เป็น public
- ตั้งค่า Route Table สำหรับ Public Subnet:
- สร้าง Route:
0.0.0.0/0-> IGW
- สร้าง Route:
- ตั้งค่า Route Table สำหรับ Private Subnet:
- สร้าง Route:
0.0.0.0/0-> NAT Gateway
- สร้าง Route:
3) จัดการ Network Security
- สร้าง Security Group สำหรับ ALB:
- สร้าง Inbound Rule (HTTP): Type:
HTTP, Source:0.0.0.0/0 - สร้าง Inbound Rule (HTTPS): Type:
HTTPS, Source:0.0.0.0/0
- สร้าง Inbound Rule (HTTP): Type:
- สร้าง Security Group สำหรับ EC2:
- สร้าง Inbound Rule (จาก ALB): Type:
Custom TCP, Port: พอร์ตที่รันแอปพลิเคชั่น, Source: Security Group ของ ALB
- สร้าง Inbound Rule (จาก ALB): Type:
4) จัดการ Load Balancer & Health Check:
- สร้าง Internet-facing ALB
- วางใน Public Subnet
- สร้าง Target Group และตั้งค่า Health Check
- Listener: เลือก Target Group
5) จัดการกลุ่มเครื่อง:
- สร้าง Launch Template
- สร้าง ASG:
- เลือก Launch Template ที่สร้างไว้ และผูกเข้ากับ Target Group (ระบบจะสร้าง EC2 ขึ้นมาให้ใน Private Subnet โดยอัตโนมัติ)
- วางใน Private Subnet เพื่อให้เครื่องอยู่ในวง private
- เลือกผูกกับ existing load balancer แล้วเลือก Target Group
- เลือก Turn on Elastic Load Balancing health checks เพื่อให้ ASG ใช้ Health Check เดียวกับ ALB
สำหรับ GCP:
1) เตรียม Network
- สร้าง VPC (custom mode) และ Subnet 1 วง
2) จัดการ Network Security
- สร้าง Firewall Rules
- ระบุ Target Tag ตรงกับของ MIG (เตรียม Tag ไว้ก่อน)
- อนุญาต source IP range
130.211.0.0/22กับ35.191.0.0/16 - เลือก TCP พอร์ต
80
3) จัดการทางออก:
- สร้าง Cloud NAT Gateway และ Cloud Router
4) จัดการ Health Check:
- สร้างเตรียมไว้สำหรับผูกกับ MIG และ Load Balancer
5) จัดการกลุ่มเครื่อง
- สร้าง Instance Template (อย่าลืมปิด public IP)
- ตั้งค่า Network Tags ตามที่เซ็ตไว้ใน Firewall Rules
- สร้าง MIG (stateless)
- เลือก Instance Template ที่สร้างไว้
- เลือก Health Check ที่สร้างไว้
6) จัดการ Load Balancer:
- จอง Static IP สำหรับ LB
- สร้าง Load Balancer
- เลือก Global External Application Load Balancer
- ตั้งค่า Frontend:
- กำหนด static IP ตามช่วงที่เตรียมไว้
- เพิ่ม frontend IP/port สำหรับช่องทางที่ต้องการ
- ตั้งค่า Backend:
- เลือก Health Check ที่สร้างไว้
- สร้าง Backend Service ผูกกับ MIG ที่สร้างไว้
Top comments (0)