VPC Peering接続で別VPCにあるRedisに接続する
前提
- AWSを利用
- VPC-A
- CIDR
- 192.168.0.0/16
- リソース
- Redis
- CIDR
- VPC-B
- CIDR
- 10.0.0.0/16
- リソース
- ECS(Nuxtサーバー)
- CIDR
- VPC-A
- VPC-AとVPC-Bの間にVPC Peering接続は設定済み
- VPC-BにあるECS(Nuxtサーバー)からVPC-AにあるRedisに接続する
デプロイしてみると、以下のエラーが発生
[nitro] [unhandledRejection] ConnectionTimeoutError: Connection timeout
at Socket.<anonymous> (/app/.output/server/node_modules/@redis/client/dist/lib/client/socket.js:177:124)
at Object.onceWrapper (node:events:631:28)
at Socket.emit (node:events:517:28)
at Socket._onTimeout (node:net:598:8)
at listOnTimeout (node:internal/timers:569:17)
at process.processTimers (node:internal/timers:512:7)
おそらく、ネットワークが繋がっていないと予測
VPC Peeringの設定に問題ないことは確認済みなので、
Redis側に設定しているセキュリティグループのインバウンドを確認する
VPC-BからVPC-AにRedisのクラスターエンドポイントのホストで名前解決ができるか確認してみる
(VPC-BにあるEC2の踏み台から)
$ nslookup xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
Name: xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com
Address: 192.168.95.16
Name: xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com
Address: 192.168.96.209
いけてる(Peering通せば、名前解決いけるんだっけか?)
軽くググって資料を見てみる
クライアントと Redis 間の TCP 接続を確認してみる
$ curl -v telnet://xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com:6379
特に応答もない...
試しに、
Redis側にあるセキュリティグループのインバウンドにVPC-BのCIDR(10.0.0.0/16)
を許可してみる
疎通いけた
$ curl -v telnet://xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com:6379
* Rebuilt URL to: telnet://xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com:6379/
* Trying 192.168.96.209...
* TCP_NODELAY set
* Connected to xxxxxxxx.sfvaih.clustercfg.apne1.cache.amazonaws.com (192.168.96.209) port 6379 (#0)
てっきり、VPC Peering接続したらインバウンドにくるIPは接続先のCIDRのIPになるかと勘違いしてました😂
でも、疑問はこれだけ残っている
- VPC Peering接続の設定だけで、DNS 解決を有効にしなくても名前解決ってできるんだっけ??
これを読むと...
DNSリゾルバは、ピアリング接続に関するルート情報を持っているか確認する。ピアリング接続に関するルートがある場合、通信経路にピアリング接続が含まれることがわかる。
DNSリゾルバは、ピアリング接続が正しく設定されている場合、ルートテーブルを参照しピアリング接続経由での通信を行う。
いけそうだけど、
じゃあ、VPC Peering接続の DNS 解決設定ってなんのためにあるんだっけか??(続く
VPC Peering接続のDNS名前解決の必要性はたぶんこれ
パブリックドメイン名を EC2 インスタンスのプライベート IP アドレスに解決できます。
パブリックのエンドポイントをプライベートIPで名前解決するためにあるのかな
ピアリングのみの設定だとプライベートのエンドポイントの名前解決だけができるようになるって感じだと思う