ทดลองใช้ ALB ของ EC2 เพื่อแบ่งการเชื่อมต่อ

2022.05.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ ผม ต้า ครับ
วันนี้ผมจะทดลองลองใช้ ALB (Application Load Balancer) ที่เป็นตัวช่วย
ในการปรับการเชื่อมต่อไปยังแต่ละ Availability Zone ให้เท่าๆกันนะครับ
โดยในครั้งนี้ผมจะทดลองสร้างสภาพแวดล้อมตามแผนภาพด้านบนนะครับ งั้นก็ไปลุยกันเลยนะครับ
.
.
.
.

ขั้นเตรียมการ

1.สร้าง VPC

ในขั้นตอนแรกเราจะมาสร้าง VPC ให้ได้ตามรูปด้านบนกันก่อนนะครับ
โดยวิธีการสร้าง VPC สามารถดูได้ที่ลิ้งค์ด้านล่างนี้ครับ↓↓↓
แต่ให้ตั้งค่าตามด้านล่างนี้นะครับ

การสร้าง VPC Beginner
Name tag auto-generation: supanut-test (ตั้งชื่อของ VPC อะไรก็ได้)
IPv4 CIDR block: 192.168.0.0/16
Availability Zones (AZs) (2): 1a 1b
Number of public subnets: 2
Number of private subnets: 0
Public subnet CIDR block in ap-southeast-1a: 192.168.1.0/24
Public subnet CIDR block in ap-southeast-1b: 192.168.2.0/24
NAT gateways: None
VPC endpointsInfo: None
Enable DNS hostnames: ✅
Enable DNS resolution: ✅

ตั้งค่าเสร็จแล้วก็กด Create VPC ได้เลยครับ

ตั้งค่า Subnet

หลังจากนั้นให้ไปที่ฟังก์ชันSubnets
แล้วให้ตั้งค่า Public Subnet ทั้ง public1 และ public2 ให้ ✅Enable auto-assign public IPv4 address
เราสามารดูวิธีตั้งค่า Public Subnet ได้ตามบทความด้านล่างนี้ครับ↓↓↓

วิธีตั้งค่า Public Subnet

2.สร้าง EC2 Instance

โดยขั้นตอนต่อไปเราจะสร้าง EC2 Instance สำหรับโซน 1a และหลังจากนั้นให้เชื่อมต่อ PuTTY ด้วย
โดยสามารถดูวิธีการสร้างและเชื่อมต่อได้ที่ลิ้งค์ด้านล่างนี้↓↓↓
แต่ให้ตั้งค่าตามด้านล่างนี้นะครับ (นอกนั้นให้เหมือนในบทความได้เลยครับ)

【Update】วิธีติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
Name:supanut-test-ec2-1(ตั้งชื่อให้สอดคล้องกับที่ทำมา)
VPC:เลือก VPC ที่เราสร้างขึ้นมาในขั้นตอนที่แล้ว
Subnet: public1 (ตามแผนภาพที่ร่างไว้↑↑↑) ดูให้ดีๆนะครับ
Auto-assign public IP: Enable
Security group name: supanut-test-ec2(จะลองให้ทั้ง 2 Instance ใช้ Security group เดียวกัน)
Description: supanut-test-ec2
Security group rule 1
Type: ssh
Source type: My IP
Security group rule 2
Type: HTTP
Source type: Anywhere

เสร็จแล้วกดLaunch instanceเลยครับ
หลังจากนั้นเราสามารถมาเช็คข้อมูลใน หน้า instance ได้ จะเห็นว่า VPC กับ Subnet จะเปลี่ยนไปตามที่เราตั้งค่า

แล้วให้เราเชื่อมต่อ PuTTY ตามบทความด้านบนทุกอย่างเลยครับ
หลังจากนั้นใช้เราใช้คำสั่งนี้เพื่อเปลี่ยน Time zone เป็นเวลาไทยครับ

ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime

แล้วใช้คำสั่งนี้เพื่อเช็คดูเวลาได้ หากถูกต้องเวลาจะเป็น +07 ครับ

date

3.ตั้งค่า EC2 Instance

คราวนี้จะต้องมาติดตั้ง PHP 8.0 และ Apache เพื่อใช้ในการทดสอบในขั้นต่อไปครับ
โดยวิธีการติดตั้งสามารถดูได้ที่ลิ้งค์ด้านล่างนี้↓↓↓

วิธี Install PHP 8.0 และ Apache

แล้วเรียกใช้คำสั่งนี้ เพื่อไปยัง address /var/www/html/

cd /var/www/html/

แล้วเรียกใช้คำสั่งนี้ เพื่อสร้างไฟล์ index.php

vi index.php

กดปุ่ม i เพื่อเข้าสู่โหมดเขียน แล้วเพิ่มคำนี้ลงไป

<?php phpinfo();


แล้วพิม :x แล้วกด Enter เพื่อ save file
หลังจากนั้นให้เรามาที่ตัว Instance ที่เราสร้าง
แล้ว Copy Public IPv4 address ของ Instance ไปเปิดใน Browser (หากเปิดไม่ได้ ให้ลองพิมพ์ http://xxx/index.php ไปเปิดใน Browser แทน (ตรง xxx ให้ใส่ Public IPv4 address ของ Instance))

เมื่อเปิดแล้ว เราจะได้หน้าแบบนี้

4.ใช้ AMI Copy Instance

หลังจากที่เราตั้งค่า Instance เสร็จแล้ว เราจะมาใช้ฟังก์ชันของ EC2 ที่เรียกว่า AMIs ในการสร้าง Copy ของ Instance เพื่อย่นเวลาในการตั้งค่าต่างๆภายใน โดยสามารถดูวิธีการสร้างและเชื่อมต่อได้ที่ลิ้งค์ด้านล่างนี้↓↓↓ แต่ให้ตั้งค่าตามด้านล่างนี้นะครับ

การใช้ AMI เพื่อ Copy ข้อมูลของ EC2 Instance
Name:supanut-test-ec2-2(ตั้งชื่อให้สอดคล้องกับที่ทำมา)
VPC:เลือก VPC ที่เราสร้างขึ้นมาในขั้นตอนที่แล้ว
Subnet: public2 (ตามแผนภาพที่ร่างไว้↑↑↑) ดูให้ดีๆนะครับ
Auto-assign public IP: Enable
Firewall (security groups): ◎Select existing security group
Security group name: supanut-test-ec2(เลือกอันที่เราสร้างในขั้นตอนที่แล้ว)
Description: supanut-test-ec2

เมื่อเสร็จทุกอย่างแล้วก็ไปขั้นตอนต่อไปได้เลยครับ

ขั้นลงมือจริง

5.สร้าง ALB

สร้าง Target Group

ใน Service EC2 ให้เราเลือก Target Group ที่อยู่ใน Load Balancing

แล้วกดปุ่ม Create target group ที่อยู่ด้านขวา (ปุ่มส้มๆ)
แล้วตั้งค่าตามนี้ครับ
Choose a target type:◎Instances
Target group name:supanut-test-target-group
Protocol: http
Port: 80
VPC:เลือก VPC ที่เราสร้างขึ้นมาในขั้นตอนที่แล้ว
Protocol version: HTTP1
Health checks: HTTP /



เสร็จแล้วกดNextเลยครับ
หลังจากนั้นให้เราติ๊ก✅ Instance ที่เราจะใส่ใน Target Group
แล้วกด Include as pending below

จะเห็นว่า Instance เราถูกเลือกแล้ว

ให้กดปุ่ม Create target group ได้เลยครับ

สร้าง Security Group สำหรับ Load Balancers

ไปยังหน้า Security Groups ใน EC2 Service
กดปุ่มสีส้มๆ Create security group
ตั้งค่าตามนี้ครับ
Security group name: supanut-test-alb (ตั้งชื่อให้สอดคล้องกับที่ทำมา)
Description: supanut-test-alb (ตั้งชื่อให้สอดคล้องกับที่ทำมา)
VPC:เลือก VPC ที่เราสร้างขึ้นมาในขั้นตอนที่แล้ว
Inbound rules
กด Add rule
Type: HTTP
Source: Anywhere-IPv4

เสร็จแล้วกด Create security group

สร้าง Load Balancers

หลังจากสร้าง Target gruop เสร็จแล้ว ให้เราไปที่ Load Balancers ต่อได้เลยครับ

หลังจากนั้นกดปุ่ม Create Load Balancer ครับ เลือก Create Application Load Balancer ครับ
Load balancer name: supanut-test-alb
Scheme:◎Internet-facing
IP address type:◎IPv4
VPC:เลือก VPC ที่เราสร้างขึ้นมาในขั้นตอนที่แล้ว
Security Group: supanut-test-alb
Mappings:✅ap-southeast-1a ✅ap-southeast-1b
Default action: เลือก Target Group ที่สร้าง



เสร็จแล้วกดปุ่ม Create load balancer เลยครับ

6.ทดสอบต่างๆ

อย่างแรกให้เรากลับไปเปิด PuTTY แล้ว เชื่อมต่อกับทั้ง 2 Instance ที่เราสร้างมา (เชื่อมผ่าน Public IPv4 address)
แล้วเข้า root mode sudo su -
แล้วเรียกใช้คำสั่งนี้ครับ

tail -f /var/log/httpd/access_log

เราจะเห็นว่ามีการใช้คำสั่ง ELB-HealthChecker เกิดขึ้นกับทั้ง 2 Instance
ซึ่งนี่คือคำสั่งจาก ALB ที่จะเช็คว่า Instance นี้สามารถใช้งานได้ปกติไหม โดยจะเช็คทุกๆประมาณ 5 วินาที (5 วินาทีคือค่า Default สามารถเปลี่ยนได้ในการตั้งค่าหน้า Target group)

คราวนี้ให้เรามาที่หน้า Load Balancers ที่อยู่ใน Load Balancing
จากนั้นให้เราเลือก ✅Load Balancer แล้วกดดู Desciption
ให้เรา Copy DNS name แล้วนำไปเปิดใน Browser
จะเห็นว่าเราจะได้หน้าเว็บเดียวกับที่เปิดผ่าน ตัว Instance ทั้ง 2

แล้วเมื่อกด Refresh หน้าเว็บ(ประมาณ 1-3 ครั้ง)จะเห็นว่า เลข IP ตรง System การเปลี่ยนแปลง

นั่นเป็นเพราะว่า AMI ช่วยแบ่งการเชื่อมต่อที่เข้ามา ไปให้กับ ทั้ง 2 Instance ในปริมาณที่เท่าๆกัน
และเมื่อเรากลับไปดู log ใน PuTTY จะพบว่า มี Log การเชื่อมต่อเกิดขึ้น
โดยเมื่อเชื่อมต่อเข้า Instance ใด ก็จะมี log ขึ้นที่ฝั่งนั้น

โอเคครับ ในขั้นต่อไปเราจะมาลองปิดการใช้งาน Apache (httpd) ที่ทำงานอยู่บน EC2 ข้างนึงดูกันครับว่าจะเกิดอะไรขึ้น
ก่อนอื่นให้เราใช้คำสั่งต่อไปนี้ที่ PuTTY ข้างนึงนะครับ (โดยผมจะใช้กับ 1b) ((อยากออกจากการดู Log กด Ctrl+C))

systemctl stop httpd

จากนั้นลอง Refresh หน้าเว็บดู จะพบว่ามีบางครั้งที่จะเข้าไม่ได้

แต่พอผ่านไปสักพักการเข้าใช้เว็บไซต์จะเข้าได้ปกติเหมือนเดิม
จากนั้นให้เรากลับไปที่ EC2 ไปดูในส่วน Target group จะเห็นว่ามี 1 รายการที่ Unhealthy

นั่นคือรายการที่เราปิดการเชื่อมต่อไป
โอเค ที่นี้เราทราบแล้วว่า ALB สามารถกรองการเชื่อมต่อไปในทางที่สามารถเชื่อมต่อได้
งั้นเราจะลองเปิดเซิร์ฟเวอร์ดูอีกครั้ง เพื่อดูว่าการเชื่อมต่อจะเป็นยังไง
ให้เราใช้คำสั่ง

systemctl start httpd

แล้วเข้าไปดู Log กัน

tail -f /var/log/httpd/access_log

จากนั้นเมื่อเรารออีกสักพักจะพบว่า Target Group กลับมา Healthy ทั้ง 2 เลย
แล้วเมื่อเรากลับไปเข้าเว็บไซต์ผ่าน DNS name ของ Target Group ก็จะพบว่าเว็บไซต์สามารถเชื่อมต่อเข้าได้ทั้ง 2 Instance แล้ว

เมื่อเราทดสอบเสร็จ ให้เราไปตั้งค่า Security Group ของ Instance(ในที่นี้ของผมคือ supanut-test-ec2)
ให้เราเปลี่ยนในส่วนของ source ของ HTTP เป็น IP ของ VPC(ในที่นี้ของผมเป็น 192.168.0.0/16)
เพียงแค่นี้เราก็จะสามารถป้องกันการเชื่อมต่อจากภายนอกที่ผ่านมาทาง IP ของ Instance ได้
และทำให้DNS nameของ Target Group เป็นประตูเดียวที่สามารถเข้าใช้เว็บไซต์จากภายนอกได้

ทำไม Load Balancer ของ AWS ถึงน่าใช้

ALB(Application Load Balancer) หรือที่รู้จักกันในชื่อทั่วๆไปว่า Load Balancer
การที่เราจะซื้อ Load Balancer Hardware มาใช้เอง(On-premises) 1 เครื่องมีราคาสูงมาก
(เกิน 100,000 บาท)
จึ่งไม่ใช่สินค้าที่เราจะสามารถตัดสินใจซื้อได้ง่ายๆ
แต่หากใช้ Load Balancer ของ AWS ราคาที่ต้องจ่ายจะคิดจากจำนวนชั่วโมงที่ใช้
ทำให้ง่ายต่อการตัดสินใจที่จะลองใช้ โดยในช่วงที่มีการ access เกิดขึ้นน้อย
จะมีค่าใช้จ่ายเริ่มต้นอยู่ที่เดือนละ 18 USD (ประมาณ 700 บาท) โดยเทียบจากโซน SingaporeRegion
หากสนใจรายละเอียดเพิ่มเติมสามารถดูได้ที่ลิ้งค์ด้านล่างนี้
https://aws.amazon.com/th/elasticloadbalancing/pricing/
โดยเราจะขออธิบายเกี่ยวกับคำศัพท์ในเว็บเผื่อจะทำให้คุณเข้าใจมากขึ้นเกี่ยวกับ Load Balancer ของ AWS

อธิบายเกี่ยวกับคำศัพท์

・ELB (Elastic Load Balancig)
ชื่อ Service ของ AWS

・ALB(Application Load Balancer)
Load Balancer ชนิดนึงของ ELB ถูกออกแบบมาให้ใช้กับเว็บไซต์

・นอกจากนี้ ELB ยังมี「Gateway Load Balancer」「Network Load Balancer」ที่เป็น
Load Balancer ชนิดอื่นอยู่อีก

สรุป

จากการทดลองทำให้เรารู้ว่าเจ้าตัว ALB นี้จะมีประโยชน์เมื่อ เราใช้ Instance 2 ตัวขึ้นไปในการเชื่อมต่อ
ALB จะแบ่งการเชื่อมต่อจาก Traffic ไปยังแต่ละ Instance ทำให้เมื่อ Instance 1 ตัว เกิดการอัพเดท
หรือเซิร์ฟเวอร์มีปัญหาไม่สามารถเชื่อมต่อได้ ALB จะปรับการเชื่อมต่อไปยัง Instance อื่นที่ยังสามารถใช้งานได้โดยอัตโนมัติ
และเมื่อ Instance นั้นกลับมาใช้งานได้ ALB ก็จะปรับให้กลับให้สามารถเชื่อมต่อได้โดยอัตโนมัติเช่นกันครับ

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

Amazon ALB (Application Load Balancer) คืออะไร? การแนะนำฟังก์ชันล่าสุดของ AWS ในปี 2022
ทำความรู้จักกับ ALB, NLB, GLB ของ ELB(Elastic Load Balancing) ในเบื้องต้น
【Update】วิธีติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
วิธีแก้ปัญหาการเชื่อมต่อ Security Group
การสร้าง VPC Beginner และเชื่อมต่อกับ EC2 Instance
การใช้ AMI เพื่อ Copy ข้อมูลของ EC2 Instance
Elastic Load Balancing Official Website