การมอบอำนาจการจัดการ SubDomain ไปยัง Hostzone ใหม่ข้าม Account ผ่าน Route53
Tags: route53, dns, management
Published: 2022-03-28 08:24:56

Public Domain Name ถือเป็นส่วนหนึ่งของ Brand Identify ที่สำคัญมาก ในการทำ Website หรือ Application ต่าง ๆ ซึ่งมีผลต่อการที่จะทำให้ผู้ใช้งานรับทราบได้ว่า Website นั้น ๆ เป็นของทีมของเราหรือไม่ รวมถึงเป็นหนึ่งในจุดตรวจสอบว่า Link ที่กดเป็น Phishing หรือไม่

สำหรับทีมที่มีขนาดใหญ่ขึ้น มีระบบต่าง ๆ เพิ่มขึ้นมา จำเป็นต้องใช้ public domain name แยกย่อยออกไปจำนวนมาก ไม่ว่าจะเป็นของผลิตภัณฑ์หรือของทีมต่าง ๆ ภายในการจะจัดการ DNS ที่จุดเดียว อาจจะต้องมีขั้นตอนการขออนุญาตหรือรอเพื่อให้ฝ่ายที่ดูแลเป็นคนจัดการให้ เพื่อความปลอดภัยหรือความเหมาะสมของการใช้งานชื่อที่เป็น identity ขององค์กร ซึ่งส่งผลให้การคิดหรือทำสิ่งใหม่ ๆ ทำได้ยากขึ้นไปด้วย ดังนั้นบทความนี้จะเสนอทางเลือกง่าย ๆ ของการจัดการ Domain Name ภายในองค์กร

> **หมายเหตุ** การจัดการ Domain ที่กล่าวถึงในทบความนี้จะยกเว้นเรื่องของ Policy ของแต่ละองค์กร โดยคำนึงถึงเรื่องความสะดวกในการพัฒนาเป็นหลัก

เมื่อองค์กรมีขนาดใหญ่ขึ้น มีการแยกทีมย่อยออกไป สำหรับองค์กรที่ใช้ AWS มักจะมีการสร้าง Organization และสร้าง Account แยกจากกันออกไปตามทีมต่าง ๆ  ซึ่งในสถานการณ์ที่มีองค์กรมี public domain เดียว การที่จะจัดการโดยส่วนมากจะมีวิธีดังต่อไปนี้
1. Domain อยู่ภายใต้การควบคุมของ Account หลักที่เดียว ซึ่งการจัดการจะมีรูปแบบที่นิยมกันดังนี้
  * มีคนหรือทีมที่จัดการดูแล DNS แยกออกมาเพื่อให้ทีมอื่นขอให้จัดการให้
  * สร้าง Assume Role เพื่อให้แต่ละทีมเข้ามาจัดการ DNS โดยตรง
2. Subdomain delegation เป็นการมอบอำนาจการควบคุม subdomain ตั้งแต่ level 3 เป็นต้นไปให้กับ DNS อื่น เพื่อให้สามารถควบคุม subdomain ย่อยลงไปได้อีก
![Domain Level](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/se3ix50l9wytn3030xya.png)

ซึ่งวิธีที่บทความนี้กล่าวถึงคือ Subdomain delegation ด้วย Route53 ระหว่าง 2 AWS Accounts ซึ่งวิธีการดังกล่าวเป็นมาตรฐานของ DNS สามารถทำได้กับ DNS อื่นด้วยเช่นกัน

##การเตรียมพร้อม
1. 2 AWS Accounts คือ Domain Account และ Subdomain Account
2. Domain name ที่ใช้บริการ DNS บน hosted zone ของ Route53 บน Domain Account ซึ่งตัวอย่างนี้จะใช้ `lawlity.com`
3. หน้า HTML เพื่อใช้ทดสอบบน Subdomain Account โดยสร้าง S3 static website ชื่อ bucket `dns.sub.lawlity.com` ไว้เพื่อทดสอบ [ใช้อันนี้ก็ได้](https://gist.github.com/teer823/df98f4047d3d0eff5940e42fcc8ae017)
ในการสร้าง S3 Static Website เพื่อเชื่อมกับ DNS record ด้วย Alias จะต้องสร้าง bucket name ให้ตรงกับ dns record ที่ต้องการ เช่น กรณีตัวอย่างจะสร้าง S3 bucket ชื่อ `dns.sub.lawlity.com`
![S3 Bucket](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pdaj7dmsewc5fxccq8f8.png)
![Sample Static Site](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpzjhci70mht53jybazh.png)


##ค่าใช้จ่ายเพิ่มเติม
1. ค่า Hosted zone บน Subdomain Account 0.50 USD ต่อเดือน 
2. ค่า Query 0.40 USD ต่อ 1 ล้าน Queries ต่อเดือน


##ขั้นตอนการสร้าง Subdomain Delegation
ในตัวอย่างจะเป็นการสร้างมอบการควบคุม `sub.lawlity.com` จาก Domain Account ไปให้ Subdomain Account และสร้าง A record alias เพื่อแสดง Static Website ที่สร้างไว้

1. สร้าง Public hosted zone บน Route53 ใน Subdomain Account
![Create public hosted zone](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5adm7c3twaxhxr2llis2.png)
2. เมื่อสร้างเสร็จแล้วจะมี NS และ SOA record โดยค่า NS Record คือค่าที่เราจะนำไปใช้ต่อ บน Domain Account ในขั้นตอนที่ 3
![Default record for hosted zone](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1w9qok9vx470ftd3mubk.png)
3. เปลี่ยนไป Route53 ของ Domain Account และสร้าง Record ใหม่ประเภท NS โดยใส่ค่าเป็น NS ของ public hosted zone ที่สร้างไว้ในขั้นตอนที่ 2
![Add NS Record to domain account](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gfkvh6i4qvd4u0s55dg8.png)
4. เปลี่ยนกลับมา Route53 ของ Subdomain Account เพื่อทำการสร้าง Alias Record เพื่อชี้ไปยัง S3 Static Website เตรียมไว้
![Create Alias record](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llvw98k3y14u5n6evfv4.png)
5. ทำการทดสอบเข้า lv4 domain `dns.sub.lawlity.com` ที่สร้างไว้ในขั้นตอนที่ 4 (ในกรณีที่ยังเข้าไม่ได้ต้องรอซักพักเพื่อให้ DNS ทำการอัพเดทก่อน)
![Visit new subdomain](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x0v03kjvfxrgzi0qi390.png)

## สรุปประโยชน์ของการทำ Subdomain Delegation
ด้วยวิธีการง่าย ๆ ข้างต้นโดยใช้ความสามารถพื้นฐานของ DNS ที่หลาย ๆ คนยังไม่เคยใช้งานอย่างการทำ Subdomain Delegation จะช่วยให้สามารถกระจายการจัดการ Subdomain ให้กับทีม หรือ App ต่าง ๆ ในองค์กร ทำให้การติดตั้งระบบ การปรับเปลียนแก้ไขหรือการพัฒนาระบบใหม่ ๆ สามารถทำได้รวดเร็วขึ้น โดยที่การควบคุม Domain หลักที่เป็น identity ขององค์กร ยังอยู่ภายใต้ Account หลักตามเดิมได้