SJ blog
architecture
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Route53ヘルスチェックとフェイルオーバー設計 — 自動DNS切り替え

Route53ヘルスチェックの種類(エンドポイント/計算/CloudWatch)、フェイルオーバールーティング、プライベートリソースへのヘルスチェック、SNS通知との連携を解説。

一言結論

VPC内のプライベートリソースはRoute53ヘルスチェッカーから直接監視できないため、CloudWatchアラームを介したヘルスチェックを使うことがフェイルオーバー自動化の唯一の手段となる。

Route53ヘルスチェックの種類

Route53は3種類のヘルスチェックを提供する。

1. エンドポイントヘルスチェック:
   → HTTP/HTTPS/TCPでエンドポイントを直接監視
   → 世界中のRoute53ヘルスチェッカーから監視

2. 計算ヘルスチェック(Calculated):
   → 複数のヘルスチェックを論理演算(AND/OR)で組み合わせ
   → 子ヘルスチェックのX/Y以上が正常なら正常とみなす

3. CloudWatchアラームに基づくヘルスチェック:
   → CloudWatchアラームの状態を参照
   → VPC内のプライベートリソースのヘルスチェックに利用

エンドポイントヘルスチェックの設定

# HTTPヘルスチェックの作成
aws route53 create-health-check \
  --caller-reference "my-health-check-001" \
  --health-check-config '{
    "Type": "HTTP",
    "IPAddress": "203.0.113.10",
    "Port": 80,
    "ResourcePath": "/health",
    "FullyQualifiedDomainName": "api.example.com",
    "RequestInterval": 30,
    "FailureThreshold": 3,
    "MeasureLatency": true
  }'
設定パラメータ:
  RequestInterval: 30秒(標準)または 10秒(高速、料金高)
  FailureThreshold: 連続失敗回数(1〜10、デフォルト3)
  ResourcePath: ヘルスチェック対象のパス(例: /health)
  
判定の仕組み:
  Route53は世界中の複数ロケーションからチェック
  → 18以上のロケーションが監視
  → 「健全」判定: 監視ロケーションの18%以上が成功と判定

フェイルオーバールーティング

プライマリが障害時にセカンダリに自動切り替えする。

# プライマリレコードの作成(フェイルオーバー: PRIMARY)
aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890 \
  --change-batch '{
    "Changes": [{
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "api.example.com",
        "Type": "A",
        "SetIdentifier": "primary",
        "Failover": "PRIMARY",
        "TTL": 60,
        "ResourceRecords": [{"Value": "203.0.113.10"}],
        "HealthCheckId": "HEALTH_CHECK_ID"
      }
    }]
  }'

# セカンダリレコード(フェイルオーバー: SECONDARY)
aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890 \
  --change-batch '{
    "Changes": [{
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "api.example.com",
        "Type": "A",
        "SetIdentifier": "secondary",
        "Failover": "SECONDARY",
        "TTL": 60,
        "ResourceRecords": [{"Value": "203.0.113.20"}]
      }
    }]
  }'
フェイルオーバーの動作:
  正常時: PRIMARY レコードを返す
  障害時(ヘルスチェック失敗): SECONDARY レコードを返す
  セカンダリにはヘルスチェック不要(SECONDARYはフォールバック先)
  
注意: TTLが60秒の場合、切り替えに最大60秒かかる
      高速なフェイルオーバーには低TTL(10〜30秒)を使う

プライベートリソースへのヘルスチェック

Route53のヘルスチェッカーはパブリックIPからアクセスするため、VPC内のプライベートリソースは直接監視できない。

解決策: CloudWatchアラームベースのヘルスチェック

プライベートEC2/RDS → CloudWatchメトリクス
   ↓ (アラーム)
CloudWatch Alarm → Route53ヘルスチェック(アラーム状態参照)

Route53がDNSフェイルオーバー

設定手順:
1. EC2インスタンスにCloudWatch Agentを設定
2. 該当メトリクスにアラームを作成
3. Route53ヘルスチェックでアラームを参照
4. フェイルオーバーレコードにヘルスチェックを紐付け
# CloudWatchアラームに基づくヘルスチェックの作成
aws route53 create-health-check \
  --caller-reference "private-resource-check" \
  --health-check-config '{
    "Type": "CLOUDWATCH_METRIC",
    "CloudWatchAlarmConfiguration": {
      "EvaluationPeriods": 1,
      "Threshold": 1,
      "ComparisonOperator": "GreaterThanOrEqualToThreshold",
      "Period": 60,
      "MetricName": "UnhealthyHostCount",
      "Namespace": "AWS/ApplicationELB",
      "Statistic": "Average",
      "Dimensions": [{
        "Name": "TargetGroup",
        "Value": "targetgroup/my-tg/xxx"
      }],
      "Region": "ap-northeast-1"
    }
  }'

計算ヘルスチェック(Calculated Health Check)

複数チェックを組み合わせる複雑な正常性評価に使う。

ユースケース:
  アプリの全体的な健全性を複数チェックで評価
  
  例:
  - Web サーバーチェック(3台中2台以上が正常)
  - DBチェック(プライマリが正常)
  - キャッシュチェック(Redisが正常)
  → 上記3チェックがすべて正常な場合のみ「健全」

SNS通知との連携

ヘルスチェック失敗時にアラートを送信する。

# ヘルスチェック失敗時のSNS通知
aws cloudwatch put-metric-alarm \
  --alarm-name "Route53-HealthCheck-Failure" \
  --metric-name "HealthCheckStatus" \
  --namespace "AWS/Route53" \
  --statistic "Minimum" \
  --period 60 \
  --threshold 1 \
  --comparison-operator "LessThanThreshold" \
  --evaluation-periods 1 \
  --dimensions Name=HealthCheckId,Value=HEALTH_CHECK_ID \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:alert-topic

注意: Route53ヘルスチェックのメトリクスは us-east-1 リージョンにのみ存在する。

試験頻出ポイント

シナリオ回答
プライベートEC2のヘルスチェックCloudWatchアラームベースのヘルスチェック
プライマリ障害時に自動でセカンダリへフェイルオーバールーティング
複数チェックを組み合わせた判定計算ヘルスチェック(Calculated)
ヘルスチェックのメトリクスリージョン常に us-east-1
セカンダリにヘルスチェックは必要か不要(SECONDARYはフォールバック先)

まとめ

Route53ヘルスチェックはエンドポイント、計算、CloudWatchアラームの3種類があり、VPC内プライベートリソースにはCloudWatchアラームベースを使う。フェイルオーバールーティングと組み合わせることで自動DNS切り替えを実現できる。