こんにちは、岩城です。
VPC LambdaからSNSを利用しようと際、DNSの名前解決に失敗するError: getaddrinfo ENOTFOUND
が出力する事象に遭遇しました。
原因と解決方法について共有します。
結論
SNSのVPCエンドポイントをDNS名有効の状態で作成していましたが、サブネットに関連付けていませんでした。
この状態ではVPCエンドポイントのENIが作成されず、sns.ap-northeast-1.amazonaws.com
への名前解決の結果、プライベートIPが返らず名前解決に失敗し、Error: getaddrinfo ENOTFOUND
が出力しました。
VPCエンドポイントをサブネットに関連付けるように設定変更したところ、名前解決に成功し問題は解消されました。
もう少し詳しく
結論に書いてあることがすべてなのですが、もう少し詳しく説明していきます。
VPCエンドポイントを作成するとき、DNS名を有効化
を有効にしていました。(マネジメントコンソールだとデフォルトで有効)
これを有効化すると、VPCエンドポイントで指定したAWSサービスのエンドポイントの名前解決をAmazon-provided private DNSで行うようになります。VPCエンドポイント作成時に指定したサブネット上にENIが作成され、そのENIに設定されたプライベートIPが返ります。
VPCエンドポイントを利用しない場合、パブリックDNSに対してsns.ap-northeast-1.amazonaws.com
の名前解決を行いグローバルIPが返ります。
この辺のパブリックDNSとAmazon-provided private DNSのどちらで名前解決が行われるかは、AWSドキュメントに以下のように記載されています。
名前空間が重複するパブリックホストゾーンとプライベートホストゾーン
つまり、パブリックホストゾーンとプライベートホストゾーンならプライベートホストゾーンでの名前解決を優先するようになります。
本エントリのケースでは、VPCエンドポイントのDNS名を有効化するとsns.ap-northeast-1.amazonaws.com
がプライベートホストゾーンで名前解決するようになるため、VPCエンドポイントのENIのプライベートIPを返そうとします。
VPCエンドポイントを作成時にサブネットを関連付けておかないとENIが作成されてないので、ENIに設定されたプライベートIPが返らず名前解決に失敗するという流れです。
名前解決の様子
実際に名前解決して返されるIPを確認した結果のログを載せておきます。
VPCエンドポイント未作成の状態でパブリックDNSに名前解決した結果です。グローバルIPが返ってきました。
[ssm-user@ip-10-0-136-34 bin]$ dig sns.ap-northeast-1.amazonaws.com
; <<>> DiG 9.16.42-RH <<>> sns.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23788
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sns.ap-northeast-1.amazonaws.com. IN A
;; ANSWER SECTION:
sns.ap-northeast-1.amazonaws.com. 1 IN A 18.183.37.43
;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Wed Aug 16 04:12:32 UTC 2023
;; MSG SIZE rcvd: 77
つぎに、VPCエンドポイントをサブネットに関連付けない状態で作成した際の名前解決の結果です。Amazon-provided private DNSへの名前解決を図りますが、VPCエンドポイントのENIが存在しないのでプライベートIPが返ってきていません。
[ssm-user@ip-10-0-136-34 bin]$ dig sns.ap-northeast-1.amazonaws.com
; <<>> DiG 9.16.42-RH <<>> sns.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61831
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sns.ap-northeast-1.amazonaws.com. IN A
;; AUTHORITY SECTION:
sns.ap-northeast-1.amazonaws.com. 300 IN SOA ns-1536.awsdns-00.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Wed Aug 16 04:16:37 UTC 2023
;; MSG SIZE rcvd: 145
さいごに、VPCエンドポイントに改めてサブネットを関連付けた後の名前解決の結果です。VPCエンドポイントのENIが作成されたので、プライベートIPが返ってきました。
[ssm-user@ip-10-0-136-34 bin]$ dig sns.ap-northeast-1.amazonaws.com
; <<>> DiG 9.16.42-RH <<>> sns.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24715
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sns.ap-northeast-1.amazonaws.com. IN A
;; ANSWER SECTION:
sns.ap-northeast-1.amazonaws.com. 60 IN A 10.0.146.211
sns.ap-northeast-1.amazonaws.com. 60 IN A 10.0.134.33
;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Wed Aug 16 04:35:16 UTC 2023
;; MSG SIZE rcvd: 93
おわりに
VPCエンドポイントをサブネットに関連付けていないと想定していなかったので、原因の特定までに少し時間を要しました。
本エントリが、どなかたのお役に立てれば幸いです。