การเพิ่ม Custom Headers ใน CloudFront ไปยัง Origin Requests ของ ELB (ALB)

การเพิ่ม Custom Headers จะทำให้ผู้ใช้สามารถเข้าถึง Application Load Balancer ผ่าน CloudFront เท่านั้น เช่นในตอนแรกเราสามารถเข้าถึงโดยตรงจาก URL ของ Environment และ DNS name ของ Load Balancers ได้ แต่หลังจากตั้งค่าแล้ว URL เหล่านี้จะถูกปิดกั้นการเข้าถึงนั่นเอง

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

POP จากบริษัท Classmethod (Thailand) ครับ

สำหรับเว็บแอปพลิเคชันหรือเนื้อหาอื่นๆ ที่ให้บริการโดย Application Load Balancer ใน Elastic Load Balancing นั้น CloudFront สามารถแคชอ็อบเจ็กต์และให้บริการแก่ผู้ใช้โดยตรงได้ ซึ่งจะช่วยลด load ใน Application Load Balancer ของเรา นอกจากนี้ CloudFront ยังสามารถช่วยลดเวลาแฝงและแม้กระทั่งป้องกันการโจมตีแบบปฏิเสธการให้บริการ (DDoS) แบบกระจายได้

อย่างไรก็ตาม หากผู้ใช้สามารถเลี่ยงผ่าน CloudFront และเข้าถึง Application Load Balancer ของเราได้โดยตรง เราก็จะไม่ได้รับสิทธิประโยชน์เหล่านี้ แต่เราสามารถตั้งค่า Amazon CloudFront และ Application Load Balancer เพื่อป้องกันไม่ให้ผู้ใช้เข้าถึง Application Load Balancer โดยตรงได้ เพราะการตั้งค่านี้จะทำให้ผู้ใช้สามารถเข้าถึง Application Load Balancer ผ่าน CloudFront ได้เพียงช่องทางเดียวเท่านั้น ซึ่งเราจะได้รับประโยชน์จากการใช้ CloudFront ด้วยการตั้งค่าเหล่านี้

เพื่อป้องกันไม่ให้ผู้ใช้เข้าถึง Application Load Balancer โดยตรงและอนุญาตการเข้าถึงผ่าน CloudFront เท่านั้น ให้ทำการตั้งค่าตามขั้นตอนของบทความนี้ได้เลยครับ

สำหรับข้อมูลเพิ่มเติม ให้ดูที่ลิงก์ด้านล่างนี้

สิ่งที่ต้องมี

1. ต้องมี Load Balancers ใน EC2

เราสามารถสร้าง Load Balancers ใน EC2 หรือสร้างใน Elastic Beanstalk ก็ได้ ขอแค่ให้เป็น Load Balancers ก็ใช้ได้แล้ว ซึ่งการใช้งาน Elastic Load Balancing ปัจจุบันมีอยู่ 4 ประเภท แต่การสาธิตครั้งนี้ผมจะใช้วิธีการสร้าง Load Balancers แบบ ALB (Application Load Balancer) ใน Elastic Beanstalk โดยใช้งานอยู่ใน Region Singapore ครับ

สำหรับผู้ใช้งานที่ต้องการเรียนรู้การเริ่มต้นใช้งาน Elastic Load Balancing ผมจะแปะลิงก์ไว้ให้ด้านล่างนี้ครับ

การสร้าง Load Balancers ใน Elastic Beanstalk

การสร้าง Load Balancers ใน EC2

สำหรับการ Deploy Laravel ด้วย Elastic Beanstalk ดูได้ที่ลิงก์นี้

2. ต้องมี CloudFront ที่เชื่อมต่อกับ Load Balancers

ตรวจสอบ URL ก่อนตั้งค่า

URL ที่จะทำการตรวจสอบก็จะมีดังนี้
・URL ของ Elastic Beanstalk
・DNS name ของ Load Balancers
・Distribution domain name ของ CloudFront

URL ของ Elastic Beanstalk
เปิด Service Elastic Beanstalk แล้วเข้าไปที่หน้า Environment ของเรา แล้วคลิก url ได้เลย

http://[Environment name].[Active Region].elasticbeanstalk.com

DNS name ของ Load Balancers
เปิด Service EC2 แล้วเข้าไปที่หน้า Load Balancers ของเรา แล้วคัดลอก DNS name ไปวางในบราวเซอร์ที่เราใช้งาน

http://awseb-awseb-xxxxxxxxxx-xxxxxxxxxx.ap-southeast-1.elb.amazonaws.com/

Distribution domain name ของ CloudFront
เปิด Service CloudFront แล้วเข้าไปที่หน้า Distributions ของเรา แล้วคัดลอก Distribution domain name ไปวางในบราวเซอร์ที่เราใช้งาน

https://xxxxxxxxxx.cloudfront.net

ตั้งค่า Custom Headers ใน CloudFront

เราจะทำการตั้งค่า CloudFront โดยเพิ่ม Custom Header ให้กับคำขอที่ส่งไปยัง Application Load Balancer

เข้ามาที่ CloudFront > Distributions > ID ของเรา
จากนั้นเลือกหัวข้อOriginsแล้วติ๊กที่ ⦿ Origin name ของเรา และคลิกEdit

เลื่อนลงมาด้านล่างสุดที่หัวข้อ Add custom header - optional แล้วคลิกAdd header

จากนั้นกำหนด Header name และ Value ตามที่เราต้องการ เช่น
Header name:ELB-CustomHeader
Value:loadbalance
แล้วกดSave changesการตั้งค่านี้ก็เสร็จเรียบร้อย (แนะนำให้บันทึกค่านี้ไว้ด้วยเพื่อใช้ในขั้นตอนถัดไป)

ตั้งค่า Rules ใน Load Balancers

เราจะทำการตั้งค่า Application Load Balancer เพื่อส่งต่อคำขอที่มี HTTP header ที่กำหนดเองเท่านั้น โดยเพิ่ม Rule ใหม่สำหรับ Custom Headers ของ CloudFront และแก้ไข Rule (default) เพื่อบล็อกการเข้าถึงที่ไม่ผ่าน CloudFront ทั้งหมด

ผมได้ทำการสร้าง Load Balancers ไว้ก่อนหน้านี้ใน Region Singapore ดังนั้นผมจะทำการตั้งค่าใน Region Singapore

เพิ่ม Rules สำหรับ Custom Headers

เข้ามาที่ EC2 > Load Balancers
จากนั้นติ๊กที่awseb-AWSEB-xxxxxxxxxxxxx (Name ของเรา) ก็จะมีรายละเอียดแสดงที่ด้านล่าง
แล้วเลือกหัวข้อListenersก็จะมีรายละเอียดแสดงขึ้นมา ทีนี้ให้ดูที่คอลัมน์ Rules แล้วคลิกView/edit rulesได้เลย

แล้วเลือกหัวข้อ+และคลิก+ Insert Ruleแล้วจะมี Rule ใหม่เพิ่มขึ้นมา

แล้วดูที่คอลัมน์ IF(all match) ให้คลิก+ Add condition ⌵แล้วเลือกHttp header...

แล้วจะมีช่องให้ใส่ Header name และ Value ให้ใส่เหมือนกับตอนที่เราตั้งค่าใน CloudFront เมื่อสักครู่นี้ (ต้องใส่ข้อมูลให้ตรงกันเท่านั้น) แล้วคลิก

ถัดมาดูที่คอลัมน์ THEN ให้คลิก+ Add action ⌵แล้วเลือกForward to...

แล้วเลือก Target group ของเรา เช่นawseb-AWSEB-xxxxxxxxxxxxและคลิก

เมื่อเสร็จแล้วจะแสดงแบบนี้ ให้ตรวจสอบความถูกต้องและคลิกSaveได้เลย

แก้ไข Rules (default) บล็อกการเข้าถึงที่ไม่ผ่าน CloudFront

การแก้ไข Rules นี้คือการบล็อกการเข้าถึงที่ไม่ผ่าน CloudFront ทั้งหมด เราจะสามารถใช้ Distribution domain name ของ CloudFront ในการเข้าถึงหน้าเว็บไซต์ได้เพียงช่องทางเดียวเท่านั้น

URL ที่จะถูกบล็อกมีดังนี้
・URL ของ Elastic Beanstalk
・DNS name ของ Load Balancers

คลิกไอคอน?ที่แท็บด้านบน แล้วคลิกไอคอน?last HTTP 80: default action

คลิกไอคอน?️

คลิก+ Add action ⌵แล้วเลือกReturn fixed response...

แล้วลองตั้งค่าตามนี้
Response code:403
Content-Type:text/plain(กรณีที่ใส่ Error message เป็นข้อความธรรมดาให้เลือกแบบนี้)
Response body:Access Denied(ใส่ข้อความอะไรก็ได้ ข้อความที่เราใส่จะแสดงเป็น Error message ในหน้าที่ถูกบล็อกการเข้าถึงตามนี้)
แล้วคลิก

ตรวรสอบความถูกต้องและคลิกUpdateได้เลย

เมื่อเสร็จแล้วจะแสดงแบบนี้

หลังจากที่เราทำการตั้งค่าเหล่านี้แล้ว ผู้ใช้จะสามารถเข้าถึง Application Load Balancer ผ่าน CloudFront เท่านั้น ต่อไปเราจะทำการตรวจสอบ URL กันครับ

ตรวจสอบ URL หลังตั้งค่า

URL ที่จะทำการตรวจสอบก็จะมีดังนี้
・URL ของ Elastic Beanstalk
・DNS name ของ Load Balancers
・Distribution domain name ของ CloudFront

URL ของ Elastic Beanstalk
เปิด URL ของ Elastic Beanstalk ก็จะแสดง Error ตามที่เราได้ตั้งค่าไว้

http://[Environment name].[Active Region].elasticbeanstalk.com

DNS name ของ Load Balancers
เปิด DNS name ของ Load Balancers ก็จะแสดง Error ตามที่เราได้ตั้งค่าไว้

http://awseb-awseb-xxxxxxxxxx-xxxxxxxxxx.ap-southeast-1.elb.amazonaws.com/

Distribution domain name ของ CloudFront
เปิด Distribution domain name ของ CloudFront ก็จะเห็นว่าสามารถเข้าถึงหน้าเว็บไซต์ได้

https://xxxxxxxxxx.cloudfront.net

สรุป

ผมได้ตั้งค่า CloudFront เพื่อเพิ่ม Custom Headers ให้กับคำขอที่ส่งไปยัง Application Load Balancer และตั้งค่า Application Load Balancer เพื่อส่งต่อคำขอที่มี HTTP header ที่กำหนดเองเท่านั้น แล้วจะทำให้ผู้ใช้สามารถเข้าถึง Application Load Balancer ผ่าน CloudFront ได้เท่านั้น

หลังจากที่ผมได้ลองใช้จริงๆแล้ว โดยส่วนตัวผมคิดว่าเป็นฟังก์ชันที่ดีและทำให้ผมรู้สึกชอบฟังก์ชันนี้มากๆ เพราะจะทำให้เว็บไซต์ของเราลดโอกาสที่จะถูกโจมตีจากการเข้าถึงที่ไม่ได้รับอนุญาต แล้วเว็บไซต์ของเราก็จะมีความปลอดภัย ซึ่งผมอยากให้ผู้ใช้งาน AWS ได้รับสิทธิประโยชน์จากการใช้งาน CloudFront ดีๆแบบนี้ ยังไงก็ลองใช้งานกันดูนะครับ

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

POP จากบริษัท Classmethod (Thailand) ครับ !

Link อ้างอิง