Open4
静的ファイルをCDN経由で配信するようにしたら一部の人がアクセスできなくなった件
背景
静的ファイルを別ドメインのCDNから配信したい
- zenn.devで利用しているNext.jsではビルド時に静的ファイルが
_next/static
ディレクトリの中に書き出される - このファイルをもともとアプリ同一ドメインである
zenn.dev
から配信していた(https://zenn.dev/_next/static/foo.js
のようなイメージ)- ちなみに前も今もGoogle Cloud CDNを使っている
- しかし同一ドメインから静的ファイルを配信する場合、zenn.devのcookieが静的ファイルへのリクエストにまでついてしまう
- パフォーマンスと安全性の観点から必要なエンドポイントにのみcookieを送信したい
サブドメインではなく別ドメインにしたい
- cookieをセットするときに
domain
属性を空にすればcookieはサブドメイン(例example.zenn.dev
)には送られない(参考: CookieのDomain属性は 指定しない が一番安全) - しかし、外部サービスによりつけられるcookieはコントロールしづらいことがある。例えばGoogle Analytics(GA)やStripeのcookieなど。※ GAは設定を変えられることは確認済み
- そこで静的ファイルの配信には別ドメイン(
zncdn.dev
)を使うことに。CDNにはCloud CDNを継続して利用
発生した問題1. 一部のインターネットプロバイダーを使用しているユーザーが静的ファイルにアクセスできない
- 静的ファイルの配信元を別ドメイン(
zncdn.dev
)に切り替えたところ、Twitterで「Zennのスタイルがあたらなくなった」という声を観測 - ヒアリングしたところ一部のインターネットプロバイダーで
zncdn.dev
の静的ファイルへのアクセスがブロックされていることが分かった(J:COMユーザーが多かった)
原因(憶測)
- GCPでの設定時、もともと別の用途で使っていたCDNのために確保した静的外部IPアドレスを使いまわしてしまった。具体的には
static.zenn.dev
というドメインを紐付けていたIPアドレスをzncdn.dev
にそのまま使ってしまった - その直後にTerraformのapplyの都合で
zncdn.dev
に別のIPアドレスに紐付け直したことが影響しているかもしれない - このへんの動きがフィッシングサイトっぽくてブロックされたんじゃないか?と疑ってるが実際のところどうなのかは分からない
解決策
- 新しいドメインを取得し、新しい静的外部IPアドレスに紐付けた。問題が発生していたユーザーが問題なくアクセスできるようになったことを確認したうえでNext.jsのアセットの読み込み元を変更
発生した問題2. 一部の会社のインターネット環境からアクセスできない
- 新・新ドメインでもブロックされてしまうことがある模様
- たぶんその会社に導入されているフィルタリングソフトによって弾かれている
- 色々と調べてみると、とあるフィルタリングソフトのフォーラムで「うちの製品はドメインが取得されてから30日間はそのドメインを信頼できないものとみなすよ」的な記述を発見。ドメインを取ってからまだ1週間ほどしか経っていないのでそれが原因でブロックされているのかもしれない
解決策
- とりあえず様子見か?
新しいドメインを問答無用でブロックしてしまうソフトもあるらしい。一度もどすか・・・