1. HOME
  2. Blog
  3. Development
  4. NginxでS3をプロキシせざるを得ない時

NginxでS3をプロキシせざるを得ない時

S3から静的サイトを配信する場合、通常はS3の静的ホスティングを利用し直接配信するか、もしくはCloudFrontを組み合わせて配信するのが定石だと思います。しかしながら、諸般の事情により、一旦EC2上のNginxを経由して配信する必要が出てきましたので試してみました。ところが…

NginxでS3をproxy_passでプロキシしたが…

Nginxに以下のような設定を記述し、S3の静的サイトホスティングのアドレスをproxy_passでプロキシしてみました。しかし…

nginx.conf

S3からNginx経由のページが表示されたりされなかったり…

この場合、指定したS3ホスティングのページが表示されたりされなかったりといった問題が起き、小一時間ほど解決に時間を費やすことになりました。最初はS3のバケットポリシーの設定が適切でないのではと疑っていましたが、どうやらその様子でもなさそうでした。

Nginxのproxy_passは起動時または設定リロード時しか名前解決をしてくれない?

Nginx公式のトピックによると
 NGINX caches the DNS records until the next restart or configuration reload, ignoring the records’ TTL values.
参考: https://www.nginx.com/blog/dns-service-discovery-nginx-plus/

と記述があるとおり、NginxはDNSで指定されたTTLを無視し、起動時と設定リロード時のみURLのDNSの名前解決をおこなうため、再起動や設定リロードが行われない限りDNS名前解決が行われないようです。そのため、DNS情報が変更されても反映されず、アクセスできなくなるといったことが起きるようです。

常時DNSの名前解決をおこなうためにはresolverパラメータを指定

解決策としては、 proxy_passと一緒にresolverを指定すれば解決するようです。

nginx.conf

resolverのDNSサーバーの指定ですが、基本的にはproxy_passのアドレスが解決できるIPアドレスなら大丈夫だと思いますが、EC2からのアクセスならAmazonがインターネットゲートウェイを介して通信するインスタンス向けに提供しているAmazon DNS サーバーが無難かと思われます。


Amazon DNS サーバーのアドレスは、DNS resolutionが有効になったVPCのネットワークアドレス+2の値(VPCのIPv4ネットワークアドレスが10.0.0.0/16なら10.0.0.2) または169.254.169.253の固定アドレスとなります。