はじめに結論から
先日、AWS の Elastic IP を使っていてハマった。
Elastic IP から割り当てられる IP は、東京リージョンで発行したものだとしても日本の IP とは限らないので注意が必要である。
ハマった経緯
nginx + PHP を使っていて、nginx の設定で国外からのアクセスを弾く設定を追加しようとした。
EUのGDPRの対策などで国外からのアクセスをブロックするみたいな要求がたまにある。
上記記事を参考にnginxを設定を用意し、検証環境で検証したあと本番環境に適用したところ、本番環境でのみ500エラーが発生し、設定を切り戻した。
エラー内容の確認と原因
エラーの原因
nginx が動いているサーバーでは、 Laravel で作られたアプリケーションと、 Wordpress のサイトが動いていた。Laravel アプリケーションは Wordpress の RSS を読んで最新記事をアプリケーショントップに表示していた。
今回本番環境に割り当てられていた Elastic IP は US 地域のもので、日本のものではなかった。そのため、 Laravel から Wordpress の RSS を取得しに行く際に国外と判定されて弾かれてしまっていたため、Laravel のほうが500エラーとなってしまっていた。
エラーの特定フロー
実際に本番環境にnginxを適用させてみたところ、500エラーになった。エラー画面んが nginx のエラー画面ではなく、 Laravel のエラー画面だったため、アプリケーションにはアクセスできているが、アプリケーション側でエラーになっているようだった。
Laravel のエラーは Laravel のディレクトリの storage/logs 以下に図れるため、その内容を見ると、Wordpress にアクセスしている部分でエラーになっていることがわかり、今回のエラーの特定につながった。
まとめ
地味に盲点なので気をつけよう。
Elastic IP で日本のIP指定して払い出すことはできない。基本は US の IP になるようだ。どうしても日本の IP を払い出したかったら IP 払い出しガチャをするしかない。