AWS学びなおし(+TF)_Route53
Route 53 は、AWS (Amazon Web Services) が提供するスケーラブルで可用性の高い DNS (Domain Name System) ウェブサービスです。簡単に言うと、インターネット上の住所録のようなもので、人間が理解しやすいドメイン名 (例: example.com) を、コンピュータが理解できる IP アドレス (例: 192.0.2.1) に変換する役割を担います。
DNS の仕組みと Route 53 の役割:
- ユーザーが Web ブラウザにドメイン名を入力: 例えば、「example.com」と入力します。
- DNS リゾルバーへの問い合わせ: Web ブラウザは、まず DNS リゾルバー (通常は ISP が提供) に「example.com の IP アドレスを教えて」と問い合わせます。
- 権威 DNS サーバーへの問い合わせ: DNS リゾルバーは、ドメイン名の情報を管理している権威 DNS サーバー (Route 53 など) に問い合わせます。
- Route 53 が IP アドレスを応答: Route 53 は、設定された DNS レコードに基づいて、example.com に対応する IP アドレス (または他の情報) を DNS リゾルバーに返します。
- Web ブラウザが IP アドレスにアクセス: DNS リゾルバーから受け取った IP アドレスを使って、Web ブラウザは Web サーバーにアクセスし、Web サイトを表示します。
Route 53 の主な機能:
- DNS サービス: ドメイン名の DNS レコードを管理し、インターネットからの DNS クエリに応答します。
- ドメイン登録: Route 53 を通じて、新しいドメイン名を登録したり、既存のドメイン名を Route 53 に移管したりできます。
- ヘルスチェック: Web サーバーやアプリケーションのヘルス状態を監視し、異常を検知した場合に自動的にトラフィックを正常なエンドポイントに切り替えることができます。
- トラフィックフロー: 複数のエンドポイント (EC2 インスタンス、ELB、S3 バケットなど) に対して、様々なルーティングポリシー (加重ルーティング、地理位置ルーティング、レイテンシールーティングなど) を設定し、トラフィックを効率的に分散できます。
- DNSSEC (DNS Security Extensions): DNS のセキュリティを強化し、DNS スプーフィングなどの攻撃を防ぐことができます。
- プライベート DNS: VPC (Virtual Private Cloud) 内でのみ解決可能なプライベートホストゾーンを作成し、内部システム間の名前解決に利用できます。
Route 53 のメリット:
- 高い可用性と信頼性: AWS のグローバルインフラストラクチャ上で稼働し、高い可用性と信頼性を実現しています。
- スケーラビリティ: 大規模なトラフィックにも自動的にスケールし、安定した DNS サービスを提供します。
- 柔軟なルーティング: 様々なルーティングポリシーを組み合わせることで、複雑なトラフィック分散要件にも対応できます。
- AWS サービスとの統合: EC2、ELB、S3 など、他の AWS サービスとの連携が容易です。
- シンプルな料金体系: 従量課金制で、使用量に応じた料金が発生します。
Route 53 の料金体系 (主なもの):
- ホストゾーン: ホストゾーン (ドメイン名の DNS レコードを管理するコンテナ) ごとに月額料金が発生します。
- DNS クエリ: 解決された DNS クエリ数に応じて料金が発生します。クエリの種類 (標準クエリ、レイテンシベースルーティングクエリなど) によって料金が異なります。
- ヘルスチェック: ヘルスチェックの数と頻度に応じて料金が発生します。
- ドメイン登録: ドメインの種類と登録期間に応じて料金が発生します。
【実務レベルの内容と重要事項】
Route 53 を実務で利用する上で重要な内容と事項は以下の通りです。
1. DNS レコードの種類と設定:
- A レコード: ドメイン名 (またはサブドメイン) を IPv4 アドレスにマッピングします。
- AAAA レコード: ドメイン名 (またはサブドメイン) を IPv6 アドレスにマッピングします。
-
CNAME レコード: ドメイン名 (またはサブドメイン) を別のドメイン名 (エイリアス) にマッピングします。ALB や CloudFront など、AWS リソースへのルーティングによく使用されます。
- 注意点: CNAME レコードは、ゾーンの頂点 (例: example.com) には設定できません。ゾーンの頂点には ALIAS レコード (Route 53 独自拡張) を使用するか、A レコードで IP アドレスを指定する必要があります。
- ALIAS レコード (Route 53 独自拡張): ドメイン名 (またはサブドメイン) を特定の AWS リソース (ELB、CloudFront ディストリビューション、S3 バケットなど) にマッピングします。CNAME レコードと同様の役割を果たしますが、ゾーンの頂点にも設定可能です。
- MX レコード: ドメイン名のメールサーバーを指定します。
- TXT レコード: ドメイン名に関するテキスト情報を記録します。ドメイン所有権の認証 (例: ACM 証明書発行時) や SPF/DKIM レコードの設定などに使用されます。
- NS レコード: サブドメインの権威 DNS サーバーを指定します。委任ゾーンを作成する際に使用します。
- SOA レコード: ゾーンに関する権威情報を記述します。Route 53 が自動的に設定するため、通常は手動で設定する必要はありません。
- PTR レコード: IP アドレスからドメイン名を逆引きするために使用されます。逆引き DNS 設定に利用します。
実務上のポイント:
- TTL (Time To Live) の設定: DNS レコードのキャッシュ有効期間 (秒単位) を設定します。TTL を短くすると DNS の反映が早くなりますが、DNS サーバーへの負荷が増加します。TTL を長くすると DNS サーバーへの負荷は減りますが、DNS の反映に時間がかかります。サービスの特性に合わせて適切な TTL を設定することが重要です。
-
ワイルドカードレコード: サブドメインをまとめて設定する場合に便利です (例:
*.example.com
を特定の IP アドレスにマッピング)。 - コメント: DNS レコードにコメントを付与することで、設定内容を分かりやすく管理できます。
2. ルーティングポリシーの選択と設定:
Route 53 は、様々なルーティングポリシーを提供しており、要件に合わせて適切なポリシーを選択する必要があります。
- シンプルルーティング: 単一のエンドポイントにトラフィックをルーティングします。
- 加重ルーティング: 複数のエンドポイントに重み付けをしてトラフィックを分散します。カナリアリリースや A/B テストなどに利用できます。
- レイテンシールーティング: ユーザーに最も近いリージョンのエンドポイントにトラフィックをルーティングします。グローバルに展開されたアプリケーションのパフォーマンス向上に役立ちます。
- 地理位置ルーティング: ユーザーの地理的な位置に基づいてエンドポイントをルーティングします。コンテンツのローカライズやリージョン規制への対応などに利用できます。
- フェイルオーバールーティング: プライマリエンドポイントとセカンダリエンドポイントを設定し、プライマリエンドポイントが異常になった場合に自動的にセカンダリエンドポイントに切り替えます。DR (災害復旧) 対策に有効です。
- マルチvalue アンサールーティング: 複数の正常なエンドポイントを返し、クライアント側の DNS リゾルバーが最適なエンドポイントを選択します。可用性向上に役立ちます。
- 地理的近接性ルーティング (トラフィックフローでのみ利用可能): ユーザーの場所とリソースの場所に基づいてトラフィックをルーティングします。より詳細な地理的制御が可能です。
実務上のポイント:
- 要件に合ったルーティングポリシーを選択: アプリケーションの特性、可用性要件、パフォーマンス要件などを考慮して、最適なルーティングポリシーを選択することが重要です。
- ヘルスチェックとの連携: ルーティングポリシーとヘルスチェックを組み合わせることで、異常なエンドポイントへのトラフィックを自動的に回避し、可用性を高めることができます。
- テストと検証: ルーティングポリシーの設定後は、意図した通りにトラフィックが分散されているか、フェイルオーバーが正常に動作するかなどを必ずテスト・検証する必要があります。
3. ヘルスチェックの設定と活用:
Route 53 のヘルスチェックは、エンドポイントの可用性を監視し、異常を検知した場合にルーティングポリシーと連携してトラフィックを制御するために重要な機能です。
-
ヘルスチェックの種類:
- HTTP ヘルスチェック: HTTP/HTTPS リクエストを送信し、レスポンスステータスコードに基づいてヘルス状態を判断します。
- TCP ヘルスチェック: TCP ポートへの接続を試み、接続可否に基づいてヘルス状態を判断します。
- HTTPS ヘルスチェック (証明書検証あり): HTTPS リクエストを送信し、レスポンスステータスコードと SSL/TLS 証明書の有効性を検証します。
- CloudWatch アラームベースのヘルスチェック: CloudWatch アラームの状態に基づいてヘルス状態を判断します。より複雑なヘルスチェックロジックを実装できます。
実務上のポイント:
- 適切なヘルスチェックタイプを選択: エンドポイントの特性に合わせて、HTTP、TCP、HTTPS などの適切なヘルスチェックタイプを選択します。
- ヘルスチェック間隔と閾値の設定: ヘルスチェックの頻度 (間隔) と、異常と判断する連続失敗回数 (閾値) を適切に設定します。頻度を高くすると異常検知は早くなりますが、エンドポイントへの負荷が増加します。
- ヘルスチェックのロケーション設定: グローバルに分散したロケーションからヘルスチェックを実行することで、より正確な可用性監視が可能です。
- ヘルスチェックとルーティングポリシーの連携: フェイルオーバールーティングや加重ルーティングなどで、ヘルスチェックの結果に基づいてトラフィックを自動的に切り替える設定を行います。
- ヘルスチェックのログとモニタリング: ヘルスチェックのログを CloudWatch Logs などに保存し、異常発生時の原因究明や傾向分析に役立てます。
4. DNSSEC の設定 (セキュリティ強化):
DNSSEC (DNS Security Extensions) は、DNS のセキュリティを強化し、DNS スプーフィングやキャッシュポイズニングなどの攻撃を防ぐための仕組みです。Route 53 は DNSSEC をサポートしており、ドメインのセキュリティを向上させることができます。
実務上のポイント:
- DNSSEC の有効化: Route 53 で DNSSEC を有効にするには、署名鍵 (KSK, ZSK) の生成、委任署名者 (DS) レコードの登録などの設定が必要です。
- 鍵管理: DNSSEC の鍵は安全に管理する必要があります。Route 53 は鍵の自動ローテーション機能を提供しており、鍵管理の負担を軽減できます。
- DNSSEC のモニタリング: DNSSEC の設定後は、正しく署名がされているか、検証エラーが発生していないかなどをモニタリングする必要があります。
5. プライベート DNS の活用 (VPC 内名前解決):
Route 53 プライベートホストゾーンを利用することで、VPC 内のリソース (EC2 インスタンス、RDS インスタンスなど) をプライベート IP アドレスで名前解決できます。
実務上のポイント:
- VPC 設定: プライベートホストゾーンを作成する VPC を指定する必要があります。
- 関連付けられた VPC: 複数の VPC をプライベートホストゾーンに関連付けることができます。
- 名前解決の設定: VPC 内の EC2 インスタンスなどで、Route 53 プライベート DNS リゾルバー (VPC CIDR 範囲の .2 アドレス) を DNS サーバーとして設定します。
6. ドメイン登録・移管:
Route 53 でドメイン登録や移管を行う場合は、以下の点に注意が必要です。
- ドメインの種類と料金: ドメインの種類 (.com, .net, .org など) によって料金が異なります。
- Whois 情報: ドメイン登録者の情報を Whois データベースに公開するかどうかを選択できます (プライバシー保護オプション)。
- 自動更新: ドメインの有効期限切れを防ぐために、自動更新設定を有効にすることを推奨します。
- 移管手順: 他のレジストラから Route 53 にドメインを移管する際には、移管承認コードの取得やネームサーバーの変更などの手順が必要です。
7. 運用・監視:
- 変更管理: DNS レコードやルーティングポリシーの変更は、サービスに影響を与える可能性があるため、慎重な変更管理プロセスが必要です。
- モニタリング: Route 53 のメトリクス (クエリ数、レイテンシ、ヘルスチェックステータスなど) を CloudWatch で監視し、異常を早期に検知できるようにします。
- ログ: Route 53 の DNS クエリログ (オプション) やヘルスチェックログを必要に応じて有効にし、トラブルシューティングやセキュリティ分析に役立てます。
【実務でどの程度使用されるのか】
Route 53 は、実務で非常に広く使用されています。 AWS を利用する企業や組織にとって、Route 53 はほぼ必須のサービスと言えるでしょう。
主な利用シーン:
- Web サイトや Web アプリケーションの公開: ドメイン名と IP アドレスを紐付け、インターネット上に Web サイトや Web アプリケーションを公開するために不可欠です。
- 負荷分散: ELB (Elastic Load Balancer) などの負荷分散サービスと連携し、複数の EC2 インスタンスやコンテナにトラフィックを分散させ、可用性とパフォーマンスを向上させます。
- DR (災害復旧) 対策: フェイルオーバールーティングを利用して、プライマリサイトがダウンした場合にセカンダリサイトに自動的に切り替えることで、DR 環境を構築できます。
- グローバルコンテンツ配信: レイテンシールーティングや地理位置ルーティングを利用して、ユーザーに最も近いリージョンのエンドポイントにトラフィックを誘導し、コンテンツ配信の高速化とユーザーエクスペリエンスの向上を図ります。
- マイクロサービスアーキテクチャ: 多数のマイクロサービスの名前解決にプライベート DNS を利用し、サービスディスカバリを容易にします。
- API ゲートウェイ: API Gateway と連携し、API エンドポイントにカスタムドメイン名を割り当てます。
- CDN (コンテンツ配信ネットワーク): CloudFront などの CDN と連携し、コンテンツ配信を高速化します。
- メールサーバー: MX レコードを設定して、ドメイン名のメールサーバーを指定します。
利用頻度:
Route 53 は、一度設定すれば頻繁に設定変更を行うサービスではありませんが、インフラ基盤として常に稼働し、Web サービスやアプリケーションの可用性を支える重要な役割を担っています。
実務での重要度:
Route 53 は、インターネット公開されている Web サイトやアプリケーションだけでなく、VPC 内のシステムにおいても名前解決基盤として利用されるため、非常に重要なサービスです。Route 53 の設定ミスや障害は、サービス全体に大きな影響を与える可能性があります。そのため、Route 53 の正しい理解と適切な設定・運用は、クラウドエンジニアにとって必須スキルと言えるでしょう。
【terraformのコードで記述する場合の基本的内容と実務レベルの内容】
Terraform を使用して Route 53 を記述することで、DNS 設定を Infrastructure as Code (IaC) として管理し、自動化、バージョン管理、再現性を高めることができます。
1. 基本的な記述:
- ホストゾーンの作成:
resource "aws_route53_zone" "example_com" {
name = "example.com"
}
- A レコードの作成:
resource "aws_route53_record" "www" {
zone_id = aws_route53_zone.example_com.zone_id
name = "www.example.com"
type = "A"
ttl = 300
records = ["192.0.2.1"]
}
- CNAME レコードの作成:
resource "aws_route53_record" "api" {
zone_id = aws_route53_zone.example_com.zone_id
name = "api.example.com"
type = "CNAME"
ttl = 300
records = ["api.example.elb.amazonaws.com"] # ELB の DNS 名
}
- ALIAS レコードの作成 (ELB):
resource "aws_route53_record" "web" {
zone_id = aws_route53_zone.example_com.zone_id
name = "example.com" # ゾーンの頂点
type = "A"
alias {
name = aws_elb.example.dns_name # ELB の DNS 名
zone_id = aws_elb.example.zone_id # ELB の Hosted Zone ID
evaluate_target_health = true # ヘルスチェック連携
}
}
2. 実務レベルの記述:
- 変数 (variables) の活用: ドメイン名、IP アドレス、TTL などを変数として定義することで、コードの再利用性と可読性を高めます。
variable "domain_name" {
type = string
default = "example.com"
}
variable "web_server_ip" {
type = string
default = "192.0.2.1"
}
resource "aws_route53_zone" "example_com" {
name = var.domain_name
}
resource "aws_route53_record" "www" {
zone_id = aws_route53_zone.example_com.zone_id
name = "www.${var.domain_name}"
type = "A"
ttl = 300
records = [var.web_server_ip]
}
- モジュール (modules) の活用: Route 53 の設定をモジュール化することで、複数の環境 (開発環境、本番環境など) で再利用しやすくなります。
modules/route53/main.tf
:
variable "domain_name" {
type = string
}
resource "aws_route53_zone" "main" {
name = var.domain_name
}
resource "aws_route53_record" "www" {
zone_id = aws_route53_zone.main.zone_id
name = "www.${var.domain_name}"
type = "A"
ttl = 300
records = ["192.0.2.1"]
}
main.tf
:
module "route53_example_com" {
source = "./modules/route53"
domain_name = "example.com"
}
- ルーティングポリシーの設定 (加重ルーティング):
resource "aws_route53_record" "weighted" {
zone_id = aws_route53_zone.example_com.zone_id
name = "weighted.example.com"
type = "A"
ttl = 300
weighted_routing_policy {
weight = 50 # ウェイト 50
}
set_identifier = "server1"
records = ["192.0.2.1"]
}
resource "aws_route53_record" "weighted2" {
zone_id = aws_route53_zone.example_com.zone_id
name = "weighted.example.com"
type = "A"
ttl = 300
weighted_routing_policy {
weight = 50 # ウェイト 50
}
set_identifier = "server2"
records = ["192.0.2.2"]
}
- ヘルスチェックとフェイルオーバールーティングの設定:
resource "aws_route53_health_check" "http_check" {
type = "HTTP"
request_interval = 30
failure_threshold = 3
resource_path = "/"
port = 80
fqdn = "www.example.com" # ヘルスチェック対象の FQDN
}
resource "aws_route53_record" "failover_primary" {
zone_id = aws_route53_zone.example_com.zone_id
name = "failover.example.com"
type = "A"
ttl = 300
failover_routing_policy {
type = "PRIMARY"
}
health_check_id = aws_route53_health_check.http_check.id
set_identifier = "primary"
records = ["192.0.2.1"]
}
resource "aws_route53_record" "failover_secondary" {
zone_id = aws_route53_zone.example_com.zone_id
name = "failover.example.com"
type = "A"
ttl = 300
failover_routing_policy {
type = "SECONDARY"
}
set_identifier = "secondary"
records = ["198.51.100.1"] # DR サイトの IP アドレス
}
- データソース (data sources) の活用: 既存の AWS リソース (例: ELB) の情報をデータソースから取得し、Route 53 設定に利用します。
data "aws_elb_service_account" "main" {}
data "aws_elb" "example" {
name = "example-elb" # ELB 名
}
resource "aws_route53_record" "elb_alias" {
zone_id = aws_route53_zone.example_com.zone_id
name = "elb.example.com"
type = "A"
alias {
name = data.aws_elb.example.dns_name
zone_id = data.aws_elb.example.zone_id
evaluate_target_health = true
}
}
実務レベルでのポイント:
- State 管理: Terraform State を適切に管理し、複数人での共同作業や変更履歴の追跡を容易にします (Terraform Cloud, S3 backend など)。
- CI/CD パイプラインへの組み込み: Terraform コードを CI/CD パイプラインに組み込み、DNS 設定の変更を自動化します。
-
テスト: Terraform コードの変更を適用する前に、
terraform plan
コマンドで変更内容を確認し、必要に応じてterraform apply
を実行する前に手動テストや自動テストを実施します。 - 命名規則: リソース名や変数名に一貫性のある命名規則を適用し、コードの可読性と保守性を高めます。
- コメント: コードに適切なコメントを記述し、設定内容を分かりやすく説明します。
- バックアップ: Route 53 の設定を定期的にバックアップし、障害発生時の復旧に備えます (Route 53 は設定のスナップショット機能を提供していませんが、Terraform State をバックアップすることで代替できます)。
Terraform を活用することで、Route 53 の設定を効率的に管理し、インフラ全体の自動化を進めることができます。実務においては、上記の例を参考に、より複雑な要件にも対応できる柔軟な Terraform コードを記述することが求められます。
Discussion