この記事は、ニフティグループ Advent Calendar 2023 12日目の記事です。
はじめに
こんにちは。ニフティに新卒で入社して五年目の佐々木です。今回はAWSのサービスの一つであるCloudFrontについてコスト削減を行う方法を紹介します。
以前ご紹介したS3のコスト削減については、こちらのブログ記事をご参考ください。
背景
ニフティではサービス基盤にAWSを活用しており、コスト削減のためにサービスのインフラ効率を追求する取り組みや、有志で取り組んでいる社内でのコスト削減勉強会なども実施しています。
前回の記事に引き続き、CloudFront周りでもコスト削減を行う機会があったので、コストを下げられるポイントや注意点について簡単にご紹介したいと思います。
この記事の内容
- 触れること
- CloudFrontのコスト削減方法
- CloudFrontのコストを削減する上での注意点
- 実際に試した社内でのコスト削減事例とTips
- 触れないこと
- CloudFront自体の詳細の説明
- 自社での詳しいインフラ構成(コスト削減が目的のため、今回は一般的なインフラ構成のご紹介に限らせていただきます)
CloudFrontの基本
CloudFrontとは、ざっくり説明するとウェブコンテンツの配信速度の高速化を目的としたAWSのCDN(Content Delivery Network)サービスです。CDNはサーバーの負荷を軽減し、コンテンツをキャッシュすることで素早くユーザにデータを提供するためのシステムです。
CloudFrontを用いることで、システムのサーバーの負荷を下げたり、エッジロケーションの活用によるコンテンツの配信の高速化などを実現できるので、そのような目的でコンテンツを配信するサーバーの前段に置かれることが多いです。
CloudFrontのコスト削減
課金形態
大規模サービスなどでは、CloudFrontはAWSの中でも特に活用されることが多いサービスですが、課金形態としてはリクエスト量に応じて課金されるため、リクエスト数が多いサービスだと特にコストが高くなってしまいがちです。
サービスの運用にかかるコストを正確に把握するためにも、まずはCloudFrontの課金形態をご紹介します。
2023年11月現在では以下のようになっています。
- データ転送に対する課金
- エッジロケーションから外部のインターネットに向けて転送されたデータ量に対して課金されます
- HTTP/HTTPSリクエストに対する課金
- リクエストの数とタイプ(HTTP または HTTPS)に応じて課金されます
その他にも課金要素はありますが、主に重要なのはこの2つだと思います。
詳細はこちらのAWS公式の資料をご参考ください。
コスト削減方法
次に、CloudFrontに対する一般的なコスト削減方法をご紹介します。
- CloudFront Security Savings Bundleを利用する
- CloudFront利用料の前払いの義務を果たすことで利用料に対する割引が受けられる制度です。CloudFrontの向けのSavings Plansのようなものです。
- 1年間、月額最低使用料をコミットする前提で、CloudFrontの請求額に対して最大30%のクレジットが適用されます。
- 既に運用しているサービスのアーキテクチャに変更予定がない場合や、年間で利用されるCloudFrontの料金がある程度決まっている場合は、もしまだ利用していなければ迷わず購入してよいと思います。一番手軽かつ削減幅も大きいです。
- キャッシュを最適化する
- CloudFrontにはCDNとして一般的なキャッシュ機能が存在します。
- 画像などのコンテンツをキャッシュさせ、キャッシュヒット率を上げることで、エッジロケーションからのサービス提供を増やしてコスト削減ができます。
- 削減方法として主に2つで、どちらの方法でもコスト削減ができますが、できるのであればなるべくユーザーに近い箇所でキャッシュをすることでより大きなコスト削減効果が狙えるかと思います。
- ブラウザキャッシュ:ブラウザ側でキャッシュを行い、CloudFrontへのリクエストそのものを軽減させる方法
- CDNキャッシュ:CloudFront側でキャッシュを行い、CloudFrontの背後にあるサーバーへのリクエストを軽減させる方法。(この場合はCloudFront自体のコスト削減効果はなく、オリジンとして設定している側のコストが減る可能性があります。)
- データ転送量を削減する
- 画像やファイルの圧縮を行い、データサイズをできるだけ小さくすることで、そもそものCloudFrontからのデータ転送量を削減できます。
- CloudFrontを経由させる必要がないものはCloudFrontを使わない
- こちらはコンテンツを取得するための構成や取得内容の根本を見直す方法です。
- 表示するコンテンツの内容次第では必ずしも常にCloudFrontを経由して使う必要はないため、別の代替案などを検討することなどでコスト削減の効果があるかもしれません
- 不正なbotアクセスを遮断する
- もし不適切なbot等のトラフィックがもしあれば、CloudFrontの前段にあるWAFで該当のUAやIPを遮断することで、不要なリクエストを削減できる可能性があります。
- しかし、サイトにアクセスしているbotがGooglebotなどの有益なクローラーである可能性もあるため、遮断する際に本当に不要なbotアクセスなのかをしっかり調べた上で防ぐなどの注意が必要です。
- WAF自体へのリクエストやWeb ACLにルールを追加することでもコストはかかり、必ずしもコスト削減に繋がるとは限らないので、周辺のインフラ環境も含めて考慮が必要です。
実際に社内で試したこと
画像ブラウザキャッシュでのリクエスト削減
こちらはブラウザキャッシュを最適化することで、CloudFrontへのリクエスト自体を減らしてしまう方法です。
画像やCSS、JSファイルなどあまり変更されないコンテンツはブラウザキャッシュを効かせることで、そもそものリクエストを大幅に削減することができます。
担当したサービスでは、ブラウザキャッシュのキャッシュ有効期間(Cache-Control など)を見直すことで、結果的に合計1,000USD/月 程度のコスト削減ができました。
キャッシュ周りのコスト削減に関しては、SvelteKit, Next.jsの導入事例紹介など 〜ニフティのフロントエンドの今とこれから〜 でも紹介しています。
データ取得経路をCloudFront経由の構成からS3直アクセスにする
こちらに関しては、データ取得の経路そのものを変えてしまう方法になります。
この方法については、コンテンツ自体の取得は必須であるものの、アクセス自体をCloudFrontを経由せずとも行える場合に有効だと思います。
取得経路そのものを変えることになるのでやや実装自体が手間ではありますが、取得するコンテンツのリクエスト数が多い場合は効果が大きくなります。
比較として、2023年11月現在ではap-northeast-1 の場合、CloudFrontとS3のリクエスト料金は以下のようになっており、CloudFrontと比べるとS3のアクセスの場合はリクエスト量だけで半分以下のコストになることが分かります。
- CloudFront
- 0.0120 USD(HTTPSリクエスト1万件あたり)
- 0.0090 USD(HTTP リクエスト1万件あたり)
- S3
- 0.0037USD(GETリクエスト1万件あたり)
コンテンツの取得構成変更
次に社内での削減事例を簡単にご紹介します。
今回コスト削減を行った担当サービスでは、WEBサイトの表示に必要なデータを取得するためCloudFrontを経由していましたが、コスト削減のためこれをCloudFrontを経由せずにデータ取得を行う構成に変更しました。
詳細のインフラ構成はここでは割愛しますが、以下のようにインフラ構成を変更しました。
- 変更前の構成
- ブラウザ → CloudFront → フロントエンドサーバー → CloudFront → バックエンドサービス
- 変更後の構成
- ブラウザ → CloudFront → フロントエンドサーバー → バックエンドサービス
今回の構成においては、バックエンドで取得するコンテンツがキャッシュによる恩恵が少ないものだったこともあり、バックエンドの前段にCloudFrontを挟むのは過剰な構成になっていました。
そこで、コスト削減のためにフロントエンドから直接バックエンドを叩く形に変更しました。この方法を取ることで、周辺のインフラ構成も含めて合計1,200USD/月 程度のコストを削減することができました。
ただ、取得するコンテンツの種類によっては、CloudFrontでのパスのルーティングや、WAFを用いたセキュリティの制限をかけた方が良い場合もあるかと思うので、そこはコンテンツの要件と照らし合わせて構成を練る必要がありそうです。
不要な海外botアクセスの制御
こちらも同じく、不要なアクセスそのものを減らし、CloudFrontへのリクエスト料金を削減してしまう手法です。
もし、不適切なbotなどのアクセスがある場合は、WAFなどで防ぐことができます。
明らかにコストが跳ね上がっている場合は異常に気づけますが、今回はこれとは別にCost ExplorerでCloudFrontの料金をリージョン別に見ていてたまたま気づき、特定のUAからの海外アクセスが定期的に発生していることを発見できました。
こちらに関してはWAFで特定のUAをブロックすることで簡単にアクセスを制御することができました。
学んだ教訓とTips
今回のコスト削減の実施全体を通しての感想ですが、CloudFrontについてはとにかくリクエスト料金が高く付きがちなので、如何にリクエスト量を効率的に削減できるか?が勝負になるのかなと個人的には感じました。
また、普段キャッシュを意識するとコンテンツ取得の前段にCloudFrontを挟もうという設計になることが多いかと思いますが、コスト削減の観点で見ると「CloudFrontを経由させずにS3に直アクセスをさせる」ことで意外とコストを減らせるのだな、という気づきを得られたことが一番の発見でした。
心構えとしてのTipsになってしまいますが、「とりあえずCloudFrontを前段に設置しよう!」という考えではなく、結局はコスト面やリソース効率なども考慮した上でCloudFrontの利用やキャッシュ設定を適切にチューニングしていくことを意識して設計してくことが大事だと思いました。
後からアーキテクチャに手を加えると大変なこともあるので、設計の段階でコスト効率の良いアーキテクチャを考慮できると良いのかなと感じました。これは今度の業務にも学びとして活かしていきたいです。
まとめ
今回はCloudFrontのコスト削減方法についてご紹介しました。
実際のコスト削減方法についてですが、社内事例として紹介したように、現状のコストを分析することで不要なbotアクセスなどの発見に繋がることがあったので、意図していないコストに気づくという観点でもまずは「普段から使用しているサービスをCostExplorerなどで見ておく癖をつける」といった点に尽きるのかなと思います。
また、合わせて利用しているサービスの料金形態を把握することで、具体的なコスト削減のアイデアが浮かんでくると思うので、実際のコストと照らし合わせて確認するようにすると良いと感じました。
他のAWSサービスでもコスト削減事例が思いついたら別のブログ記事にする予定なので、また機会があれば紹介したいと思います!
参考記事
https://aws.amazon.com/jp/cloudfront/
https://aws.amazon.com/jp/s3/pricing/
明日は、kinari321 さんの「isucon初参加&0点劇」というテーマの記事のようです。お楽しみに!