AWSでコストを抑えたい!15分でわかる、 AWSのコストカットの思考フロー⚡️

AWSでコストを抑えたい!15分でわかる、 AWSのコストカットの思考フロー⚡️

こんちには!

AWSの支払いで「想定外の過剰コストになってしまった」という相談が近頃は増えてきました。

「サーバーレスだから、使った分だけ支払えばいいんでしょ?」とついつい油断していると、とんでもない請求額が来ることがあります。

今日は、既存でアプリケーションを持っていてかつ、サーバーレス導入していない企業様からの相談が多い「コスト削減したい」について、わたしたちのよくある事例を交え思考方法をご紹介したいと思います。

AWSのコスト削減の思考フロー

わたしたちは下記のようにコスト削減を実現します。

  • 構成を最適化
  • 3つの購入オプション
  • 常時サーバは起動が必要?サーバーレス化

構成を最適化しよう

高いと感じた時に、まず真っ先にやることは下記です。

  • 請求ダッシュボードでどのサービスでコストがかかっているのか
  • EC2などホットスタンバイしているサーバーのスペック過剰すぎないか
  • RDSいいのを使いすぎていないか
  • CloudWatchをみて、エラーのリトライ回数(無限ループ大丈夫?)
  • CloudFront上手に使えている?

請求額で異常に大きいサービスはあるか、認識していないサービスの請求はあるか。まずは請求額をダッシュボードで俯瞰しましょう。

請求ダッシュボード

請求額をサービス単位で見れるなんて素敵ですね。

次はソフトウェア側の実装ミスを見ます。CloudWatchのログを見てみましょう。

Cloud watch

正直・・・、このログたちを一行ずつクリックするのは骨が折れます。特に何かしらのプロビジョニングツール(例えばServerless Framework)で構築している場合は、見なくても良いログもあって結構辛いです。

そういうケースでのCloud Watchの利用テクニックとして、わたしたちはCloudWatchがExpetionを取得したら、Slackなどへエラー通知するようにしています。(飛びまくっていればまずログを見て対処方法を練る)

どこでコストがかかっているのか、どこを削りたいのか、1つ1つ紐解いていくことが重要です。

CloudFrontのキャッシュの事例紹介

特に多いのは、「CloudFrontでキャッシュのキャッシュを十分に使えていない」です。

例えば、SNSサイトでユーザー画像を取得する処理を考えています。

  1. フロントエンドからJS処理でユーザー画像をS3へアップロード
  2. データベースからユーザーIDでパス情報を取得し/images/{user_profilei_mage)}.pngでクラウドフロント経由でS3を参照
  3. もしユーザー画像が存在していなければデフォルト画像をCloudFrontへリクエスト

もしユーザー画像がない場合、CloudFrontへ2度リクエストしないといけませんね。加えて、余分なネットワーク通信量がかかりますし、レスポンスを待機するのでUXが良くないです。

たとえばこれに、LambdaEdgeを使ったらどうなるでしょう?

  1. フロントエンドからJS処理でユーザー画像をS3へアップロード
  2. データベースからユーザーIDでパス情報を取得し/images/{user_profilei_mage)}.pngでクラウドフロント経由でS3を参照
  3. もし画像存在しなければ、CloudFront→LambdaEdgeを発火させて、デフォルト画像をレスポンス

フロントエンドの実装もスッキリし、微小ですがコストカットになります。

3つの購入オプションを活用しよう

まず、AWSには下記の3つの購入プランが存在します。用途に合わせて使い分けたいところです。例えば、事業計画上で通年通してコスト意識する必要がある場合は、事前に金額をコミットするリザーブインスタンスを推奨です。(スタートアップでは正直そこまで厳格にコスト計画出しているケースが稀なので、中規模以上の開発向けかもですね)

スポットインスタンスプラン

  • EC2 の余剰キャパシティーを、オンデマンド料金の最大 90% 割引で利用可能
  • AWS の空きキャパシティーの状況次第で中断されることがある(2分前に通知

リザーブドインスタンスプラン

  • インスタンスタイプと期間(1 or 3 年)を事前にコミットすることにより最大 75% 割引に
  • コンバーティブル RI であればインスタンスタイプの変更も可能

Savings プラン

  • 利用料金と期間(1 or 3 年)を事前にコミットすることにより最大 72% 割引に
  • Amazon EC2 の他に AWS Fargate, AWS Lambda も対象(割引率はそれぞれ異なります)

Amazon EC2 以外の割引オプションを用意しているサービス

  • Amazon RDS – Reserved Instance
  • Amazon Elasticsearch Service – Reserved Instance
  • Amazon Redshift – Reserved Node
  • Amazon ElastiCache – Reserved Cache Node
  • Amazon DynamoDB – Reserved Capacity
  • Amazon CloudFront – Reserved Capacity
  • AWS Fargate – Savings Plans
  • AWS Lambda – Savings Plans

常時サーバは起動が必要?サーバーレス化を検討しよう

サーバーレス構成は従量課金のため、使った分だけ料金が発生する仕組みが大半です。(Savings Plansだと1 年または 3 年の期間に特定の量の処理能力 (USD/時間で測定) を使用する契約を結びます)

例えば、LambdaとAppSyncの料金表を紹介します。

Lambdaの料金表

Lambda ( スペックに応じて料金変動 )

AppSyncの料金表

AppSync ( スペックに応じて料金変動 )

スペックに応じて料金が変動するのが重要なポイントです。

特にLambdaは、どんな処理を担当させるのかできちんと設計しないと大きなレイテンシーでUX不良を起こし、顧客が離れるなどのビジネス損失を発生させます。

サーバーレスアーキテクチャーは見えない利益を生む

コストカットも重要ですが、ビジネスに適したアーキテクチャーを選択できることが重要というのを忘れてはいけません。

サービスインまでの時間を短縮

  • 短期実装実現
  • 機会損失防止

運用・保守の省力化

  • サービス品質安定化
  • 内製化拡大の支援

アジリティ向上

  • 現場要求の迅速実装
  • 競争力強化

わたしたちのコスト削減について思うこと

まず、根本的にコスト削減は本当にいま必要でしょうか。

コスト削減を行うのもまたコストです、特にスタートアップは資金繰りの関係や、顧客がついていない関係上、一刻も早く独自性・競合優位性を作らなければいけません。

スピード感を優先するなら、多少のコストを許容するのも1つです。

わたしたちが運営するエンジニアの次世代ソーシャルメディアSHIMBAは、リリース初期の月間コストは5,000円程度でした。

すぐにできそうなコスト削減であればもちろんやったほうがお得ですが、時間のかかるコスト削減は逆に痛手になるので注意しましょう。