DEV Community

Cover image for AWS vs GCP ตอนที่ 4: ต่อเครื่องออกอินเตอร์เน็ตโดยไม่เปิด Public IP
Perajit
Perajit

Posted on

AWS vs GCP ตอนที่ 4: ต่อเครื่องออกอินเตอร์เน็ตโดยไม่เปิด Public IP

หนึ่งในเคสพื้นฐานที่สุดเวลาใช้ 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 Table สำหรับ Private Subnet:
    • สร้าง Route: 0.0.0.0/0 -> NAT Gateway

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
  • สร้าง Security Group สำหรับ EC2:
    • สร้าง Inbound Rule (จาก ALB): Type: Custom TCP, Port: พอร์ตที่รันแอปพลิเคชั่น, Source: Security Group ของ ALB

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)