blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2023.05.23 技術記事

画像配信サーバーのコストを 1/10 にした話 [DeNA インフラ SRE]

by hidetaka-masuda

#infrastructure #sre #aws #infra-quality #infra-cost #cost-optimization #datastore #game-infrastructure

はじめに

こんにちは。IT 基盤部の増田です。 IT 基盤部は、DeNA のさまざまなサービスのインフラを横断的に担当している部署です。 IT 基盤部では、安定的なシステム基盤の提供をすることだけでなく、運用コストの削減にも力を入れています。

本日は、運用コストの削減に関する話をご紹介します。 対象は、Mobage の静的画像を配信するシステムです(以下では「画像配信システム」と呼びます)。

当時私は、部署に配属されて 1 年ちょっとでした。 今回のコスト削減では、方針そのものの検討から任されました。 このように、プロジェクトをまるごと任されるのは初めてでした。

プロジェクトを進めるうえで、以下のようなことに注意しながら仕事をしました。

  • 言われたことを鵜呑みにせず、裏取りをする
  • 全体ではなく、一部に試す

IT 基盤部で 1 年働いて、基本的な仕事の仕方として、この習慣が身につきました。 この習慣がコスト削減にどう活きたかにご注目ください。

構成の確認

まずは、画像配信システムの構成を確認します。 構成は以下の図のようになっていました。

画像配信システムの当初の構成

画像配信システムの当初の構成

構成を文字にすると、下記のとおりです。

  • CDN
  • ロードバランサー; Elastic Load Balancing(ELB)
  • サーバー群; Amazon Elastic Compute Cloud(EC2)
    • リバースプロキシ 3 台
    • 静的画像を配信するサーバー(以下では、「画像配信サーバー」と呼びます)約 80 台
      • 約 40 系統
      • 冗長化のため、各系統は 2 台構成

読者の皆さんは、ロードバランサーの裏にリバースプロキシがあり、構成が不自然なことにお気づきかもしれません。 実は、このシステムは今はクラウド(AWS)にありますが、元々はオンプレで稼働していました。 クラウドへの移行の際、諸事情があったため、オンプレのときの構成がほぼそのまま残っています。 このため、クラウドに最適化された構成にはなっていませんでした。 そこで、クラウドに最適化することで、不自然さの解消とコストの削減を図ろうと思います。

費用の確認

次に、費用の内訳を確認しました。 費用の大部分は、約 80 台ある画像配信サーバーのものでした。 そして、サーバーの費用をさらに分解すると、コンピューティングリソースとストレージの費用が多くを占めていました。

さらに、これらのコストに削減余地があるかを確認しました。

まず、コンピューティングリソースに関しては、リソースがかなり余っていました。 各画像配信サーバーには、ほぼ最小のリソースを割り当てていました。 しかし、静的画像をホストするだけなので、それでもリソースが余っていました。

次に、ストレージの費用に削減余地がないかを確認しました。 オンプレの構成の名残で、EBS を各系統で 2 つずつ用意してストレージを冗長化していました。 クラウドの機能をもっと活用して、ストレージを冗長化できないか、検討の余地がありそうです。

構成変更によって、これらの問題を解決できないか考えてみます。

一つめの構成

そこで、新たな構成を検討しました。

コンピューティングリソースに関しては、約 40 系統ある画像配信サーバーを 1 系統に集約します。 そして、そこにほぼ最小のコンピューティングリソースを割り当てることで、コンピューティングリソースを削減します。

ストレージに関しては、冗長性を確保しながらコストを削減するために、下図のようにします。

ストレージの構成変更

ストレージの構成変更

文字にすると、下記のとおりです。

  • 今までのストレージ
    • EC2 用の EBS * 約 80
  • これからのストレージ
    • EC2 用のストレージ * 1
      • 全系統の画像を集約し、1 つのストレージを複数台の EC2 で共用
    • バックアップ用のストレージ * 1
      • バックアップの実行とバックアップ用のストレージの管理をする「AWS Backup」を使用

ストレージの総使用量は変わりませんが、AWS Backup のストレージは EBS よりも安いので、コストが削減できます。

ストレージを共用するためには、Amazon Elastic File System(EFS)を利用します。 EFS は、マネージドなネットワークファイルシステムで、複数のホストでストレージを共有できます。

EFS には、「ストレージクラス」という概念があり、性能や料金体系の異なるいくつかの選択肢があります。 そして、最適なストレージクラスは、アクセスパターンによって変わります。 このシステムでは、画像は CDN にキャッシュされるので、画像サーバーそのものへのアクセス頻度は低いです。 一般に、アクセス頻度が低いときは、「低頻度アクセスストレージ」というストレージクラスを使うと良いので、それを採用します。

構成は以下の図のようになります。

EFS を利用した画像配信システムの構成

EFS を利用した画像配信システムの構成

当初の構成との差分は、下記のとおりです。

  • リバースプロキシ廃止
    • 画像配信サーバー約 40 系統をまとめたので不要
  • 画像配信サーバー約 80 台 => 3 台
  • 画像は 1 つの EFS に集約

この構成の最大のメリットはもちろん、費用が大幅に削減できることです。 コンピューティングリソースの費用は、EC2 の台数が減ったおかげで削減できています。 ストレージの総容量は変わりませんが、それぞれのストレージの単価は、EBS よりも安いので、ストレージの費用も削減できています。

もうひとつのメリットは、システムのコードをほぼ改修しないで済むことです。 このシステムでは、Mobage のユーザーが画像を投稿すると、その画像は Web サーバーを経由して、最終的には画像配信サーバーに保存されます。 EFS を利用した構成では、画像配信サーバーのストレージが変わるだけなので、この流れは変わりません。 そのため、既存のコードをそのまま残せます。

意外な見落とし

しかし、よく調べてみると、このコストの見積もりには見落としがありました。 実は、EFS の低頻度アクセスストレージには、使用するための条件があったのです。 その条件とは、保存するファイルのサイズが 128 KB 以上でなければならないことでした。 そして、このシステムの画像のほとんどは、この条件を満たしていないので、低頻度アクセスストレージは使えませんでした。 かといって、低頻度アクセストレージでないストレージクラスは、費用が上がってしまうので、それらは使えません。

結局、残念ながら、この案は見送ることにしました。 この構成を考えたのは前任者だったのですが、削減額を自分でも裏取りをしたおかげで、作業の手戻りが防げました。 やはり、自分で裏取りをすることは重要だと再認識しました。

もうひとつの構成

新たな案として、Amazon Simple Storage Service(S3)を使う構成を考えてみました。 なぜなら、一般的に、静的画像の配信には、S3 を使うと良いことが多いからです。 S3 なら、手間をかけずに、ストレージの冗長性・可用性を確保できます。

具体的には、以下の図のような構成を考えました。

S3 を利用した画像配信システムの構成

S3 を利用した画像配信システムの構成

ロードバランサーも、リバースプロキシも、画像配信サーバー群もなくなり、ずいぶん構成がシンプルになりました。

この構成でも、大幅なコスト削減ができます。 まず、コンピューティングリソースの費用が掛かりません。 さらに、冗長化が不要、かつ、単価も EBS と比べて安いので、ストレージの費用も安くなっています。 ちなみに、一つめの削減案よりもさらにコストが削減できています。(怪我の功名!)

一方、デメリットもあります。 それは、先程述べたアップロードの流れが変わるため、コードの修正が必要になることです。 というのも、画像の最終的なアップロード先が EC2 から S3 に変わっているからです。 ただ、コードの改修は工数はそこそこかかるものの、コスト削減効果で十分ペイできるので、このデメリットは許容することにしました。

構成変更の実施

構成が決まったので、約 40 系統ある画像配信サーバーを S3 に移行していきます。 その際、もし問題が発生しても影響を最小限に抑えられるように、一気に移行するのではなく、徐々に進めていきます。 具体的には、全系統を一度に移行せずに、数系統ずつ移行していきます。

さらに、各系統の移行も一度には行いません。 各系統に対するアクセスは、一度に全てではなく、一部分だけ S3 に転送することができます。 これを利用して、一部のアクセスで動作確認をしながら、徐々に移行を進めます。

実は、移行を進める中で、本当に問題が発生してしまいました。 それは、コードの改修漏れにより、ユーザーが見られるはずの画像が見られなくなるという問題でした。 改修漏れそのものは、もちろん反省しなければなりません。 ただ、変更をいきなり全部に適用しなかったおかげで、ユーザーへの影響は非常に小さく済みました。

おわりに

このようにして、自分は初めてのコスト削減を進めました。

コスト削減を進めるにあたって、IT 基盤部で身につけた以下の習慣が役に立ちました。

  • 言われたことを鵜呑みにせず、自分で裏取りをするという習慣のおかげで、作業の手戻りが防げました。
  • 最初から全部に適用するのではなく、まず一部に試すという習慣のおかげで、問題は発生したものの、ユーザーには大きな影響を与えずに済みました。

また、作業の中で、クラウドサービスには、意外な制限があるのを実感しました。 今回は、EFS の低頻度アクセスストレージにはファイルサイズの制限があることが分かりました。 EFS に限らず、クラウドサービスには、見落としやすい制約がよくあります。 このような制約に引っかからないために、皆さんにとって新しいサービスを使用し始める際は、そのサービスで意外な制約にはまった事例がないか、ネットで調べてみてください。

ちなみに、構成変更は現在も進行中です。 まだ完了してはいませんが、進捗に見合ったコスト削減効果が得られています。

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。