Amazon Route 53 Resolverを試してみた

# 背景・目的
以前、Route 53 Resolverについて整理しましたが、今回は実際に手を動かしてみたいと思います。

https://qiita.com/zumax/items/715de9f932f07a7ffceb

# 実践
下記の環境でテストをしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/02bcdfdc-31bf-4934-5748-39f2dcb83401.png)


## VPCの構築
1. AWSにサインインします
1. VPCに移動します
1. 「VPCを作成」をクリックします
1. 下記の内容でVPCを作成します
    - Publicサブネット、Private サブネットが1つづつ
    - IGW
    - S3 VPCe
    - DNSオプションを無効化
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7275bf59-dc24-2113-7f9c-05920501dea0.png" width=300 />

## S3の作成
1. バケットを作成します


## EC2インスタンスのセットアップ
1. EC2に移動します
1. ナビゲーションペインで「インスタンス」をクリックします
1. 「インスタンスを起動」をクリックします
1. 作成したPublic サブネットに起動します

### EC2にSSH
1. SSHします
    ```bash
    % 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 ~]$ 
    ```

### クエリを実行
1. S3バケットに対して、digを実行します
:::note info
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の作成
### セキュリティグループの作成
1. EC2に移動します
1. ナビゲーションペインで「セキュリティグループ」を選択します
1. 「セキュリティグループを作成」をクリックします
1. 下記を入力し、「セキュリティグループを作成」をクリックします
    - セキュリティグループ名
    - 説明
    - VPC
    - インバウンドルールにUDPとTCPのDNSを指定。ソースは作成したVPCを指定 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e93d82a5-8a22-8b6e-7664-7b539f1e0ffe.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f9b195d8-5058-db60-5061-0fb81956093a.png)


### インバウンドエンドポイントの作成
1. Route 53 Resolverに移動します
1. トップページで「エンドポイントの設定」をクリックします
1. DNSクエリの方向では、「インバウンドのみ」を選択し、「次へ」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/61f381cb-0904-c263-08aa-163045dadf68.png" width =500 />
1. 下記を入力し、「次へ」をクリックします
    - エンドポイント名：任意
    - VPC：作成したVPC
    - セキュリティグループ：上記で作成したセキュリティグループ
    - エンドポイントタイプ：IPv4
    - エンドポイントのプロトコル：Do53
    - IPアドレス#1、#2：作成したPrivate Subnet（※今回AZが1つのため同一を指定しています）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5e1622c0-ac8a-ff7d-87fc-3aa60dfb8594.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e26abb84-1169-33a8-23a2-cc9c1ff12077.png)
1. 確認画面で「送信」をクリックします
1. リゾルバーのVPC画面で、作成できたことがわかります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a6efaea6-23aa-4e03-9079-07b3bc62c627.png)
1. ナビゲーションペインで「インバウンドエンドポイント」をクリックすると、作成されていることがわかります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2f8c8f6d-a8c9-2e5a-afa6-441be32fb912.png)

### クエリを実行（再）
1. S3バケットに対して、digを実行します。失敗しました
:::note info
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設定
1. ナビゲーションペインで「インバウンドエンドポイント」に移動します
1. プライベートIPアドレスを確認します（メモします）
1. EC2で`/etc/resolv.conf`を開きます。デフォルトでは下記の定義になっています
    ```conf
    nameserver 10.0.0.2
    search ap-northeast-1.compute.internal
    ```
1. 上記でメモしたインバウンドエンドポイントにnameserverのIPアドレスを変更します


### クエリを実行（再々）
1. 再々度、S3バケットに対して、digを実行します。成功しました
    ```bash
    [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 ~]$ 
    
    ```

## クエリログの有効化
クエリログが出力されるように設定します。

1. Route 53 Resolverに移動します
1. ナビゲーションペインで「クエリのログ記録」をクリックします
1. 「クエリログ記録の設定」をクリックします
1. 下記を入力し、「クエリログの設定」をクリックします
    - クエリログ記録の設定名：任意
    - クエロログの送信先：今回は、CWLを指定
    - CWLのロググループの指定：新しいロググループ名
    - クエリをログ記録するVPC：作成したVPCを指定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a4e497cb-867e-3c1e-2ca4-1a1eb302a90e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/791546ac-410b-c051-dcee-497b608d63b9.png)

### CWLを確認
1. CloudWatchに移動します
1. ナビゲーションペインで「ロググループ」をクリックします
1. ログストリームができていました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c45b4b74-7edf-e7ac-b68e-6f9d5d76ef93.png)

### クエリを実行
1. S3バケットに対して、digを実行します。
    ```bash
    [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 ~]$ 
    
    ```
### ログを確認
1. ログストリームができていました。クリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7879f1d9-1268-ea57-5091-b5d5c2dc68c9.png)

1. 下記のログが出力されていました
    ```json
    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のインバウンドエンドポイントを試しました。実際に手を動かすことで挙動のイメージが少しつきました。


# 参考

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver.html