現在、多くのエッジロケーションでCloudFrontを使用して、さまざまなサイズのサイズに動的にサイズ変更された製品画像(50万近く)を提供しています。Cloudfrontディストリビューションは、オリジンEC2 phpスクリプトを使用してS3から元の画像を取得し、提供されたクエリ文字列基準(幅、高さ、トリミングなど)に基づいて動的に変換し、Cloudfrontにストリーミングして、エッジの場所にキャッシュします。
ただし、キャッシュされていない画像を初めてロードするWebサイトの訪問者は、この非常に大きな変換に見舞われます。
エンドユーザーが特定のサイズの画像を最初にヒットしないように、(各画像のURLを要求するバッチジョブを使用して)画像を「事前キャッシュ」する機能が必要です。
残念ながら、画像はプリキャッシュサービスに割り当てられたEdge Locationにのみキャッシュされるため、別のEdge Locationを使用するWebサイトの訪問者は、キャッシュされた画像を取得できず、オリジンサーバーで大きなサイズ変更スクリプトが実行されます。
すべてのエッジロケーションが妥当なロード時間内に画像を取得できる、私たちが得た唯一のソリューションは次のとおりです。
オリジンEC2phpスクリプトを指すCloudfrontディストリビューションがあります。ただし、上記の画像変換を行う代わりに、オリジンスクリプトはリクエストとクエリ文字列のパラメーターを別のCloudfrontディストリビューションに転送します。このディストリビューションには、画像変換を実行するオリジンEC2phpスクリプトがあります。このように、画像は常にEC2インスタンス(アイルランド)の近くのエッジロケーションにキャッシュされるため、画像が別のエッジロケーションからリクエストされたときにさらに別の変換を実行する必要がありません。
したがって、たとえば、スウェーデンでのリクエストは、SwedishEdgeLocationがキャッシュしていない/image/ stream / id / 12345にヒットするため、アイルランドのEC2マシンであるオリジンにリクエストを送信します。次に、EC2の「ストリーミング」ページは別のCloudfrontディストリビューションから/ image / size / id / 12345をロードします。これは、キャッシュされていないIrishEdgeLocationにヒットします。次に、同じEC2マシンであるオリジンにリクエストを送信しますが、サイズ変更を行う「サイズ」ページにリクエストを送信します。この後、スウェーデンとアイルランドの両方のEdgeLocationに画像がキャッシュされます。
さて、フランスからのリクエストで同じ画像がリクエストされました。フレンチエッジロケーションにはキャッシュされていないため、オリジンを呼び出します。これは、アイルランドのEC2マシンであり、アイルランドのエッジロケーションに再びヒットする2番目のCFディストリビューションを呼び出します。今回は画像がキャッシュされており、すぐに返すことができます。これで、フランスのEdge Locationにも画像がキャッシュされますが、「サイズ変更」ページを呼び出す必要はありません。アイルランドでは、キャッシュされた画像を含む「ストリーミング」ページのみです。
これは、アイルランドの「事前キャッシュ」バッチサービスが、アイルランドのEdge Locationに対してリクエストを実行し、ウェブサイトの訪問者からリクエストされる前に画像を事前にキャッシュできることも意味します。
少しばかげているように見えることはわかっていますが、画像のサイズが変更されている間、エンドユーザーが長時間待つ必要がないという要望があれば、それが唯一の具体的な解決策のようです。
別の/より良い解決策を見落としていませんか?上記へのコメントはありますか?