概要
AWSのRoute53を使用する際、プライベートホストゾーンを作成することでプライベートIPアドレスを返却することができます。
これにより、特定のVPC内からの通信がネットワーク内で完結するようになり、効率的でセキュアな通信が可能になります。
本記事ではプライベートホストゾーンの導入方法および概要についてまとめたいと思います。
パブリックホストゾーンの場合
まずはパブリックホストゾーンを使用した名前解決の例を見てみましょう。
テスト用のパブリックホストゾーンとしてtaka_2525.jp
を作成してみます。
さらに、とあるALBへのAレコード(エイリアス)としてservice.taka_2525.jp
のレコードを作成してみます。
この状態で名前解決を行うとALBのグローバルIPアドレスが返却されます。
dig 'service.taka_2525.jp'
# => ALBのグローバルIPアドレスを返却
この結果は、VPC内外を問わず同じものです。
(VPC内で実行したとしてもグローバルIPアドレスが返却される)
プライベートホストゾーンを追加してみる
ここからが本題です。
上記の設定に追加して、プライベートホストゾーンのtaka_2525.jp
を作成します。
今回はテストなのでtest_vpc
というVPCに紐づけることとします。
VPCの選択があること以外は、パブリックホストゾーンの時と同じ手順です。
左上にプライベートと表示されていますね。
パブリックホストゾーンの時と同じように、ALBへのAレコードservice.taka_2525.jp
を作成します。
この状態で名前解決を行うとどうなるのでしょうか。
VPC外からのアクセス
今回テスト用に用意したtest_vpc
の外からのアクセスを考えてみます。
この場合は、パブリックホストゾーンのレコードが参照されるため、名前解決の結果は前回と同じです。
dig 'service.taka_2525.jp'
# => ALBのグローバルIPアドレスを返却(さっきと一緒)
VPC内からのアクセス
では、test_vpc
内のリソースからのアクセスの場合はどうなるでしょうか。
VPC内の踏み台サーバー等から同様のコマンドを実行してみます。
# VPC内のリソースで実行
dig 'service.taka_2525.jp'
# => ALBのプライベートIPアドレスを返却
先ほどとはうってかわり、プライベートIPアドレスが返却されるようになりました。
注意点!
プライベートホストゾーンを作成したことにより、test_vpc
内からの名前解決はパブリックホストゾーンのtaka_2525.jp
ではなくプライベートホストゾーンのtaka_2525.jp
で行われるようになりました。
プライベートホストゾーンにレコードがない時にパブリックホストゾーンのレコードにフォールバックするわけではないので注意が必要です(自分はここで失敗しました)。
わかりづらいと思うので以下の例を考えてみます。
私の失敗を再現してみる
今までの設定は一旦忘れて、以下のような状況を想定してみます。
パブリックホストゾーンtaka_2525.jp
- Aレコード:
service_a.taka_2525.jp
→ ALB_aへのエイリアス - Aレコード:
service_b.taka_2525.jp
→ ALB_bへのエイリアス
プライベートホストゾーンtaka_2525.jp
- Aレコード:
service_a.taka_2525.jp
→ ALB_aへのエイリアス
(ALB_bへのレコードは作成していない)
パブリックホストゾーンにはALB_aとALB_bへのエイリアスが設定されていますが、プライベートホストゾーンにはALB_aへのみのエイリアスを設定しました。
この状態でservice_b.taka_2525.jp
の名前解決を行ってみます。
VPC外からのアクセス
dig 'service_b.taka_2525.jp'
# => ALB_bのグローバルIPアドレスを返却
問題なく名前解決できています。
VPC内からのアクセス
VPC内からアクセスしてみます。
# VPC内のリソースで実行
dig 'service_b.taka_2525.jp'
# => NODOMAIN(レコードが見つからない)
あれ、名前解決できないですね...
プライベートホストゾーンを作成する前は名前解決できていたのに...
それもそのはずで、AWS公式には以下のように書かれています。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html
一致するプライベートホストゾーンがあるが、リクエストのドメイン名とタイプに一致するレコードがない場合、Resolver はリクエストをパブリック DNS リゾルバーに転送しません。代わりに、NXDOMAIN (存在しないドメイン) をクライアントに返します。
つまり、プライベートホストゾーンで名前解決が完了するようにレコードを用意しておく、もしくは名前空間が競合しないようにホストゾーンを作成しておく必要があります。
最後に
プライベートホストゾーンを作成したら名前解決ができなくなってめちゃくちゃ焦りました(検証環境なので大きな問題はありませんでしたが)。
プライベートホストゾーンで名前解決できない時はパブリックホストゾーンのレコードを参照してくれるのではないかと勝手に希望的観測を持っていましたが、きちんと公式を読むのが肝要だと再確認させられました。
それでは、良いお年を。