Skip to content

Amazon Route 53 — Theory (Bản gốc slide / Original slide)

1. DNS là gì? (What is DNS?)

  • DNS (Domain Name System) = hệ thống dịch tên miền thân thiện với con người thành địa chỉ IP của máy
  • Ví dụ: www.google.com172.217.18.36
  • DNS là xương sống của Internet
  • DNS dùng cấu trúc đặt tên phân cấp (hierarchical): .comexample.comwww.example.com, api.example.com
  • DNS (Domain Name System) translates human-friendly hostnames into machine IP addresses
  • Example: www.google.com172.217.18.36
  • DNS is the backbone of the Internet
  • DNS uses a hierarchical naming structure: .comexample.comwww.example.com, api.example.com

2. Thuật ngữ DNS (DNS Terminologies)

  • Domain Registrar (nơi đăng ký tên miền): Amazon Route 53, GoDaddy, …
  • DNS Records: A, AAAA, CNAME, NS, …
  • Zone File: chứa các DNS record
  • Name Server: giải quyết (resolve) các truy vấn DNS — Authoritative hoặc Non-Authoritative
  • Top Level Domain (TLD): .com, .us, .in, .gov, .org, …
  • Second Level Domain (SLD): amazon.com, google.com, …

Cấu trúc một URL: http://api.www.example.com.

  • httpProtocol
  • api.wwwSub Domain
  • exampleSLD
  • .comTLD
  • dấu . cuối → Root
  • toàn bộ = FQDN (Fully Qualified Domain Name)
  • Domain Registrar: Amazon Route 53, GoDaddy, …
  • DNS Records: A, AAAA, CNAME, NS, …
  • Zone File: contains the DNS records
  • Name Server: resolves DNS queries — Authoritative or Non-Authoritative
  • Top Level Domain (TLD): .com, .us, .in, .gov, .org, …
  • Second Level Domain (SLD): amazon.com, google.com, …

URL structure: http://api.www.example.com.

  • httpProtocol
  • api.wwwSub Domain
  • exampleSLD
  • .comTLD
  • trailing .Root
  • the whole thing = FQDN (Fully Qualified Domain Name)

3. DNS hoạt động thế nào? (How DNS Works)

Web Browserwants example.comLocal DNSServer (ISP)Root DNS ServerTLD DNS Server (.com)SLD (example.com)query
  1. Trình duyệt muốn truy cập example.com → hỏi Local DNS Server (do công ty gán hoặc ISP cấp)
  2. Local DNS Server hỏi Root DNS Server (quản lý bởi ICANN) → trả về NS của TLD .com
  3. Hỏi TLD DNS Server (.com, quản lý bởi IANA) → trả về NS của SLD example.com
  4. Hỏi SLD DNS Server (quản lý bởi Domain Registrar) → trả về IP 9.10.11.12
  5. Local DNS Server cache kết quả (theo TTL) và trả về cho trình duyệt → trình duyệt kết nối tới Web Server
  1. Browser wants example.com → asks the Local DNS Server (assigned by your company or ISP)
  2. Local DNS Server asks the Root DNS Server (managed by ICANN) → returns the NS for TLD .com
  3. Asks the TLD DNS Server (.com, managed by IANA) → returns the NS for SLD example.com
  4. Asks the SLD DNS Server (managed by the Domain Registrar) → returns the IP 9.10.11.12
  5. Local DNS Server caches the result (per TTL) and returns it → the browser connects to the Web Server

4. Amazon Route 53 — Tổng quan (Overview)

  • Một dịch vụ DNS highly available, scalable, fully managed và Authoritative
    • Authoritative = bạn (khách hàng) có thể cập nhật các DNS record
  • Route 53 cũng là một Domain Registrar
  • Có khả năng kiểm tra sức khỏe (health check) tài nguyên
  • dịch vụ AWS duy nhất cung cấp SLA 100% availability
  • Vì sao tên là "53"? → tham chiếu port DNS truyền thống là 53
  • A highly available, scalable, fully managed and Authoritative DNS service
    • Authoritative = you (the customer) can update the DNS records
  • Route 53 is also a Domain Registrar
  • Ability to check the health of your resources
  • The only AWS service that provides a 100% availability SLA
  • Why "53"? → a reference to the traditional DNS port 53

5. Route 53 — Records & Record Types

Mỗi record định nghĩa cách route traffic cho một domain, gồm:

  • Domain/subdomain Name — ví dụ example.com
  • Record Type — ví dụ A hoặc AAAA
  • Value — ví dụ 12.34.56.78
  • Routing Policy — cách Route 53 phản hồi truy vấn
  • TTL — thời gian record được cache tại DNS Resolver

Các Record Type cần biết:

  • A — map hostname → IPv4
  • AAAA — map hostname → IPv6
  • CNAME — map hostname → một hostname khác
    • Target phải có record A hoặc AAAA
    • KHÔNG tạo được CNAME cho top node của namespace (Zone Apex), ví dụ không tạo cho example.com, nhưng tạo được cho www.example.com
  • NS — Name Servers cho Hosted Zone; kiểm soát cách route traffic cho domain
  • (Nâng cao) CAA / DS / MX / NAPTR / PTR / SOA / TXT / SPF / SRV

Each record defines how to route traffic for a domain, containing:

  • Domain/subdomain Name — e.g., example.com
  • Record Type — e.g., A or AAAA
  • Value — e.g., 12.34.56.78
  • Routing Policy — how Route 53 responds to queries
  • TTL — how long the record is cached at DNS Resolvers

Record types you must know:

  • A — maps a hostname → IPv4
  • AAAA — maps a hostname → IPv6
  • CNAME — maps a hostname → another hostname
    • The target must have an A or AAAA record
    • CANNOT be created for the top node of a namespace (Zone Apex), e.g., not for example.com, but OK for www.example.com
  • NS — Name Servers for the Hosted Zone; controls how traffic is routed for a domain
  • (Advanced) CAA / DS / MX / NAPTR / PTR / SOA / TXT / SPF / SRV

6. Route 53 — Hosted Zones (Public vs Private)

  • Hosted Zone = một container chứa các record định nghĩa cách route traffic tới một domain và các subdomain của nó
  • Public Hosted Zone: chứa record định nghĩa cách route traffic trên Internet (public domain), ví dụ application1.mypublicdomain.com
  • Private Hosted Zone: chứa record định nghĩa cách route traffic trong một hoặc nhiều VPC (private domain), ví dụ application1.company.internal
  • Chi phí: $0.50/tháng cho mỗi hosted zone
  • A Hosted Zone is a container for records that define how to route traffic to a domain and its subdomains
  • Public Hosted Zone: records that define how to route traffic on the Internet (public domains), e.g., application1.mypublicdomain.com
  • Private Hosted Zone: records that define how to route traffic within one or more VPCs (private domains), e.g., application1.company.internal
  • Cost: $0.50/month per hosted zone
Public Hosted ZoneClientPublicHosted Zoneexample.com?54.22.33.44VPCS3CloudFrontEC2Public IPALBPrivate Hosted ZoneVPCPrivateHosted ZoneEC2webapp.internalEC2api.internalRDSdb.internal10.0.0.1010.0.0.35*.example.internal → private IP (chỉ trong VPC / VPC-only)

Đọc sơ đồ:

  • Public Hosted Zone (trái): client trên Internet hỏi example.com? → Route 53 trả về public IP (54.22.33.44); zone này định tuyến tới các tài nguyên public như S3, CloudFront, EC2 (Public IP), ALB → ai cũng phân giải được
  • Private Hosted Zone (phải): chỉ hoạt động bên trong VPC; các tên *.example.internal phân giải ra private IP (ví dụ webapp gọi api.internal10.0.0.10, api gọi db.internal10.0.0.35 tới RDS) → không truy cập được từ ngoài Internet

Reading the diagram:

  • Public Hosted Zone (left): an internet client asks example.com? → Route 53 returns a public IP (54.22.33.44); the zone routes to public resources like S3, CloudFront, EC2 (Public IP), ALB → anyone can resolve it
  • Private Hosted Zone (right): works only inside the VPC; *.example.internal names resolve to private IPs (e.g., webapp calls api.internal10.0.0.10, api calls db.internal10.0.0.35 to RDS) → not reachable from the public Internet

7. Route 53 — TTL (Time To Live)

  • Client cache kết quả DNS trong khoảng TTL của record
  • High TTL (ví dụ 24 giờ):
    • Ít traffic tới Route 53
    • Record có thể bị lỗi thời (outdated)
  • Low TTL (ví dụ 60 giây):
    • Nhiều traffic tới Route 53 ($$)
    • Record ít bị lỗi thời hơn, dễ thay đổi
  • Trừ Alias record, TTL là bắt buộc cho mỗi DNS record

💡 Trước khi thay đổi lớn (đổi IP), nên hạ TTL trước để client cập nhật nhanh.

  • Clients cache the DNS result for the record's TTL
  • High TTL (e.g., 24 hr):
    • Less traffic to Route 53
    • Records may be outdated
  • Low TTL (e.g., 60 sec):
    • More traffic to Route 53 ($$)
    • Records are outdated for less time, easy to change
  • Except for Alias records, TTL is mandatory for each DNS record

💡 Before a big change (IP change), lower the TTL first so clients update quickly.

8. CNAME vs Alias

Các AWS resource (Load Balancer, CloudFront…) expose một hostname của AWS, ví dụ lb1-1234.us-east-2.elb.amazonaws.com, và bạn muốn dùng myapp.mydomain.com.

CNAMEAlias
Trỏ tớiBất kỳ hostname nàoMột AWS resource
Zone Apex (root domain)Chỉ non-root (something.mydomain.com)Cả root & non-root (mydomain.com)
Chi phíTính phí queryMiễn phí
Health checkKhông nativeNative health check
TTLBạn đặtKhông đặt được (AWS tự quản)

AWS resources (Load Balancer, CloudFront…) expose an AWS hostname, e.g., lb1-1234.us-east-2.elb.amazonaws.com, and you want myapp.mydomain.com.

CNAMEAlias
Points toAny hostnameAn AWS resource
Zone Apex (root domain)Non-root only (something.mydomain.com)Root & non-root (mydomain.com)
CostQuery chargedFree
Health checkNot nativeNative health check
TTLYou set itCannot set (AWS-managed)

9. Route 53 — Alias Records

  • Map một hostname tới một AWS resource; là phần mở rộng của DNS
  • Tự động nhận biết thay đổi IP của resource
  • Khác CNAME, dùng được cho top node (Zone Apex), ví dụ example.com
  • Alias record luôn có type A/AAAA cho AWS resource
  • Không đặt được TTL

Alias Record Targets (những gì Alias có thể trỏ tới):

  • Elastic Load Balancers
  • CloudFront Distributions
  • API Gateway
  • Elastic Beanstalk environments
  • S3 Websites
  • VPC Interface Endpoints
  • Global Accelerator accelerator
  • Route 53 record trong cùng hosted zone

⚠️ KHÔNG thể đặt Alias record trỏ tới một EC2 DNS name.

  • Maps a hostname to an AWS resource; an extension to DNS
  • Automatically recognizes changes in the resource's IPs
  • Unlike CNAME, works for the top node (Zone Apex), e.g., example.com
  • Alias records are always type A/AAAA for AWS resources
  • You can't set the TTL

Alias Record Targets:

  • Elastic Load Balancers
  • CloudFront Distributions
  • API Gateway
  • Elastic Beanstalk environments
  • S3 Websites
  • VPC Interface Endpoints
  • Global Accelerator accelerator
  • A Route 53 record in the same hosted zone

⚠️ You cannot set an Alias record for an EC2 DNS name.

10. Route 53 — Routing Policies (Tổng quan)

  • Routing Policy định nghĩa cách Route 53 phản hồi các truy vấn DNS
  • ⚠️ Đừng nhầm chữ "Routing" ở đây với routing của Load Balancer: DNS không route traffic, nó chỉ trả lời truy vấn DNS
  • Route 53 hỗ trợ các routing policy:
    • Simple
    • Weighted
    • Failover
    • Latency-based
    • Geolocation
    • Multi-Value Answer
    • Geoproximity (dùng tính năng Route 53 Traffic Flow)
    • IP-based
  • A Routing Policy defines how Route 53 responds to DNS queries
  • ⚠️ Don't confuse "Routing" here with Load Balancer routing: DNS does not route traffic, it only responds to DNS queries
  • Route 53 supports these routing policies:
    • Simple
    • Weighted
    • Failover
    • Latency-based
    • Geolocation
    • Multi-Value Answer
    • Geoproximity (uses the Route 53 Traffic Flow feature)
    • IP-based

11. Routing Policy — Simple

  • Thường dùng để route traffic tới một resource duy nhất
  • Có thể chỉ định nhiều value trong cùng một record → client chọn ngẫu nhiên một value
  • Khi bật Alias, chỉ được chỉ định một AWS resource
  • KHÔNG thể gắn với Health Check
  • Typically routes traffic to a single resource
  • Can specify multiple values in the same record → the client picks one at random
  • When Alias is enabled, you can specify only one AWS resource
  • CANNOT be associated with Health Checks

12. Routing Policy — Weighted

  • Kiểm soát % request đi tới mỗi resource; gán mỗi record một trọng số (weight) tương đối
  • Công thức: traffic(%) = weight của record / tổng weight của tất cả record
  • Weight không cần cộng bằng 100
  • Các record phải cùng name và cùng type
  • Có thể gắn với Health Checks
  • Use case: load balancing giữa các region, test phiên bản mới của ứng dụng…
  • Gán weight = 0 để ngừng gửi traffic tới một resource; nếu tất cả đều 0 thì mọi record được trả về đều nhau
  • Controls the % of requests going to each resource; assign each record a relative weight
  • Formula: traffic(%) = weight of a record / sum of all weights
  • Weights don't need to sum to 100
  • Records must have the same name and type
  • Can be associated with Health Checks
  • Use cases: load balancing between regions, testing new versions of an app…
  • Set weight = 0 to stop sending traffic to a resource; if all are 0, records are returned equally

13. Routing Policy — Latency-based

  • Route tới resource có độ trễ (latency) thấp nhất so với người dùng
  • Rất hữu ích khi latency là ưu tiên
  • Latency dựa trên traffic giữa user và các AWS Region
  • Ví dụ: user ở Đức có thể được trỏ tới US nếu đó là nơi có latency thấp nhất
  • Có thể gắn với Health Checks (có khả năng failover)
  • Routes to the resource with the lowest latency relative to the user
  • Very helpful when latency is a priority
  • Latency is based on traffic between users and AWS Regions
  • Example: users in Germany may be directed to the US if that has the lowest latency
  • Can be associated with Health Checks (has failover capability)

14. Routing Policy — Failover (Active-Passive)

ClientAmazon Route 53EC2 — PrimaryHealth Check (mandatory)EC2 — SecondaryDisaster Recoveryhealthyfailover
  • Mô hình Active-Passive: có một Primary và một Secondary (Disaster Recovery)
  • Health Check trên Primary là BẮT BUỘC
  • Khi Primary unhealthy → Route 53 tự động failover, trả về Secondary
  • An Active-Passive setup: a Primary and a Secondary (Disaster Recovery)
  • A Health Check on the Primary is MANDATORY
  • When the Primary is unhealthy → Route 53 fails over and returns the Secondary

15. Routing Policy — Geolocation, Geoproximity, IP-based, Multi-Value

Geolocation:

  • Khác với Latency-based! Route dựa trên vị trí của user
  • Chỉ định vị trí theo Continent, Country, hoặc US State (nếu chồng lấn, chọn vị trí cụ thể nhất)
  • Nên tạo một record "Default" (khi không khớp vị trí nào)
  • Use case: localization website, giới hạn phân phối nội dung, load balancing…
  • Có thể gắn với Health Checks

Geoproximity:

  • Route dựa trên vị trí địa lý của cả user lẫn resource
  • Có thể dịch chuyển thêm traffic theo bias đã định nghĩa:
    • Mở rộng (1 → 99): nhiều traffic hơn tới resource
    • Thu hẹp (-1 → -99): ít traffic hơn
  • Resource có thể là AWS (chỉ định Region) hoặc non-AWS (chỉ định Lat/Long)
  • Phải dùng Route 53 Traffic Flow

IP-based Routing:

  • Route dựa trên địa chỉ IP của client
  • Bạn cung cấp danh sách CIDR → endpoint/location (user-IP-to-endpoint mappings)
  • Use case: tối ưu hiệu năng, giảm chi phí mạng; ví dụ route user của một ISP cụ thể tới một endpoint riêng

Multi-Value:

  • Dùng khi route tới nhiều resource; Route 53 trả về nhiều value
  • Có thể gắn Health Checks (chỉ trả về value của resource healthy)
  • Trả về tối đa 8 healthy record cho mỗi truy vấn Multi-Value
  • Không thay thế được ELB

Geolocation:

  • Different from Latency-based! Routes based on user location
  • Specify location by Continent, Country, or US State (if overlapping, the most precise wins)
  • Should create a "Default" record (when no location matches)
  • Use cases: website localization, restrict content distribution, load balancing…
  • Can be associated with Health Checks

Geoproximity:

  • Routes based on the geographic location of both users and resources
  • Can shift more traffic using a defined bias:
    • Expand (1 → 99): more traffic to the resource
    • Shrink (-1 → -99): less traffic
  • Resources can be AWS (specify Region) or non-AWS (specify Lat/Long)
  • Must use Route 53 Traffic Flow

IP-based Routing:

  • Routes based on the clients' IP addresses
  • You provide a list of CIDR → endpoint/location (user-IP-to-endpoint mappings)
  • Use cases: optimize performance, reduce network costs; e.g., route a specific ISP's users to a specific endpoint

Multi-Value:

  • Used to route to multiple resources; Route 53 returns multiple values
  • Can be associated with Health Checks (returns only healthy resources)
  • Returns up to 8 healthy records per Multi-Value query
  • Not a substitute for an ELB

16. Route 53 — Health Checks

  • HTTP Health Checks chỉ dành cho tài nguyên public
  • Health Check → Automated DNS Failover, có 3 loại:
    1. Health check monitor một endpoint (application, server, AWS resource)
    2. Health check monitor các health check khác (Calculated Health Checks)
    3. Health check monitor CloudWatch Alarms (full control!) — ví dụ throttle của DynamoDB, alarm trên RDS, custom metrics… (hữu ích cho tài nguyên private)
  • Health Checks được tích hợp với CloudWatch metrics

Monitor an Endpoint:

  • Khoảng 15 global health checker kiểm tra endpoint
  • Healthy/Unhealthy Threshold = 3 (mặc định)
  • Interval = 30 giây (có thể đặt 10 giây — tốn phí hơn)
  • Protocol hỗ trợ: HTTP, HTTPS, TCP
  • Nếu > 18% health checker báo healthy → Route 53 coi là Healthy
  • Health check pass chỉ khi endpoint trả về status 2xx / 3xx
  • Có thể pass/fail dựa trên text trong 5120 byte đầu của response
  • Phải cho phép incoming request từ dải IP của Route 53 Health Checkers trên firewall/router

Calculated Health Checks:

  • Kết hợp kết quả của nhiều health check thành một health check (parent)
  • Dùng OR, AND, NOT; monitor tối đa 256 child health check
  • Chỉ định bao nhiêu child cần pass để parent pass
  • Usage: bảo trì website mà không làm fail toàn bộ

Private Hosted Zones:

  • Health checker của Route 53 nằm ngoài VPCkhông truy cập được endpoint private
  • Giải pháp: tạo CloudWatch Metric + CloudWatch Alarm, rồi tạo Health Check giám sát chính alarm đó
  • HTTP Health Checks are only for public resources
  • Health Check → Automated DNS Failover, in 3 kinds:
    1. Health checks that monitor an endpoint (application, server, AWS resource)
    2. Health checks that monitor other health checks (Calculated Health Checks)
    3. Health checks that monitor CloudWatch Alarms (full control!) — e.g., DynamoDB throttles, RDS alarms, custom metrics… (helpful for private resources)
  • Health Checks are integrated with CloudWatch metrics

Monitor an Endpoint:

  • About 15 global health checkers check the endpoint
  • Healthy/Unhealthy Threshold = 3 (default)
  • Interval = 30 sec (can set 10 sec — higher cost)
  • Supported protocols: HTTP, HTTPS, TCP
  • If > 18% of health checkers report healthy → Route 53 considers it Healthy
  • A health check passes only when the endpoint returns 2xx / 3xx status codes
  • Can pass/fail based on the text in the first 5120 bytes of the response
  • You must allow incoming requests from the Route 53 Health Checkers' IP range on your firewall/router

Calculated Health Checks:

  • Combine results of multiple health checks into one (parent)
  • Use OR, AND, NOT; monitor up to 256 child health checks
  • Specify how many children must pass for the parent to pass
  • Usage: perform maintenance without failing all health checks

Private Hosted Zones:

  • Route 53 health checkers are outside the VPCcan't reach private endpoints
  • Solution: create a CloudWatch Metric + CloudWatch Alarm, then a Health Check that monitors that alarm

17. Domain Registrar vs. DNS Service

  • Bạn mua/đăng ký tên miền tại một Domain Registrar (thường trả phí hằng năm) — ví dụ GoDaddy, Amazon Registrar Inc.…
  • Domain Registrar thường kèm sẵn một DNS service để quản lý record
  • Nhưng bạn có thể dùng một DNS service khác để quản lý record
    • Ví dụ: mua domain ở GoDaddy nhưng dùng Route 53 để quản lý DNS record

Dùng registrar bên thứ 3 với Route 53:

  1. Tạo một Hosted Zone trong Route 53
  2. Cập nhật NS Records trên trang của registrar bên thứ 3 để trỏ tới Route 53 Name Servers

💡 Domain Registrar ≠ DNS Service — nhưng mọi Domain Registrar thường đi kèm một số tính năng DNS.

  • You buy/register a domain at a Domain Registrar (usually annual fees) — e.g., GoDaddy, Amazon Registrar Inc.…
  • A Domain Registrar usually includes a DNS service to manage records
  • But you can use a different DNS service to manage records
    • Example: buy the domain at GoDaddy but use Route 53 to manage DNS records

Using a 3rd-party registrar with Route 53:

  1. Create a Hosted Zone in Route 53
  2. Update the NS Records on the 3rd-party registrar's site to use Route 53 Name Servers

💡 Domain Registrar ≠ DNS Service — but every Domain Registrar usually comes with some DNS features.

18. Route 53 — Hybrid DNS

  • Mặc định, Route 53 Resolver tự động trả lời truy vấn DNS cho:
    • Local domain names của EC2 instance
    • Record trong Private Hosted Zones
    • Record trong public Name Servers
  • Hybrid DNS = giải quyết truy vấn DNS giữa VPC (Route 53 Resolver)các mạng khác của bạn (các DNS Resolver khác)
  • Các "mạng" đó có thể là:
    • Chính VPC / VPC được peer (Peered VPC)
    • Mạng on-premises (kết nối qua Direct Connect hoặc AWS VPN)

💡 Dùng khi bạn có hạ tầng lai (hybrid): một phần trên AWS, một phần ở data center riêng, và hai bên cần phân giải tên miền của nhau.

  • By default, the Route 53 Resolver automatically answers DNS queries for:
    • Local domain names of EC2 instances
    • Records in Private Hosted Zones
    • Records in public Name Servers
  • Hybrid DNS = resolving DNS queries between the VPC (Route 53 Resolver) and your other networks (other DNS Resolvers)
  • Those "networks" can be:
    • The VPC itself / a Peered VPC
    • An on-premises network (connected via Direct Connect or AWS VPN)

💡 Used for hybrid infrastructure: part on AWS, part in your own data center, where both sides need to resolve each other's domain names.

19. Route 53 — Resolver Endpoints

AWS — VPC (Route 53 Resolver)Inbound EPOutbound EPEC2app.aws.privateOn-Premises Data CenterDNS Resolversonpremise.privatequery aws.privateforward onpremise.privateVPN / Direct Connect
  • Inbound Endpoint (vào AWS):
    • Cho phép các DNS Resolver của bạn (ví dụ ở on-premises) phân giải tên miền của AWS — ví dụ EC2 instance và record trong Private Hosted Zone
    • Hướng: on-premises → AWS
  • Outbound Endpoint (ra ngoài AWS):
    • Route 53 Resolver forward các truy vấn DNS tới DNS Resolver của bạn (ví dụ on-premises), theo các resolver rule
    • Hướng: AWS → on-premises
  • Cả hai đi qua kết nối VPN hoặc Direct Connect
  • Inbound Endpoint (into AWS):
    • Lets your DNS Resolvers (e.g., on-premises) resolve AWS domain names — such as EC2 instances and records in Private Hosted Zones
    • Direction: on-premises → AWS
  • Outbound Endpoint (out of AWS):
    • Route 53 Resolver forwards DNS queries to your DNS Resolvers (e.g., on-premises), following resolver rules
    • Direction: AWS → on-premises
  • Both traverse a VPN or Direct Connect connection

Personal notes by thanhlt