การเชื่อมต่อแบบ AWS VPC Peering

ผมจะมาแนะนำวิธีการใช้งานฟังก์ชัน VPC Peering Connection โดยครั้งนี้จะมาทำ VPC Peering ในรีเจี้ยน Singapore และ Tokyo

ครั้งนี้จะมาแนะนำเกี่ยวกับการเชื่อมต่อแบบ VPC Peering

VPC Peering คืออะไร

VPC Peering เป็นบริการในคลาวด์ของบริษัท Amazon Web Services (AWS) ที่อนุญาตให้เชื่อมต่อเครือข่ายเสมือน (Virtual Private Clouds หรือ VPCs) ระหว่างกัน ซึ่งอยู่ในโซนเดียวกันหรือโซนที่แตกต่างกันในบัญชีเดียวกัน หรือระหว่างบัญชี AWS ที่แยกกันได้ เพื่อให้เครือข่ายภายใน VPC สามารถสื่อสารและแลกเปลี่ยนข้อมูลได้อย่างเป็นส่วนตัวผ่านทางเครือข่ายเสมือน โดยไม่ต้องเชื่อมต่อผ่านอินเทอร์เน็ตสาธารณะ (Public Internet)

เมื่อตั้งค่า VPC Peering แล้ว ทั้งสอง VPC ที่เชื่อมต่อกันจะสามารถสื่อสารกันได้เหมือนเป็นส่วนหนึ่งของเครือข่ายเดียวกัน โดยสามารถส่งและรับข้อมูลได้ผ่านทางเครือข่ายเสมือนที่ถูกเชื่อมต่อกัน เหมือนกับเครือข่ายภายในเดียวกัน ทำให้สามารถเข้าถึงและใช้งานทรัพยากรต่างๆ ใน VPC ปลายทางได้โดยตรง

เป้าหมาย

เราสามารถใช้งาน VPC 2 ตัวในรีเจี้ยนเดียวกันได้ และสามารถเชื่อมต่อ VPC Peering ใน AWS Account อื่นได้
แต่ครั้งนี้จะมาสร้าง VPC 2 ตัวแยกกันในรีเจี้ยน Singapore และ Tokyo ใน AWS Account เดียวกัน

การเชื่อมต่อแบบ VPC Peering

  • สามารถเชื่อมต่อกับ AWS Account เดียวกันหรือกับ AWS Account อื่นได้
  • สามารถเชื่อมต่อใน Region เดียวกันหรือใน Region อื่นได้

การสร้าง VPC

ดูตัวอย่างการสร้าง VPC ได้ที่ลิงก์บทความด้านล่างนี้ เนื่องจากลิงก์บทความด้านล่างนี้เป็นแค่ตัวอย่าง ซึ่งมีการตั้งค่าบางส่วนที่แตกต่างกัน แนะนำให้ดูตัวอย่างตั้งค่าการสร้าง VPC ในรีเจี้ยน Singapore และ Tokyo ตามหัวข้อด้านล่างนี้ประกอบด้วย

ตัวอย่างตั้งค่าการสร้าง VPC ในรีเจี้ยน Singapore และ Tokyo

สร้าง VPC ในรีเจี้ยน Singapore

เลือกรีเจี้ยน Singapore

Create VPC
VPC settings
Resources to create: ◎ VPC and more

Name tag auto-generation
✅ Auto-generate: tinnakorn-singapore (เมื่อป้อนชื่อแล้วให้สังเกตการเปลี่ยนแปลงด้านขวา)
IPv4 CIDR block: 10.0.0.0/16 (Default)

Number of Availability Zones (AZs): 1
Number of public subnets: 1
Number of private subnets: 0
▼ Customize subnets CIDR blocks (คลิกหัวข้อนี้ก่อนแล้วจะเห็นช่องสำหรับป้อน IP)
Private subnet CIDR block in ap-southeast-1a: 10.0.0.0/24 (ตัวอย่าง)

DNS options
✅ Enable DNS hostnames
✅ Enable DNS resolution

คลิก Create VPC

สร้าง VPC ในรีเจี้ยน Tokyo

เลือกรีเจี้ยน Tokyo

Create VPC
VPC settings
Resources to create: ◎ VPC and more

Name tag auto-generation
✅ Auto-generate: tinnakorn-tokyo (เมื่อป้อนชื่อแล้วให้สังเกตการเปลี่ยนแปลงด้านขวา)
IPv4 CIDR block: 10.1.0.0/16

Number of Availability Zones (AZs): 1
Number of public subnets: 1
Number of private subnets: 0
▼ Customize subnets CIDR blocks (คลิกหัวข้อนี้ก่อนแล้วจะเห็นช่องสำหรับป้อน IP)
Private subnet CIDR block in ap-southeast-1a: 10.1.0.0/24 (ตัวอย่าง)

DNS options
✅ Enable DNS hostnames
✅ Enable DNS resolution

คลิก Create VPC

การสร้าง Peering connection

เมื่อสร้าง VPC ใน Singapore และ Tokyo เสร็จแล้ว เราจะมาสร้าง Peering connection กัน

ขั้นตอนนี้ผมเปิดแท็บหน้าจอ Amazon VPC ไว้ 2 แท็บสำหรับรีเจี้ยน Singapore และ Tokyo ไว้เพื่อให้การสร้าง Peering connection นั้นง่ายขึ้น

สร้าง Peering connection ในรีเจี้ยน Singapore และ Tokyo

ให้กลับมาที่หน้าจอ VPC ที่เลือกรีเจี้ยน Singapore

แล้วเลือก Peering connections จากเมนูด้านซ้าย

คลิก Create peering connection ด้านขวา

เมื่อเข้ามาหน้า Create peering connection แล้วจะทำการตั้งค่าดังนี้

Peering connection settings
Name: tinnakorn-sinagpore-tokyo-peering

Select a local VPC to peer with
VPC ID (Requester): tinnakorn-singapore-vpc

Select another VPC to peer with
Account
เลือก ◎ My account

Region
เลือก ◎ Another Region
เลือก Asia Pacific (Tokyo) (ap-northeast-1)
VPC ID (Accepter)
vpc-xxxxxxxxxxxxxxxxx (กลับไปที่หน้าจอ Your VPCs ในรีเจี้ยน Tokyo แล้วคัดลอก VPC ID วางที่นี่)

เลื่อนลงมาด้านล่างสุด แล้วคลิก Create peering connection

แล้วคลิกมาที่หน้าจอ Peering connections แล้วดูที่ชื่อของเรา ก็จะแสดง Pending acceptance แบบนี้

ต่อไปเราต้องทำการ Accept request ในหน้าจอ Peering connections ในรีเจี้ยน Tokyo ก่อนจึงจะสามารถเชื่อมต่อระหว่างรีเจี้ยน Singapore และ Tokyo ได้

Accept request Peering connection ในรีเจี้ยน Tokyo

เข้าไปหน้าจอ VPC ที่เลือกรีเจี้ยน Tokyo

แล้วเลือก Peering connections จากเมนูด้านซ้าย
แล้วติ๊ก Peering connection name ของเรา แล้วเลือก Actions แล้วเลือก Accept request

แล้วคลิก Accept request

แล้ว Status จะเปลี่ยนเป็น Provisioning และเปลี่ยนเป็น Active

กลับมาที่หน้าจอ Peering connection ในรีเจี้ยน Singapore อีกครั้ง แล้ว Refresh หน้าจอ จะเห็นว่า Status เปลี่ยนเป็น Active เช่นเดียวกันกับ Peering connection ในรีเจี้ยน Tokyo

การเพิ่ม Route tables

ขั้นตอนนี้จะทำการเพิ่ม Route tables ในรีเจี้ยน Tokyo และ Singapore

เพิ่ม Route tables ในรีเจี้ยน Tokyo

ไปที่หน้าจอ VPC ที่เป็นรีเจี้ยน Tokyo แล้วเลือก Route tables จากเมนูด้านซ้าย

ติ๊กที่ Route table Name ของเรา แล้วจะมีข้อมูลแสดงขึ้นมาจากด้านล่าง แล้วเลือกแท็บ Routes แล้วคลิก Edit routes

คลิก Add route แล้วจะมีช่องให้ป้อนข้อมูลเพิ่มขึ้นมา ให้ป้อนป้อนดังนี้
・Destination: ป้อน IPv4 CIDR ของรีเจี้ยน Singapore เช่น 10.0.0.0/16
・Target: คลิกที่ช่องแล้วเลือก Peering Connection แล้วเลือก Peering connection ID ที่สร้างก่อนหน้านี้ เช่น pcx-xxxxxxxxxx (Peering connection ID นี้มีการซิงค์กันระหว่างรีเจี้ยน Tokyo และ Singapore)
จากนั้นให้คลิก Save changes

แล้วเลื่อนลงมาด้านล่างที่แท็บ Routes จะเห็นว่า Destination 10.0.0.0/16(Singapore) มี Status เป็น Active

เพิ่ม Route tables ในรีเจี้ยน Singapore

วิธีการทำจะเหมือนกับขั้นตอนที่แล้วเลย แต่สำหรับการเพิ่ม Route tables ในรีเจี้ยน Singapore ให้ป้อนค่าดังนี้
・Destination: ป้อน IPv4 CIDR ของรีเจี้ยน Tokyo เช่น 10.1.0.0/16
・Target: คลิกที่ช่องแล้วเลือก Peering Connection แล้วเลือก Peering connection ID ที่สร้างก่อนหน้านี้ เช่น pcx-xxxxxxxxxx (Peering connection ID นี้มีการซิงค์กันระหว่างรีเจี้ยน Tokyo และ Singapore)
จากนั้นให้คลิก Save changes

แล้วเลื่อนลงมาด้านล่างที่แท็บ Routes จะเห็นว่า Destination 10.1.0.0/16(Tokyo) มี Status เป็น Active

การสร้าง EC2 Instance

ดูตัวอย่างการสร้าง Amazon Linux 2 ได้ที่ลิงก์บทความด้านล่างนี้ เนื่องจากลิงก์บทความด้านล่างนี้เป็นแค่ตัวอย่าง ซึ่งมีการตั้งค่าบางส่วนที่แตกต่างกัน แนะนำให้ดูตัวอย่างตั้งค่าการสร้าง Amazon Linux 2 ใน EC2 ในรีเจี้ยน Singapore และ Tokyo ตามหัวข้อด้านล่างนี้ประกอบด้วย

ตัวอย่างตั้งค่าการสร้าง Amazon Linux 2 ใน EC2 ในรีเจี้ยน Singapore และ Tokyo

ก่อนอื่นให้สร้าง IAM Role เพื่อให้สิทธิ์ SSM กับ EC2
รายละเอียดเกี่ยวกับการเชื่อมต่อ EC2 ด้วย SSM ดูได้ที่ลิงก์บทความนี้

การสร้าง IAM Role

เข้ามาที่ Service IAM แล้วค้นหา ?︎ IAM แล้วเลือก IAM

เลือก Roles จากเมนูด้านซ้าย

คลิก Create role

Step 1 - Select trusted entity:
Trusted entity type
» เลือก AWS service
Use case
» เลือก ◉ EC2
» คลิก Next

Step 2 - Add permissions:
» ค้นหา Permissions policies: AmazonSSMManagedInstanceCore
» ติ๊ก AmazonSSMManagedInstanceCore
» คลิก Next

Step 3 - Name, review, and create:
» Name: ec2-ssm-managed-instance-core (ชื่ออะไรก็ได้)
» เลื่อนลงมาด้านล่างสุด คลิก Create role

สร้าง EC2 Instance ในรีเจี้ยน Singapore

ตัวอย่างตั้งค่าการสร้าง Amazon Linux 2 ใน EC2 ในรีเจี้ยน Singapore ของบทความครั้งนี้

※Launch instances
Name and tags
Name: tinnakorn-singapore-test (ตั้งชื่อที่ต้องการ)

Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI): Amazon Linux 2023 AMI

Instance type
Instance type: t3a.nano (เลือกสเปคตามต้องการ)

Key pair (login)
Key pair name - required: Proceed without a key pair (Not recommended) (ครั้งนี้จะไม่ใช้ Key pair)

Network settings
VPC - required: tinnakorn-singapore-vpc (เลือก VPC ที่สร้างก่อนหน้านี้)
Subnet: เมื่อเลือก VPC แล้ว Subnet จะถูกเลือกโดยอัตโนมัติ
Auto-assign public IP: Enable
Firewall (security groups)
Security group name - required: tinnakorn-singapore-test (ตั้งชื่อที่ต้องการ)
Description - required: tinnakorn-singapore-test (ป้อนตามต้องการ)
Inbound security groups rules
คลิก Remove (ครั้งนี้จะไม่ตั้งค่า Security group rule)

Configure storage
1x: 8 GiB gp2 Root volume (Default)

คลิก Advanced details เพื่อขยายหน้าจอ แล้วเลือก Role ที่เราสร้างไว้ก่อนหน้านี้
IAM instance profile: ec2-ssm-managed-instance-core

สร้าง EC2 Instance ในรีเจี้ยน Tokyo

ตัวอย่างตั้งค่าการสร้าง Amazon Linux 2 ใน EC2 ในรีเจี้ยน Tokyo ของบทความครั้งนี้

※Launch instances
Name and tags
Name: tinnakorn-tokyo-test (ตั้งชื่อที่ต้องการ)

Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI): Amazon Linux 2023 AMI

Instance type
Instance type: t3a.nano (เลือกสเปคตามต้องการ)

Key pair (login)
Key pair name - required: Proceed without a key pair (Not recommended) (ครั้งนี้จะไม่ใช้ Key pair)

Network settings
VPC - required: tinnakorn-tokyo-vpc (เลือก VPC ที่สร้างก่อนหน้านี้)
Subnet: เมื่อเลือก VPC แล้ว Subnet จะถูกเลือกโดยอัตโนมัติ
Auto-assign public IP: Disable
Firewall (security groups)
Security group name - required: tinnakorn-tokyo-test (ตั้งชื่อที่ต้องการ)
Description - required: tinnakorn-tokyo-test (ป้อนตามต้องการ)
Inbound security groups rules
▼ Security group rule 1 (xxx, xxx, xx.x.x.x/xx)
Type: All Traffic | Source type: Custom | Source: 10.0.0.0/16
▼ Advanced network configuration
Primary IP: 10.1.0.100

Configure storage
1x: 8 GiB gp2 Root volume (Default)

ตรวจสอบการเชื่อมต่อ

เข้าไปที่หน้าจอ EC2 Instance ของ Singapore แล้วคลิก Connect

เลือกแท็บ Session Manager แล้วคลิก Connect

เมื่อเข้ามาที่หน้าจอ AWS Terminal แล้ว รันคำสั่ง ping ตามนี้เพื่อตรวจสอบสถานะการเชื่อมต่อถึงกันของ EC2 Instance ในรีเจี้ยน Singapore และ Tokyo

ping 10.1.0.100

Output (example): จะเห็นว่า EC2 Instance ในรีเจี้ยน Singapore และ Tokyo สามารถสื่อสารกันได้

AWS Terminal

sh-5.2$ ping 10.1.0.100
PING 10.1.0.100 (10.1.0.100) 56(84) bytes of data.
64 bytes from 10.1.0.100: icmp_seq=1 ttl=127 time=70.3 ms
64 bytes from 10.1.0.100: icmp_seq=2 ttl=127 time=70.4 ms
64 bytes from 10.1.0.100: icmp_seq=3 ttl=127 time=70.4 ms
64 bytes from 10.1.0.100: icmp_seq=4 ttl=127 time=70.3 ms
64 bytes from 10.1.0.100: icmp_seq=5 ttl=127 time=70.7 ms
...

พิสูจน์ว่าจะไม่สามารถเชื่อมต่อได้เมื่อไม่มี Peering Connection

อยากจะพิสูจน์ว่าเมื่อไม่มี Peering Connection จะไม่สามารถ ping ได้ ดังนั้นจะลบ Peering Connection ออก

ให้เข้าไปที่หน้าจอ Peering connections ในรีเจี้ยน Singapore แล้วติ๊ก Peering connection Name ที่ต้องการลบ แล้วคลิก Actions แล้วเลือก Delete peering connection

เมื่อมี POPUP แสดงขึ้นมา ให้เลือก Delete related route table entries แล้วป้อน delete ลงในช่องตามคำแนะนำ แล้วคลิก Delete

เมื่อ Status แสดงเป็น Deleting ให้กลับไปที่หน้าจอ AWS Terminal

หลังจากที่ลบ Peering connection แล้ว จะเห็นว่า ping หยุดดำเนินการที่ icmp_seq=91 (ping จะหยุดดำเนินการหลังจากที่เราลบ Peering connection ทันที)
Output (example)

AWS Terminal

sh-5.2$ ping 10.1.0.100
PING 10.1.0.100 (10.1.0.100) 56(84) bytes of data.
64 bytes from 10.1.0.100: icmp_seq=1 ttl=127 time=70.3 ms
64 bytes from 10.1.0.100: icmp_seq=2 ttl=127 time=70.4 ms
64 bytes from 10.1.0.100: icmp_seq=3 ttl=127 time=70.4 ms
64 bytes from 10.1.0.100: icmp_seq=4 ttl=127 time=70.3 ms
64 bytes from 10.1.0.100: icmp_seq=5 ttl=127 time=70.7 ms
...
64 bytes from 10.1.0.100: icmp_seq=87 ttl=127 time=74.9 ms
64 bytes from 10.1.0.100: icmp_seq=88 ttl=127 time=74.9 ms
64 bytes from 10.1.0.100: icmp_seq=89 ttl=127 time=74.9 ms
64 bytes from 10.1.0.100: icmp_seq=90 ttl=127 time=75.0 ms
64 bytes from 10.1.0.100: icmp_seq=91 ttl=127 time=74.9 ms


จากนั้นให้เข้าไปที่หน้าจอ Peering connections ในรีเจี้ยน Tokyo จะเห็นว่า Status แสดงเป็น Deleting เช่นเดียวกับในรีเจี้ยน Singapore

การลบ AWS Resource ที่สร้างขึ้นในบทความนี้

การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ เป็นต้น ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ

การลบฟังก์ชันที่ได้สร้างขึ้นใน Service ต่างๆ

ลบเรียงตามขั้นตอนดังนี้:

  • Amazon EC2 (ลบในรีเจี้ยน Singapore และ Tokyo)
    • Instance
  • Amazon VPC (ลบในรีเจี้ยน Singapore และ Tokyo)
    • Your VPCs
    • VPC Peering Connection
  • AWS Identity and Access Management (IAM)
    • Roles

การลบฟังก์ชันใน Amazon EC2

ให้ลบฟังก์ชัน Instance ทั้งในรีเจี้ยน Singapore และ Tokyo ดังนี้

ลบ Instance ในรีเจี้ยน Singapore

เข้าไปที่หน้าจอฟังก์ชัน Instance ในรีเจี้ยน Singapore แล้วค้นหาชื่อที่ต้องการลบ แล้วเลือก Instance state แล้วเลือก Terminate instance
และเมื่อมี POPUP แสดงขึ้นมา ให้ยืนยันการลบตามคำแนะนำ (การ Terminate Instance ต้องรอจนกว่า Instance state เป็น Terminated จึงจะเสร็จสมบูรณ์)

ลบ Instance ในรีเจี้ยน Tokyo

เข้าไปที่หน้าจอฟังก์ชัน Instance ในรีเจี้ยน Tokyo แล้วค้นหาชื่อที่ต้องการลบ แล้วเลือก Instance state แล้วเลือก Terminate instance
และเมื่อมี POPUP แสดงขึ้นมา ให้ยืนยันการลบตามคำแนะนำ (การ Terminate Instance ต้องรอจนกว่า Instance state เป็น Terminated จึงจะเสร็จสมบูรณ์)

การลบฟังก์ชันใน VPC

ให้ลบฟังก์ชัน Your VPCs ทั้งในรีเจี้ยน Singapore และ Tokyo ดังนี้

ข้อควรระวัง: ก่อนลบ Your VPCs ในรีเจี้ยน Singapore และ Tokyo เราต้องลบ Peering connection ก่อน จึงจะสามารถลบ Your VPCs ได้
แต่เนื่องจากตอนทำหัวข้อ ตรวจสอบการเชื่อมต่อ เราได้ทำการลบ Peering connection ไปแล้ว ดังนั้นเราจึงสามารถลบ Your VPCs ตามหัวข้อด้านล่างนี้ได้เลย

ลบ Your VPCs ในรีเจี้ยน Singapore

เข้าไปที่หน้าจอฟังก์ชัน Your VPCs ในรีเจี้ยน Singapore แล้วค้นหาชื่อที่ต้องการลบ แล้วเลือก Actions แล้วเลือก Delete VPC
และเมื่อมี POPUP แสดงขึ้นมา ให้ยืนยันการลบตามคำแนะนำ

ลบ Your VPCs ในรีเจี้ยน Tokyo

เข้าไปที่หน้าจอฟังก์ชัน Your VPCs ในรีเจี้ยน Tokyo แล้วค้นหาชื่อที่ต้องการลบ แล้วเลือก Actions แล้วเลือก Delete VPC
และเมื่อมี POPUP แสดงขึ้นมา ให้ยืนยันการลบตามคำแนะนำ

การลบฟังก์ชันใน AWS Identity and Access Management (IAM)

ให้ลบฟังก์ชัน Role ซึ่งการลบในส่วนนี้สามารถลบได้โดยไม่ต้องคำนึงถึงรีเจี้ยน เพราะบริการ AWS Identity and Access Management (IAM) อยู่ใน Global infrastructure ที่เป็น Region ทั่วโลกที่ AWS ทำงานอยู่

เข้าไปที่หน้าจอฟังก์ชัน Role แล้วค้นหาชื่อที่ต้องการลบ แล้วเลือก Delete
และเมื่อมี POPUP แสดงขึ้นมา ให้ยืนยันการลบตามคำแนะนำ

Pricing

การสร้าง VPC Peering Connection ไม่มีค่าใช้จ่าย แต่มีค่าใช้จ่ายในการเชื่อมต่อ ค่าใช้จ่ายในการเชื่อมต่อสื่อสารระหว่าง VPC และการเชื่อมต่อสื่อสารระหว่าง Region มีราคาเท่ากัน โดยรายละเอียดเป็นไปตามด้านล่างนี้

  • VPC Peering Connection ภายใน AZ เดียวกัน: ไม่มีค่าใช้จ่าย
  • VPC Peering Connection ระหว่าง AZ: $0.01/GB (ทั้งข้อมูลขาเข้าและออก) โดยหากทำ VPC Peering ภายใน Account เดียวกัน ค่าใช้จ่ายจะเกิดขึ้นทั้งข้อมูลขาเข้าและขาออก หรือก็คือ $0.02/GB
  • VPC Peering Connection ระหว่าง Region: ข้อมูลขาเข้าไม่มีค่าใช้จ่าย ส่วนข้อมูลขาออก $0.09/GB

สรุป

การเชื่อมต่อแบบ VPC Peering สามารถนำไปใช้กับ EC2 Instance ที่สร้างในรีเจี้ยนที่แตกต่างกันได้ เช่น กรณีที่สร้าง EC2 Instance ในรีเจี้ยน Singapore และ Tokyo ก็สามารถสร้าง VPC สำหรับใช้กับ EC2 Instance ทั้งในรีเจี้ยน Singapore และ Tokyo และใช้ฟังก์ชัน Peering connection ใน VPC เพิ่มเติมเพื่อให้ EC2 Instance ในรีเจี้ยน Singapore และ Tokyo สามารถเชื่อมต่อกันได้

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

บทความที่เกี่ยวข้อง