ユーザー「AWSのS3画像が見れない!」への対応メモ
概要
リモートのS3に画像を配置し、期限付き署名付きURLで表示しているWebサイトで、一部のユーザーで「画像が真っ白で表示されない!」というインシデント発生時の調査メモ。アプリやサーバ、ネットワークを一通り確認しても原因が見つからなかったが、最終的にユーザー側のセキュリティソフトによるアクセスブロックが原因と判明した流れをまとめる。
前提
Laravel+Reactで構築されたWebサイトにおいて、S3のバケットから生成した期限付き署名付きURLを使い、画像を<img>
タグで表示している。通常は問題なく表示されるが、特定ユーザーから「画像が見れない」と報告された。
S3自体はパブリックへのアクセスではなく、セキュアな方法(期限付き署名付きURL)を使っているので、アプリケーション側が何らかの認証不備や権限設定ミスをしている可能性も疑われた。だが、過去にこの機能でインシデントはなく、急に一部ユーザーだけ表示できなくなったのが謎だった。
調査の流れ
1. アプリケーション側(Laravel)のエラーログを確認
画像表示時のURL生成処理やデータ取得処理でエラーが出ていないかチェック。結果、該当のユーザーがアクセスしていてもエラーログには何も出ていなかった。レスポンスも正常に返している形跡がある。
2. nginx側のエラーログを確認
Webサーバの段階で404や403などが出ていないかを調べた。こちらも特に怪しいログはなく、該当リクエストが失敗している形跡はなし。
3. クライアントサイドのログ(ブラウザコンソール)
GCP側で計測しており、ReactのエラーやJavaScriptの例外が発生していないかをチェック。こちらもエラー表示はなく、ネットワークタブでもステータスコードの異常が見当たらない。正常にGETリクエストが送信されているように見える。
4. S3のアクセスログは未設定
S3バケットのアクセスログを有効化していなかったため、実際にS3側でリクエストを受け取っているかどうかの詳細を追えなかった。ただ、ここまででアプリケーションやサーバのログでは問題を確認できず、原因不明のまま。
ユーザー側の環境を疑う
サーバサイドにエラーなし、ブラウザ上にもエラーなし。しかも不具合を訴えるユーザーはごく一部。こうなると「アクセスするユーザー環境の問題」を疑う。
ユーザーがいつ機能を使い始めたか
当該のユーザーAは数ヶ月前から同じ機能を利用していたが、これまでは問題なく表示できていた。ただし、今回の事象発生直前にユーザーAが何をしたかは不明。OSやブラウザのバージョン、会社のセキュリティソフトなどに変更が入った可能性はある。
同じ組織の他ユーザーにも同現象
ユーザーBも同じタイミングで「画像が見れない」と報告してきた。調べてみると、ユーザーAと同じ組織に属していることが判明。つまり、その組織自体が特定のURLやドメインへのアクセスをブロックする仕組みを導入しているのではないかと推測した。
画像を直接開いてもらうテスト
ユーザーAとユーザーBに対し、「画像を右クリックして‘新しいタブで画像を開く’を試してほしい」と依頼。すると、ブラウザに「このURLアクセスはセキュリティ規定で禁止されている」という警告が表示されたとのこと。つまり、アプリ側ではなくユーザー環境側のセキュリティポリシーが原因で画像取得がブロックされていた。
これでやっと「S3の特定ドメイン(または署名付きURL)へのアクセスが組織で制限されている」という仮説がほぼ確定。過去にインシデントが発生しなかったのは、その組織以外のユーザーには影響がなかったためと考えられる(そらログが出ないはずだ...)
ブロックの原因と対処
今回のように、サーバサイドやアプリのログだけでは何もエラーが見つからないのにユーザーが画像を見れない場合は、ユーザー側のネットワーク制限を疑う余地がある。特に企業や官公庁系の組織では、セキュリティポリシーやプロキシ設定によって外部アクセスが制限されることがある。
原因
- 組織で導入しているセキュリティソフトやファイアウォールがS3関連のURLをブロック
- 期限付き署名付きURLが不審URL扱いされている
- AWSの特定リージョンやドメインへの通信が制限されている
まとめ・結論
- 一部ユーザーだけAWS S3の画像が見れないケースでは、まずアプリケーションやサーバのログをチェックして問題がないか洗い出す
- エラーが見つからず、発生ユーザーが限定的な場合は、ユーザーが所属する組織のセキュリティ設定を疑おう
今回の事例では、ユーザー環境のセキュリティポリシーによってS3の画像URLがブロックされていた。アプリケーション上のバグや設定ミスではなかったので、ユーザー環境の聞き取りが重要だった。
最終的には「画像を直接開いたときに警告表示されるか」を確認して、ブロックの存在を特定できた。サーバサイドの検証だけで原因がわからない場合、ユーザーの操作やネットワーク設定を丹念に調査することが大切。もし同様のトラブルに遭遇したら、まずはエラー箇所の切り分けを行い、ユーザー側環境の可能性も視野に入れて対応しよう。
Discussion