背景・目的
以前、Route 53 Resolverについて整理しましたが、今回は実際に手を動かしてみたいと思います。
実践
下記の環境でテストをしてみます。
VPCの構築
- AWSにサインインします
- VPCに移動します
- 「VPCを作成」をクリックします
- 下記の内容でVPCを作成します
- Publicサブネット、Private サブネットが1つづつ
- IGW
- S3 VPCe
- DNSオプションを無効化
S3の作成
- バケットを作成します
EC2インスタンスのセットアップ
- EC2に移動します
- ナビゲーションペインで「インスタンス」をクリックします
- 「インスタンスを起動」をクリックします
- 作成したPublic サブネットに起動します
EC2にSSH
- SSHします
% ssh -i {KEY} ec2-user@XX.XXX.XXX.XXX , #_ ~\_ ####_ Amazon Linux 2023 ~~ \_#####\ ~~ \###| ~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023 ~~ V~' '-> ~~~ / ~~._. _/ _/ _/ _/m/' [ec2-user@XXXXXX ~]$
クエリを実行
- S3バケットに対して、digを実行します
Inbound Endpointを作成する前なので想定通りです。
```bash
[ec2-user@ip-XX-XX-XX-XX ~]$ dig {S3バケット名}
;; communications error to 10.0.0.2#53: timed out
;; communications error to 10.0.0.2#53: timed out
;; communications error to 10.0.0.2#53: timed out
; <<>> DiG 9.18.28 <<>> {S3バケット名}
;; global options: +cmd
;; no servers could be reached
[ec2-user@ip-XX-XX-XX-XX ~]$
```
Resolver Inbound Endpointの作成
セキュリティグループの作成
- EC2に移動します
- ナビゲーションペインで「セキュリティグループ」を選択します
- 「セキュリティグループを作成」をクリックします
- 下記を入力し、「セキュリティグループを作成」をクリックします
インバウンドエンドポイントの作成
- Route 53 Resolverに移動します
- トップページで「エンドポイントの設定」をクリックします
- DNSクエリの方向では、「インバウンドのみ」を選択し、「次へ」をクリックします
- 下記を入力し、「次へ」をクリックします
- 確認画面で「送信」をクリックします
- リゾルバーのVPC画面で、作成できたことがわかります
- ナビゲーションペインで「インバウンドエンドポイント」をクリックすると、作成されていることがわかります
クエリを実行(再)
- S3バケットに対して、digを実行します。失敗しました
EC2のデフォルトのDNSは、VPCのデフォルトリゾルバーを参照しているので想定内です
```bash
[ec2-user@ip-XX-XX-XX-XX ~]$ dig {S3バケット名}
;; communications error to 10.0.0.2#53: timed out
;; communications error to 10.0.0.2#53: timed out
;; communications error to 10.0.0.2#53: timed out
; <<>> DiG 9.18.28 <<>> {S3バケット名}
;; global options: +cmd
;; no servers could be reached
[ec2-user@ip-XX-XX-XX-XX ~]$
```
DNS設定
- ナビゲーションペインで「インバウンドエンドポイント」に移動します
- プライベートIPアドレスを確認します(メモします)
- EC2で
/etc/resolv.conf
を開きます。デフォルトでは下記の定義になっていますnameserver 10.0.0.2 search ap-northeast-1.compute.internal
- 上記でメモしたインバウンドエンドポイントにnameserverのIPアドレスを変更します
クエリを実行(再々)
- 再々度、S3バケットに対して、digを実行します。成功しました
[ec2-user@ip-XX-XX-XX-XX ~]$ dig {S3バケット名} ; <<>> DiG 9.18.28 <<>> {S3バケット名} ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24383 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;{S3バケット名}. IN A ;; AUTHORITY SECTION: . 2153 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2024112100 1800 900 604800 86400 ;; Query time: 9 msec ;; SERVER: {プライベートIPアドレス}#53({プライベートIPアドレス}) (UDP) ;; WHEN: Thu Nov 21 07:26:19 UTC 2024 ;; MSG SIZE rcvd: 134 [ec2-user@ip-XX-XX-XX-XX ~]$
クエリログの有効化
クエリログが出力されるように設定します。
- Route 53 Resolverに移動します
- ナビゲーションペインで「クエリのログ記録」をクリックします
- 「クエリログ記録の設定」をクリックします
- 下記を入力し、「クエリログの設定」をクリックします
CWLを確認
クエリを実行
- S3バケットに対して、digを実行します。
[ec2-user@ip-XX-XX-XX-XX ~]$ dig {S3バケット名} ; <<>> DiG 9.18.28 <<>> {S3バケット名} ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24383 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;{S3バケット名}. IN A ;; AUTHORITY SECTION: . 2153 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2024112100 1800 900 604800 86400 ;; Query time: 9 msec ;; SERVER: {プライベートIPアドレス}#53({プライベートIPアドレス}) (UDP) ;; WHEN: Thu Nov 21 07:26:19 UTC 2024 ;; MSG SIZE rcvd: 134 [ec2-user@ip-XX-XX-XX-XX ~]$
ログを確認
-
下記のログが出力されていました
2024-11-21T16:37:54.000+09:00 { "version": "1.100000", "account_id": "XXXXXXX", "region": "ap-northeast-1", "vpc_id": "vpc-XXXXXX", "query_timestamp": "2024-11-21T07:37:54Z", "query_name": "{S3バケット名}.", "query_type": "A", "query_class": "IN", "rcode": "NXDOMAIN", "answers": [], "srcaddr": "XXXXXX", "srcport": "48000", "transport": "UDP", "srcids": { "resolver_endpoint": "rslvr-in-XXXX", "resolver_network_interface": "rni-XXXX" } }
考察
今回、Route 53 Resolverのインバウンドエンドポイントを試しました。実際に手を動かすことで挙動のイメージが少しつきました。
参考