Course-এর সূচি

8.2

CNAME বনাম Alias

zone apex-এ কেন CNAME রাখা যায় না, তার বদলে Alias কী করে, আর Alias কোন কোন জিনিসের দিকে দেখাতে পারে।

16 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই লেসন শেষে তুমি পারবে

  • Load balancer-এর মতো AWS resource কেন তোমাকে স্থির IP address না দিয়ে একটা hostname দেয়, আর তোমার DNS record-এর জন্য এর মানে কী, সেটা বুঝিয়ে বলতে।
  • DNS-এর নিয়ম দিয়ে ব্যাখ্যা করতে, zone apex (example.com) কেন কখনো CNAME হতে পারে না।
  • Alias record কী, Route 53 কীভাবে এর উত্তর দেয়, আর type, TTL, খরচ ও health-এর দিক থেকে CNAME-এর সাথে এর তফাত কোথায়, বলতে।
  • Alias কোন কোন AWS resource-এর দিকে দেখাতে পারে, প্রত্যেকটার জন্য কী শর্ত লাগে, আর কোথায় দেখাতে পারে না (EC2-এর DNS নাম, RDS endpoint), তার list মুখস্থ বলতে।
  • যেকোনো নাম আর target দেখে ঠিক record বেছে নিতে: Alias, Elastic IP দিয়ে A, নাকি CNAME; আর পরীক্ষার “গ্যারান্টিড” প্রশ্নটার উত্তর কয়েক সেকেন্ডে দিতে।

#এই প্রশ্ন পরীক্ষায় আসবেই কেন

Note-এ সোজাসুজি লেখা আছে: CNAME বনাম Alias থেকে একটা প্রশ্ন প্রায় নিশ্চিত। কখনো আলাদা করে আসে, আর তার চেয়েও বেশি আসে load balancer বা CloudFront-এর কোনো প্রশ্নের ভেতরে লুকিয়ে। মূল ধারণাটা ছোট, তাই একবার ঠিকঠাক বুঝে নাও।

#AWS তোমাকে দেয় একটা নাম, address না

তুমি যখন একটা Application Load Balancer বানাও (লেসন ৬.৩), AWS তোমার হাতে কোনো IP address দেয় না। দেয় একটা DNS নাম, এরকম:

my-alb-1234.us-east-1.elb.amazonaws.com

CloudFront দেয় d111111abcdef8.cloudfront.net, API Gateway দেয় …execute-api.us-east-1.amazonaws.com, S3 website দেয় …s3-website-us-east-1.amazonaws.com। প্রতিবার কারণ একটাই: এসব service-এর পেছনের IP address AWS-এর, আর সেগুলো বদলায়। Traffic বাড়লে load balancer নতুন node যোগ করে, কমলে সরিয়ে দেয়, আর কোনো node নষ্ট হলে বদলে ফেলে। প্রতিটা নতুন node আসে নতুন address নিয়ে। AWS নামটাকে সবসময় তখনকার address-গুলোর দিকে রাখে, ছোট TTL দিয়ে (load balancer-এর জন্য ৬০ সেকেন্ড), কিন্তু address নিয়ে কোনো কথা দেয় না।

অথচ তোমার user টাইপ করতে চায় তোমার নাম: example.com বা app.example.com। তাই তোমার hosted zone-এ এমন একটা record লাগবে, যেটা বলে “আমার এই নাম মানে AWS-এর ওই নাম”। এর জন্য DNS-এ একটা standard record আছে, CNAME; আর Route 53 নিজের একটা যোগ করেছে, Alias। কোনটা চলবে, সেটা নির্ভর করে নামটা কোথায় বসে আছে তার ওপর।

#CNAME: আরেকটা নামের দিকে ইশারা

CNAME (canonical name) record একটা hostname-কে আরেকটা hostname-এর সাথে জোড়ে, কোনো address-এর সাথে না। সাধারণভাবে এটা DNS লেসনে আছে; AWS-এ যেটুকু জরুরি, সেটা এখানে।

  • Resolver যখন www.example.com জিজ্ঞেস করে CNAME পায়, উত্তরটা হয় “এই নামটা আসলে my-alb-1234…elb.amazonaws.com”। তখন IP পেতে resolver-কে ওই দ্বিতীয় নামটাও খুঁজতে হয়। Cache খালি থাকলে মানে আরেকবার যাওয়া-আসা।
  • Target হতে পারে ইন্টারনেটের যেকোনো hostname: AWS-এর নাম, কোনো blogging company-র blog.example.net, কোনো SaaS shop। Target-টা Route 53-এ থাকার দরকার নেই।
  • CNAME ওই নামের সব type-এর query (A, AAAA, MX, TXT…) অন্য দিকে পাঠিয়ে দেয়, কারণ সে বলছে পুরো নামটাই অন্য কোথাও থাকে।
  • TTL তুমি ঠিক করো, আর CNAME query-র জন্য Route 53 টাকা নেয় (public hosted zone-এ প্রতি ১০ লাখে প্রায় $0.40)। CNAME যদি এমন record-এর দিকে দেখায় যেটাও Route 53-এ আছে, তাহলে প্রতিটা lookup-এর বিল হয় দুটো query হিসেবে: একটা CNAME-এর, আরেকটা যেটার দিকে দেখাচ্ছে তার।

#Zone apex কেন CNAME হতে পারে না

Zone apex (একে root domain বা naked domain-ও বলে) হলো hosted zone-এর নিজের নাম: example.com zone-এ example.com। ওখানে দুটো নিয়ম মুখোমুখি ধাক্কা খায়:

১. CNAME একা থাকে। DNS-এর standard (RFC 1034, section 3.6.2) বলে, কোনো নামে CNAME থাকলে সেখানে আর কোনো record থাকতে পারবে না। CNAME-এর মানে থেকেই এটা আসে: “এই নামের সবকিছু অন্য জায়গায়।” Resolver CNAME পেলে সব প্রশ্নের জন্যই সেটা অনুসরণ করে, ফলে একই নামের অন্য কোনো record-এ কেউ পৌঁছাতেই পারত না, আর দুটো কথা পরস্পরবিরোধী হয়ে যেত।

২. Apex কখনো খালি থাকে না। প্রতিটা zone-এর apex-এ থাকে একটা SOA record (zone-এর settings) আর NS record (তার name server)। Hosted zone বানানোর সাথে সাথেই Route 53 দুটো বানিয়ে দেয়, আর তুমি মুছতে পারো না। বেশিরভাগ zone-এ ওখানে MX (mail) আর TXT (verification, SPF) record-ও থাকে।

তাহলে apex-এ CNAME বসালে তাকে SOA আর NS-এর সাথে একই নাম ভাগ করতে হতো, যেটা standard মানা করে। কোনো DNS server তবুও বসতে দিলে example.com-এর MX বা NS-এর প্রশ্নও চলে যেত load balancer-এর নামের দিকে, mail আর delegation দুটোই ভেঙে পড়ত। Route 53 সোজা না বলে দেয়: hosted zone-এর নামের সাথে একই নামের CNAME বানানো যায় না। একই “একা থাকে” নিয়মের কারণেই www-এর CNAME-এর পাশে একটা TXT record-ও রাখা যায় না।

Zone apex কী মেনে নেয়

example.com-এ record যোগ করার চেষ্টা করো, আর দেখো Route 53 কোনটা নেয়, কোনটা ফিরিয়ে দেয়। নিচের table-এ ওই নামে আগে থেকে যে record আছে সেগুলো দেখানো।

পরিস্থিতি

তুমিconsole বা CLI
Route 53change API
Hosted zoneexample.com
CNAME example.com → ALB

example.com-এ যা আছে

NameTypeValue
example.comNSns-1.awsdns-01.org …
example.comSOAns-1.awsdns-01.org …
example.comMX10 mail.example.com
ধাপ 1 / 3
1

প্রতিটা hosted zone জন্ম থেকেই তার apex-এ একটা NS আর একটা SOA record নিয়ে আসে; এখানে mail-এর জন্য একটা MX record-ও আছে। তুমি example.com-এ ALB-র দিকে একটা CNAME চাইলে।

#Alias: target-এর হয়ে উত্তর দেয় Route 53 নিজেই

Alias record হলো DNS-এর ওপর Route 53-এর নিজস্ব একটা সংযোজন। তুমি সাধারণ type-এর একটা record বানাও, প্রায় সবসময় A (IPv4) বা AAAA (IPv6), “Alias” চালু করো, আর IP address টাইপ না করে target হিসেবে একটা AWS resource বেছে নাও।

Query এলে Route 53 নিজেই AWS-এর ভেতরে target-এর এই মুহূর্তের address খুঁজে নেয়, আর সাধারণ A বা AAAA record দিয়ে উত্তর দেয়। Resolver জানতেই পারে না যে Alias বলে কিছু আছে:

  • বাড়তি lookup নেই। Client প্রথম উত্তরেই IP address পায়, খোঁজার জন্য আরেকটা নাম না। dig দেখায় শুধু A-র লাইন; Alias যে, সেটা দেখা যায় শুধু Route 53 console বা API-তে (list-resource-record-sets)।
  • Apex-এ চলে। বাইরের দুনিয়ার কাছে এটা একটা A record, তাই SOA, NS, MX আর TXT-এর পাশে দিব্যি বসতে পারে। Alias বানানোর মূল কারণই এটা।
  • Target বদলালে নিজে থেকে বদলে যায়। Load balancer-এর IP বদলালে Route 53 নতুনগুলো দিয়ে উত্তর দিতে শুরু করে। কাউকে record হাতে বদলাতে হয় না।
  • TTL তুমি ঠিক করতে পারো না। AWS resource হলে Route 53 নেয় resource-এর নিজের TTL (load balancer-এর জন্য ৬০ সেকেন্ড)। অন্য record-এর দিকে Alias হলে নেয় ওই record-এর TTL।
  • Query ফ্রি, যখন target একটা AWS resource (load balancer, CloudFront, API Gateway, S3 website, আর নিচের list-এর বাকিগুলো)। একই load balancer-এর দিকে CNAME দিলে টাকা লাগে।
  • Evaluate Target Health। Alias তার target-এর health নিজের বলে ধরে নিতে পারে। Failover, weighted, latency-র মতো simple ছাড়া অন্য policy-তে Route 53 unhealthy target-কে আর উত্তরে দেয় না, আলাদা Route 53 health check ছাড়াই।
  • নাম আর type দুটোই মিলতে হয়। Query-র নাম আর type দুটো মিললে তবেই Route 53 Alias দিয়ে উত্তর দেয়। A Alias কোনো AAAA প্রশ্নের উত্তর দেয় না, তাই IPv6-এর জন্য AAAA type-এর আরেকটা Alias বানাতে হয়।

CNAMEAlias

  • Standard DNS, সব DNS provider-এই আছে।
  • একটা নামকে জোড়ে যেকোনো hostname-এর সাথে, AWS-এর হোক বা না হোক।
  • Zone apex-এ চলে না; নিজের নাম অন্য কোনো record-এর সাথে ভাগ করতে পারে না।
  • Target-এর নামের জন্য resolver-কে আরেকবার lookup করতে হয়।
  • TTL তুমি দাও।
  • Query-র জন্য Route 53 টাকা নেয়।
  • নিজের কোনো health বোঝার ক্ষমতা নেই।
  • শুধু Route 53-এর সুবিধা।
  • একটা নামকে জোড়ে বাছাই করা AWS resource বা একই hosted zone-এর আরেকটা record-এর সাথে।
  • Apex-এ চলে, subdomain-এও; অন্য record-এর পাশে থাকতে পারে।
  • Route 53 সরাসরি IP address দিয়ে উত্তর দেয় (type A/AAAA)।
  • TTL আসে target থেকে; তুমি বসাতে পারো না।
  • AWS resource target হলে ফ্রি।
  • Evaluate Target Health ভেতরেই আছে।

CNAME lookup বনাম Alias উত্তর

একটা query resolver-এর ভেতর দিয়ে কোথায় কোথায় যায় দেখো। CNAME হলে Route 53 ফেরত দেয় আরেকটা নাম, resolver-কে সেটাও খুঁজতে হয়; Alias হলে Route 53 নিজেই target খুঁজে সরাসরি IP address দিয়ে উত্তর দেয়।

পরিস্থিতি

www.example.com হলো ALB-র DNS নামের দিকে একটা CNAME।

Browser
Resolverrecursive
Route 53example.com zone
Target-এর DNSঅন্য নামটা
www.example.com A?
ধাপ 1 / 6
1

Browser-এর www.example.com-এর IP address দরকার, তাই সে resolver-কে জিজ্ঞেস করে। পুরো chain (root, TLD, authoritative) DNS লেসনে আছে; এখানে শুরু করছি Route 53-কে জিজ্ঞেস করার জায়গা থেকে।

নিজেকে যাচাই করোপ্রশ্ন

example.com hosted zone-এর apex-এ আগে থেকেই NS, SOA আর MX record আছে। example.com নামে নিচের কোনটা যোগ করা যাবে?

#Alias load balancer-এর পেছন পেছন চলে

AWS resource-এর জন্য Alias-ই যে default, তার কারণ এই গুণটা। দেখো load balancer একটা node বদলাচ্ছে: এক TTL-এর মধ্যেই Alias নতুন address ধরে ফেলে, আর হাতে বানানো A record তখনও এমন address-এর দিকে দেখায় যেটা আর নেই। শেষ scenario-তে দেখবে, load balancer-এর পেছনের সব target নষ্ট হলে Evaluate Target Health কীভাবে user-দের একটা backup-এ পাঠিয়ে দেয়।

Load balancer-এর IP বদলে গেলে

AWS load balancer-এর node বদলায়, বাড়ায়-কমায়, আর সাথে তাদের IP address-ও বদলে যায়। পাশাপাশি দেখো: Alias বদলটা নিজে থেকে ধরে ফেলে, আর পুরনো IP হাতে লিখে বানানো A record ভেঙে পড়ে। শেষের scenario-তে আছে Evaluate Target Health।

পরিস্থিতি

us-east-1
AZ a
AZ b
User
Route 53example.com
ALBএকটাই DNS নাম
S3 websitesorry page
ALB node198.51.100.10
ALB node198.51.100.11
Web 1
Web 2
example.com A?.10, .11 · TTL 60
ধাপ 1 / 5
1

example.com হলো ALB-র দিকে একটা Alias। User Route 53-কে জিজ্ঞেস করে দুটো node-এর address পায়, যেগুলো ALB-র ৬০ সেকেন্ডের TTL ধরে cache-এ থাকে।

#Alias কীসের দিকে দেখাতে পারে

Note-এ target আছে ছয়টা, slide আরও দুটো যোগ করে, আর Route 53-এর এখনকার documentation-এ আছে এগুলো:

Alias targetRecord typeকী ঠিক থাকতে হবে
Elastic Load Balancing: ALB, NLB, CLBA, আর dual-stack load balancer হলে AAAAবিশেষ কিছু না; অন্য account-এর হলে তার DNS নাম টাইপ করো (console সামনে dualstack. জুড়ে দেয়)
CloudFront distributionA, আর IPv6 চালু থাকলে AAAADistribution-এ record-এর নামটা alternate domain name হিসেবে থাকতে হবে; শুধু public hosted zone; Evaluate Target Health নেই
API Gateway (regional বা edge-optimised API)AAPI Gateway-তে record-এর নামে একটা custom domain name থাকতে হবে
Elastic Beanstalk environmentAEnvironment-এর domain-এ Region থাকতে হবে (২০১৬-র শুরু থেকে সবগুলোতে থাকে); পুরনোগুলোর জন্য CNAME লাগে
Static website হিসেবে সাজানো S3 bucketABucket-এর নাম = record-এর নাম (example.com-এর জন্য example.com নামের bucket) আর website hosting চালু
VPC interface endpointAসাধারণত private hosted zone-এ, endpoint-কে একটা সহজ নাম দিতে
Global Accelerator acceleratorA (dual-stack হলে AAAA)DNS নাম দিয়ে অন্য account-এরটাও চলে
একই hosted zone-এর আরেকটা recordTarget record-এর একই type (NS আর SOA ছাড়া যেকোনো)শুধু একই hosted zone; apex-এ target CNAME হতে পারবে না
App Runner service, AppSync domain name, OpenSearch Service custom domainA (OpenSearch-এ AAAA-ও)Record-এর নাম service-এর custom domain-এর সাথে মিলতে হবে

শেষ সারি আর VPC interface endpoint note-এ নেই; App Runner, AppSync আর OpenSearch slide-এও নেই। আজকের দিনে এগুলো সত্যিকারের Alias target, তবে পরীক্ষায় কম আসে। CloudFront, Global Accelerator, API Gateway, S3 website আর VPC endpoint-এর প্রত্যেকটার আলাদা chapter পরে আসছে; আপাতত এটুকু জানলেই চলবে যে প্রত্যেকটা তোমাকে একটা AWS hostname দেয়, আর Alias ঠিক এই পরিস্থিতির জন্যই বানানো।

#Alias কোথায় দেখাতে পারে না

  • কোনো EC2 instance বা তার DNS নাম (ec2-203-0-113-25.compute-1.amazonaws.com)। EC2-এর জন্য কোনো Alias নেই। একটা instance হলে তাকে একটা Elastic IP দাও (লেসন ৩.৬), আর সেটা দিয়ে সাধারণ একটা A record বানাও; কয়েকটা instance হলে সামনে load balancer বসিয়ে load balancer-এর দিকে Alias দাও।
  • RDS endpoint (mydb.abc123.us-east-1.rds.amazonaws.com)। db.example.com-এর মতো subdomain-এ CNAME দাও, সাধারণত private hosted zone-এ। Failover হলে RDS endpoint-এর নামটাকেই নতুন primary-র দিকে ঘুরিয়ে দেয় (লেসন ৭.১), তাই CNAME কাজ করে যায়।
  • AWS-এর বাইরের যেকোনো কিছু, আর অন্য hosted zone-এর record। এগুলোর জন্য CNAME লাগে (subdomain-এ)।

#কোন record বানাবে: সিদ্ধান্তের নিয়ম

  1. Target কি এমন একটা IP, যেটা তোমার নিয়ন্ত্রণে?

    Elastic IP লাগানো একটা EC2 instance, allowlist-এর জন্য NLB-র স্থির IP, on-premises-এর কোনো server: ওই address দিয়ে একটা A (বা AAAA) record বানাও। TTL তুমি দাও; query-র টাকা লাগে।

  2. Target কি Alias list-এর কোনো AWS resource?

    Load balancer, CloudFront, API Gateway, Beanstalk, S3 website, VPC interface endpoint, Global Accelerator, App Runner, AppSync, OpenSearch: একটা Alias A record বানাও (IPv6-এর জন্য সাথে Alias AAAA)। Apex আর subdomain দুই জায়গাতেই চলে, ফ্রি, আর IP বদল নিজে থেকে ধরে। Subdomain-এ CNAME চললেও Alias-ই ভালো পছন্দ।

  3. Target কি একই hosted zone-এর আরেকটা record?

    ওই record-এর একই type-এর একটা Alias বানাও, যেমন example.com Alias → www.example.com, যখন www নিজে একটা A বা Alias A record।

  4. নইলে এটা এমন hostname, যার জন্য Alias হয় না

    RDS endpoint, Region ছাড়া পুরনো Beanstalk নাম, SaaS বা অন্য provider-এর hostname, অন্য zone-এর record: একটা CNAME বানাও, আর শুধু subdomain-এ। Apex-ই হতে হলে সামনে CloudFront বসাও (CloudFront-এর দিকে Alias), provider যে স্থির IP দেওয়ার কথা দেয় সেটা দিয়ে A record বানাও, বা example.com থেকে www.example.com-এ redirect করে www-এ CNAME দাও।

সব রকম জোড়া নিজে চালিয়ে দেখো:

কোন record বানাব?

কোন নামের record বানাচ্ছ আর সেটা কীসের দিকে দেখাবে, বেছে নাও। Card-এ দেখাবে Route 53-এ কোন record লাগবে, কেন, তার TTL কত, query-র খরচ কেমন, আর আগে থেকে কী ঠিক থাকা চাই।

Record-এর নাম

দেখাবে কীসের দিকে

বানাও

Alias record, type A (IPv6-এর জন্য সাথে AAAA)

Apex-এ AWS-এর hostname-এর দিকে দেখাতে পারে শুধু Alias: NS আর SOA record-এর পাশে CNAME বসতে দেওয়া হয় না। Route 53 নিজেই target খুঁজে তার এই মুহূর্তের IP দিয়ে উত্তর দেয়।

NameTypeValue
example.comA (Alias)my-alb-1234.us-east-1.elb.amazonaws.com
TTL
বদলানো যায় না: Route 53 target-এর নিজের TTL নেয় (load balancer-এর জন্য ৬০ s)।
Query-র খরচ
ফ্রি: AWS resource-এর দিকে Alias-এর query-র জন্য Route 53 টাকা নেয় না।
আগে দেখে নাও
Load balancer dual-stack হলে AAAA type-এর দ্বিতীয় একটা Alias-ও বানাও। Record-এর বিকল্প থাকলে (failover, weighted, latency) Evaluate Target Health চালু করো।

#কোথায় গিয়ে গোলমাল হয়

লক্ষণকারণসমাধান
example.com-এর জন্য CNAME console বা API নিচ্ছে নাZone apex-এ CNAMEAWS resource-এর দিকে Alias A (আর AAAA)
www.example.com-এ TXT বা MX যোগ করা যাচ্ছে নাwww একটা CNAME, যেটাকে একা থাকতে হয়www-কে Alias A বানাও, তারপর TXT যোগ করো
চালুর কয়েক সপ্তাহ পর কিছু user timeout পাচ্ছেA record-এ load balancer-এর পুরনো IP বসানোLoad balancer-এর দিকে Alias
Alias target list-এ S3 bucket আসছে নাBucket-এর নাম record-এর নামের সাথে মেলে না, বা website hosting বন্ধRecord-এর নামেই bucket, static website hosting চালু (বা সামনে CloudFront)
CloudFront distribution আসছে না, বা তোমার নামে 403 দিচ্ছেRecord-এর নাম distribution-এর alternate domain name না, বা zone-টা privateAlternate domain name যোগ করো; public hosted zone ব্যবহার করো
IPv6 user সবসময় IPv4 দিয়েই আসছেশুধু A Alias আছেএকই dual-stack target-এর দিকে AAAA Alias যোগ করো
www.example.com-এর দিকে apex Alias বাতিল হচ্ছেwww একটা CNAME, তাই Alias হয়ে যেত apex CNAMEApex-এর Alias সরাসরি resource-এ দাও, বা www-কে Alias A বানাও
ALB-র সব target বন্ধ, তবুও failover হচ্ছে নাEvaluate Target Health বন্ধ, বা record-এ simple routingFailover (বা অন্য) policy আর Evaluate Target Health চালু
DNS-এর বিল প্রত্যাশার চেয়ে বেশিLoad balancer-এর দিকে CNAME বা CNAME-এর chain, প্রতি query-তে বিল (Route 53 target হলে দ্বিগুণ)Alias record দিয়ে বদলে দাও

#System design-এ

  • Apex আর www। একটা সাধারণ public site-এ example.com হয় CloudFront (বা ALB)-এর দিকে Alias A/AAAA, আর www.example.com হয় একই target-এর দিকে আরেকটা Alias, অথবা apex record-এর দিকে Alias। দুটোই ফ্রি, দুটোই target-এর বদল ধরে।
  • পরীক্ষার প্রশ্ন chapter মিশিয়ে আসে। Note-এর শেষ পরামর্শ: Route 53-এর প্রশ্ন প্রায়ই load balancer আর CloudFront-এর সাথে মিলিয়ে দেওয়া হয়। অপশনে load balancer বা distribution আর একটা domain দেখলেই আগে record type দেখো: apex-এ Alias, সেখানে কখনো CNAME না, কখনো কপি করা IP না।
  • স্থির IP আর Alias একে অপরের উল্টো না। কোনো partner-কে স্থির address allowlist করতে হলে address-এর জন্য Elastic IP লাগানো NLB বা Global Accelerator নাও, আর তোমার domain তবুও Alias দিয়েই ওটার দিকে দেখাও।
  • কয়েকটা account মিলিয়ে কাজ। অন্য account-এর load balancer বা distribution console-এর Alias list-এ আসে না, কিন্তু তার DNS নাম টাইপ করে দিলেই হয় (Route 53 তবুও তার হয়ে উত্তর দেয়)। অন্য hosted zone-এর record-এ Alias পৌঁছায় না; সেখানে CNAME লাগে।
  • Database থাকে CNAME-এ। Application-কে একটা স্থির নাম দাও, যেমন private hosted zone-এ db.internal.example.com, RDS endpoint-এর দিকে CNAME। পরে database বদলালে একটা CNAME বদলালেই হয়, প্রতিটা application-এর configuration না।

#নিজে করে দেখো

Load balancer-এর DNS নাম আর তার নিজের hosted zone ID বের করো (Alias-এ দুটোই লাগে):

aws elbv2 describe-load-balancers --names my-alb \
  --query 'LoadBalancers[0].[DNSName,CanonicalHostedZoneId]'

Apex-এ একটা Alias A record বানাও (বা update করো)। AliasTarget-এর ভেতরের HostedZoneId হলো ওপরের command থেকে পাওয়া load balancer-এর zone ID, তোমার নিজের zone-এর না। খেয়াল করো, কোনো TTL field নেই:

cat > alias.json <<'EOF'
{
  "Comment": "apex Alias to the ALB",
  "Changes": [{
    "Action": "UPSERT",
    "ResourceRecordSet": {
      "Name": "example.com",
      "Type": "A",
      "AliasTarget": {
        "HostedZoneId": "Z35SXDOTRQ7X7K",
        "DNSName": "dualstack.my-alb-1234.us-east-1.elb.amazonaws.com",
        "EvaluateTargetHealth": true
      }
    }
  }]
}
EOF
aws route53 change-resource-record-sets --hosted-zone-id Z0123456789EXAMPLE --change-batch file://alias.json

এবার নিষিদ্ধটা চেষ্টা করো, apex-এ CNAME। Route 53 পুরো change batch-টাই InvalidChangeBatch error দিয়ে ফিরিয়ে দেয়:

aws route53 change-resource-record-sets --hosted-zone-id Z0123456789EXAMPLE --change-batch '{
  "Changes": [{ "Action": "CREATE", "ResourceRecordSet": {
    "Name": "example.com", "Type": "CNAME", "TTL": 300,
    "ResourceRecords": [{ "Value": "my-alb-1234.us-east-1.elb.amazonaws.com" }] } }] }'

Alias আর CNAME-এর বেলায় resolver কী দেখে, মিলিয়ে নাও:

dig +noall +answer example.com A        # শুধু A-র লাইন, TTL ৬০ থেকে কমতে থাকে
dig +noall +answer www.example.com A    # একটা CNAME লাইন, তারপর ALB-র A লাইন
nslookup -type=AAAA example.com         # AAAA Alias না বানালে খালি

যে Alias flag dig কখনো দেখায় না সেটা দেখো, আর Route 53 কী উত্তর দিত সেটা সরাসরি তাকেই জিজ্ঞেস করো:

aws route53 list-resource-record-sets --hosted-zone-id Z0123456789EXAMPLE \
  --query "ResourceRecordSets[?Name=='example.com.']"
aws route53 test-dns-answer --hosted-zone-id Z0123456789EXAMPLE \
  --record-name example.com --record-type A

যে স্থির hosted zone ID সবচেয়ে বেশি চোখে পড়বে: CloudFront-এর সবসময় Z2FDTNDATAQYW2, Global Accelerator-এর Z2BJ6XQ5FK7U4H; load balancer, S3 website আর Beanstalk-এর ID Region ভেদে আলাদা (ওপরের ALB-র উদাহরণটা us-east-1-এর)।

#সারসংক্ষেপ

মূল কথা

  • AWS resource (load balancer, CloudFront, API Gateway, S3 website…) তোমাকে একটা DNS নাম দেয়, কারণ তাদের IP address বদলায়। ওই IP কখনো A record-এ কপি কোরো না।
  • CNAME: নাম → যেকোনো hostname, AWS-এর হোক বা না হোক; বাড়তি lookup; TTL তুমি দাও; টাকা লাগে; তাকে একা থাকতে হয়, তাই zone apex-এ কখনোই চলে না, কারণ সেখানে সবসময় SOA আর NS থাকে।
  • Alias: শুধু Route 53-এর; type A/AAAA (বা একই zone-এর target record-এর একই type); Route 53 নিজে target খুঁজে IP দিয়ে উত্তর দেয়; apex-এ চলে; TTL বসানো যায় না (target-এরটা চলে, load balancer-এর ৬০ s); AWS resource-এর জন্য ফ্রি; Evaluate Target Health আছে; শুধু মেলানো type-এর উত্তর দেয়, তাই IPv6-এর জন্য AAAA যোগ করো।
  • Alias target: ELB (ALB/NLB/CLB), CloudFront, API Gateway, Elastic Beanstalk, S3 website (bucket-এর নাম = record-এর নাম), VPC interface endpoint, Global Accelerator, একই hosted zone-এর আরেকটা record, সাথে App Runner, AppSync আর OpenSearch Service।
  • Alias target না: EC2-এর DNS নাম (Elastic IP দিয়ে A record দাও), RDS endpoint (subdomain-এ CNAME), AWS-এর বাইরের বা অন্য zone-এর যেকোনো কিছু (subdomain-এ CNAME)।
  • পরীক্ষার রিফ্লেক্স: root domain → ALB / CloudFront / S3 website → Alias। সবসময়।