DNS
: DNS는 사람이 읽을 수 있는 도메인 이름을 IP 주소로 변환하는 시스템
사용자 입력: www.example.com
↓ DNS 조회
결과: 52.78.123.456
↓
웹 브라우저가 해당 IP로 접속
DNS 레코드 타입
A 레코드
- 도메인을 IPv4 주소로 매핑
- 예:
example.com → 52.78.123.456
AAAA 레코드
- 도메인을 IPv6 주소로 매핑
- 예:
example.com → 2001:0db8:85a3::8a2e:0370:7334
CNAME 레코드
- 도메인을 다른 도메인으로 매핑
- 예:
www.example.com → example.com
- ⚠️ 루트 도메인(Zone Apex)에는 사용 불가
ALIAS 레코드 (Route 53 전용)
- AWS 리소스를 가리키는 특별한 레코드
- CNAME과 유사하지만 루트 도메인에도 사용 가능
- 무료 (쿼리 비용 없음)
CNAME (불가):
example.com → elb-123.amazonaws.com ❌
ALIAS (가능):
example.com → elb-123.amazonaws.com ✅
ALIAS 지원 대상:
- ELB (Application, Network, Classic)
- CloudFront 배포
- S3 웹사이트
- API Gateway
- Elastic Beanstalk
- VPC Interface Endpoint
- Global Accelerator
MX 레코드
- 메일 서버 지정
- 우선순위 포함
example.com MX 10 mail1.example.com
example.com MX 20 mail2.example.com
TXT 레코드
- 텍스트 정보 저장
- 도메인 소유권 인증에 사용
example.com TXT "google-site-verification=abc123"
DNS 쿼리 프로세스
1. 브라우저 캐시 확인
↓ 없음
2. OS 캐시 확인
↓ 없음
3. ISP DNS 서버 (Recursive Resolver)
↓ 없음
4. Root DNS 서버 (.com은 어디?)
↓
5. TLD DNS 서버 (example.com은 어디?)
↓
6. Authoritative DNS 서버 (Route 53)
↓
7. IP 주소 반환
Route 53
Route 53은 AWS의 확장 가능하고 가용성이 높은 DNS(Domain Name System) 서비스로 도메인 등록부터 고급 트래픽 라우팅까지 다양한 기능을 제공한다
1. 도메인 등록
Route 53에서 직접 도메인을 구매 가능
# 도메인 가용성 확인
aws route53domains check-domain-availability \
--domain-name example.com
# 도메인 등록
aws route53domains register-domain \
--domain-name example.com \
--duration-in-years 1 \
--admin-contact file://contact.json \
--registrant-contact file://contact.json \
--tech-contact file://contact.json
2. 호스팅 영역(Hosted Zone)
도메인의 DNS 레코드를 관리하는 컨테이너
퍼블릭 호스팅 영역:
- 인터넷에서 접근 가능
- 예: example.com의 DNS 레코드
프라이빗 호스팅 영역:
- VPC 내부에서만 접근 가능
- 예: internal.mycompany.com
# 퍼블릭 호스팅 영역 생성
aws route53 create-hosted-zone \
--name example.com \
--caller-reference $(date +%s)
# 프라이빗 호스팅 영역 생성
aws route53 create-hosted-zone \
--name internal.mycompany.com \
--vpc VPCRegion=ap-northeast-2,VPCId=vpc-12345678 \
--caller-reference $(date +%s) \
--hosted-zone-config PrivateZone=true
비용:
- 호스팅 영역: $0.50/월
- 쿼리: 처음 10억 건까지 $0.40/백만 건
3. 레코드 생성
# A 레코드 생성
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "www.example.com",
"Type": "A",
"TTL": 300,
"ResourceRecords": [{"Value": "52.78.123.456"}]
}
}]
}'
# ALIAS 레코드 생성 (ALB)
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z3456789012BCD",
"DNSName": "my-alb-123456789.ap-northeast-2.elb.amazonaws.com",
"EvaluateTargetHealth": true
}
}
}]
}'
라우팅 정책(Routing Policies)
Route 53 -> 다양한 라우팅 정책 지원
1. Simple Routing (단순 라우팅)
가장 기본적인 라우팅으로, 단일 리소스로 트래픽을 전달
example.com → 52.78.123.456
특징:
- 하나의 레코드에 여러 IP 지정 가능 (랜덤 반환)
- 헬스 체크 불가
사용 사례:
- 단순한 웹사이트
- 단일 서버
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{"Value": "52.78.123.1"},
{"Value": "52.78.123.2"}
]
}
}]
}'
2. Weighted Routing (가중치 기반 라우팅)
트래픽을 비율로 분산
example.com
├─ 70% → Server A (가중치 70)
└─ 30% → Server B (가중치 30)
사용 :
- A/B 테스팅
- 블루-그린 배포
- 카나리 배포
- 리전 간 트래픽 분산
# Server A (70%)
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Server-A",
"Weight": 70,
"TTL": 60,
"ResourceRecords": [{"Value": "52.78.123.1"}]
}
}]
}'
# Server B (30%)
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Server-B",
"Weight": 30,
"TTL": 60,
"ResourceRecords": [{"Value": "52.78.123.2"}]
}
}]
}'
카나리 배포 예시:
1단계: 구버전 100%, 신버전 0%
2단계: 구버전 90%, 신버전 10% ← 모니터링
3단계: 구버전 50%, 신버전 50%
4단계: 구버전 0%, 신버전 100%
3. Latency-based Routing (지연 시간 기반 라우팅)
사용자와 가장 가까운 리전으로 라우팅
한국 사용자 → Seoul 리전 (지연 10ms)
미국 사용자 → Virginia 리전 (지연 15ms)
유럽 사용자 → Ireland 리전 (지연 20ms)
특징:
- 실시간 네트워크 지연 측정
- 가장 빠른 엔드포인트 자동 선택
사용 사례:
- 글로벌 서비스
- 멀티 리전 배포
# Seoul 리전
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Seoul",
"Region": "ap-northeast-2",
"TTL": 60,
"ResourceRecords": [{"Value": "52.78.123.1"}]
}
}]
}'
# Virginia 리역
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Virginia",
"Region": "us-east-1",
"TTL": 60,
"ResourceRecords": [{"Value": "3.35.123.1"}]
}
}]
}'
4. Failover Routing (장애 조치 라우팅)
Primary 리소스가 실패하면 자동으로 Secondary로 전환
정상:
example.com → Primary Server (Active)
Secondary Server (Standby)
장애:
example.com → Primary Server ❌
Secondary Server (Active) ✅
특징:
- 헬스 체크 필수
- Active-Passive 구성
- 자동 장애 조치
사용 사례:
- 재해 복구
- 백업 사이트
- 고가용성 애플리케이션
# Primary
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Primary",
"Failover": "PRIMARY",
"TTL": 60,
"ResourceRecords": [{"Value": "52.78.123.1"}],
"HealthCheckId": "abc123"
}
}]
}'
# Secondary
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Secondary",
"Failover": "SECONDARY",
"TTL": 60,
"ResourceRecords": [{"Value": "3.35.123.1"}]
}
}]
}'
5. Geolocation Routing (지리적 위치 라우팅)
사용자의 지리적 위치에 따라 라우팅
한국 사용자 → Seoul 서버 (한국어 콘텐츠) 미국 사용자 → Virginia 서버 (영어 콘텐츠) 기타 → Default 서버
특징:
- 국가, 대륙, 미국 주 단위 지정
- 로컬라이제이션
- 라이선스 제한 준수
사용 사례:
- 콘텐츠 지역화
- 법적 규제 준수
- 저작권 제한
# 한국 사용자
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Korea",
"GeoLocation": {"CountryCode": "KR"},
"TTL": 60,
"ResourceRecords": [{"Value": "52.78.123.1"}]
}
}]
}'
# 기본 (나머지 모든 지역)
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "Default",
"GeoLocation": {"ContinentCode": "*"},
"TTL": 60,
"ResourceRecords": [{"Value": "3.35.123.1"}]
}
}]
}'
6. Geoproximity Routing (지리 근접 라우팅)
사용자와 리소스의 지리적 거리를 기반으로 라우팅하며, 바이어스 값으로 트래픽을 조정 가능
Seoul (바이어스 +30)
├─ 더 넓은 영역에서 트래픽 받음
└─ 일본, 중국 일부 포함
Tokyo (바이어스 0)
└─ 기본 영역
바이어스 값:
- 99 ~ +99
- 양수: 더 많은 트래픽 유치
- 음수: 더 적은 트래픽
사용 사례:
- 트래픽 분산 미세 조정
- 리소스 용량에 따른 조정
7. Multi-Value Answer Routing
여러 IP 주소를 반환하되, 헬스 체크로 정상 리소스만 반환
example.com 조회
↓
Route 53 헬스 체크
↓
[Server 1 ✅ - 반환]
[Server 2 ✅ - 반환]
[Server 3 ❌ - 제외]
[Server 4 ✅ - 반환]
↓
3개 IP 주소 반환 (랜덤 순서)
특징:
- 최대 8개 정상 레코드 반환
- 각 레코드에 헬스 체크 연결
- Simple Routing + 헬스 체크
사용 사례:
- 간단한 로드 밸런싱
- ELB 없이 고가용성 구현
헬스 체크(Health Checks)
종류
1. 엔드포인트 헬스 체크
특정 IP 또는 도메인의 상태를 모니터링
# HTTP 헬스 체크 생성
aws route53 create-health-check \
--health-check-config '{
"Type": "HTTP",
"ResourcePath": "/health",
"FullyQualifiedDomainName": "example.com",
"Port": 80,
"RequestInterval": 30,
"FailureThreshold": 3
}'
설정:
- 프로토콜: HTTP, HTTPS, TCP
- 포트: 사용자 정의
- 경로: 헬스 체크 엔드포인트
- 간격: 30초 또는 10초 (빠른 체크)
- 실패 임계값: 연속 실패 횟수
2. Calculated 헬스 체크
여러 헬스 체크의 결과를 조합
Calculated Health Check
├─ Child Health Check 1 ✅
├─ Child Health Check 2 ✅
└─ Child Health Check 3 ❌
조건: 3개 중 2개 이상 정상 → ✅
3. CloudWatch 알람 헬스 체크
CloudWatch 알람 상태가 기반
CloudWatch Alarm (CPU > 80%)
↓
Route 53 Health Check
↓ Unhealthy
트래픽 차단
프라이빗 리소스 헬스 체크
프라이빗 서브넷의 리소스는 직접 체크할 수 없으므로 CloudWatch를 사용
Private Subnet
↓ 지표 전송
CloudWatch Metric
↓ 알람 트리거
CloudWatch Alarm
↓
Route 53 Health Check
트래픽 플로우(Traffic Flow)
복잡한 라우팅 정책을 시각적으로 설계하는 도구입니다.
예시: 복합 라우팅
사용자 요청
↓
[Geolocation]
├─ 한국 → [Weighted]
│ ├─ 70% → Seoul AZ-A
│ └─ 30% → Seoul AZ-C
├─ 미국 → [Failover]
│ ├─ Primary → Virginia
│ └─ Secondary → Oregon
└─ 기타 → [Latency]
├─ Seoul
├─ Virginia
└─ Ireland
실전 시나리오
시나리오 1: 글로벌 서비스 (멀티 리전)
example.com
↓
[Geolocation]
├─ 아시아 → [Latency]
│ ├─ Seoul (ap-northeast-2)
│ ├─ Tokyo (ap-northeast-1)
│ └─ Singapore (ap-southeast-1)
├─ 유럽 → [Latency]
│ ├─ Ireland (eu-west-1)
│ └─ Frankfurt (eu-central-1)
└─ 미국 → [Latency]
├─ Virginia (us-east-1)
└─ Oregon (us-west-2)
각 리전에 Failover 적용:
Primary (Active) + Secondary (Standby)
시나리오 2: 블루-그린 배포
1단계: 기존 버전 (블루) 100%
example.com
└─ [Weighted]
├─ 100% → Blue (v1.0)
└─ 0% → Green (v2.0)
2단계: 신규 버전 (그린) 카나리 테스트
example.com
└─ [Weighted]
├─ 90% → Blue (v1.0)
└─ 10% → Green (v2.0) ← 모니터링
3단계: 전환 완료
example.com
└─ [Weighted]
├─ 0% → Blue (v1.0)
└─ 100% → Green (v2.0)
시나리오 3: 재해 복구 (DR)
example.com → [Failover]
├─ Primary: Seoul (운영)
│ └─ Health Check: /health
└─ Secondary: Virginia (DR)
└─ Standby
장애 발생:
Seoul ❌ → Virginia 자동 활성화 ✅
복구 시간: ~1분 (헬스 체크 + DNS TTL)
도메인 이전
Route 53으로 도메인 이전
# 1. 현재 등록 대행자에서 잠금 해제
# 2. Authorization Code 발급
# 3. Route 53에서 이전 요청
aws route53domains transfer-domain \
--domain-name example.com \
--duration-in-years 1 \
--auth-code XXXXXXXX
# 4. 이메일 승인
# 5. 이전 완료 (5-7일 소요)
외부 등록 대행자 사용
도메인은 다른 곳에 등록하고 DNS만 Route 53 사용:
1. Route 53에서 호스팅 영역 생성
2. NS 레코드 4개 확인
3. 도메인 등록 대행자에서 NS 레코드 업데이트
4. DNS 전파 대기 (24-48시간)
비용 최적화
호스팅 영역 통합
불필요한 호스팅 영역을 제거하고 통합
Before:
- app.example.com ($0.50/월)
- api.example.com ($0.50/월)
- admin.example.com ($0.50/월)
총: $1.50/월
After:
- example.com ($0.50/월)
├─ app.example.com
├─ api.example.com
└─ admin.example.com
총: $0.50/월
ALIAS 레코드 사용
ALIAS는 쿼리 비용이 무료
CNAME: $0.40/백만 쿼리
ALIAS: $0 (무료)
TTL 최적화
적절한 TTL로 쿼리 수를 줄임
정적 콘텐츠: TTL 3600초 (1시간)
동적 콘텐츠: TTL 60초 (1분)
장애 조치: TTL 30초 (빠른 전환)
트러블슈팅
문제 1: DNS가 업데이트되지 않음
원인:
- DNS 캐시
- 높은 TTL
해결:
# DNS 캐시 플러시 (Windows)
ipconfig /flushdns
# DNS 캐시 플러시 (macOS)
sudo dscacheutil -flushcache
# 특정 DNS 서버로 조회
nslookup example.com 8.8.8.8
dig example.com @8.8.8.8
문제 2: 헬스 체크 실패
원인:
- 방화벽/보안 그룹이 Route 53 IP 차단
- 헬스 체크 경로 오류
해결:
# Route 53 헬스 체크 IP 대역 허용 필요
# 참고: https://ip-ranges.amazonaws.com/ip-ranges.json
# 보안 그룹 규칙 추가
aws ec2 authorize-security-group-ingress \
--group-id sg-12345678 \
--ip-permissions IpProtocol=tcp,FromPort=80,ToPort=80,IpRanges='[{CidrIp=0.0.0.0/0}]'
문제 3: 지연 시간 증가
원인:
- 높은 TTL
- 잘못된 라우팅 정책
해결:
- TTL을 60초로 단축
- Latency-based Routing 사용
- CloudFront 추가 (CDN)
Route 53은 DNS 서비스 + 트래픽 관리, 장애 조치, 글로벌 확장을 지원하는 강력한 도구
- DNS 레코드 타입 이해 (A, AAAA, CNAME, ALIAS)
- 7가지 라우팅 정책으로 다양한 시나리오 대응
- 헬스 체크로 자동 장애 조치
- ALIAS 레코드로 비용 절감
- TTL 최적화로 성능 향상
Share article