re:dashでAWSのコストを分析してみた

Backlog SREチームの山崎 ( @revsystem )です。2017年11月に開催された Geeks Who Drink in Tokyo -AWS & 神楽坂 Edition- では「Backlogのインフラを支えるAWSの活用事例」をご紹介しました。今回は、SREチームが行っている、re:dashを用いたAWSのコスト分析についてご紹介します。

目次

  • なぜコスト分析を行うのか
  • どのように分析しているか
  • 具体的にどのような分析をおこなっているか
  • 月別レポートCSVから必要な情報を取り出すには

なぜコスト分析を行うのか

AWS の活用事例でもご紹介しましたが、Backlogは Web, App, API, Git, WebDAV などで構成されるインスタンス群を1環境として、合計7環境、約200 のインスタンスで稼働しています。( 2018年1月現在 )
Backlog SREチームでは、サービスの利用状況やシステムのリソース使用状況に応じてインスタンスサイズやインスタンス数などの調整を行っているため、AWS 利用コストは様々な項目で毎月変動します。

利用コストは AWS が発行する請求書に記載された明細から確認することができます。 しかし、複数のリージョンで多数のインスタンスやサービスを利用していることもあり、具体的なコストの推移やコスト面で最適化できそうな項目の有無が見えにくいものです。そこで、コスト変動の見える化とコスト面の最適化を目指して分析を行うことにしました。

うまく分析できれば、 Geeks Who Drink in Tokyo -AWS & 神楽坂 Edition- でスタディプラスの満足さんが述べられているように、「クラウドの費用は短期で削減可能」「ビジネスの成長に使えるお金が増える」という、分かりやすい効果がえられそうです。

そこで、SRE チームでは以下の観点でコスト分析を行っています。

  • 主要なコストがどのように推移しているか
  • どこにコストがかかっているか
  • 削減 (最適化) 可能なコストはあるか

どのように分析しているか

コスト分析のもととなるデータは、 AWS のコストと使用状況レポート で提供される月別レポート( {アカウントID}-aws-billing-csv-YYYY-MM.csv )を使用します。

このCSVは、”請求情報とコスト管理ダッシュボード”で月別レポートを有効にすることで、指定したS3バケットに毎日出力されます。

このCSVを AWS Lambda で取得し、 re:dash で参照するようにしました。 これで、CSVがアップデートされるたびに、コスト推移やランニングコストなどが分析できます。

re:dashはクエリによるデータ抽出やチャート出力、可視化が容易に行える点が大きなメリットです。

以前は、”請求情報とコスト管理ダッシュボード” で提供される請求書データをもとに、Google Spreadsheet に手作業で入力しチャートを作成していました。しかし、ほぼ機械的に値を入力することに時間をとられてしまうのはあまり楽しい仕事ではありません。こういった処理は自動化したいものです。

re:dashを導入したことによりデータの取得からチャートの出力までが自動化され、SREの作業コストの削減にも繋がりました。

AWSコストエクスプローラー

AWSでは、AWSコストエクスプローラー という分析ツールが提供されており、あらかじめ用意されたチャートやカスタマイズしたもので独自のチャートを作成することができます。

このツールは最大過去12ヶ月分のしか参照できないため、直近の分析やコスト予測に向いているようです。SREチームでは、年単位の傾向を知るためAWSコストエクスプローラーではなくre:dashを採用しました。

具体的にどのような分析をおこなっているか

対策と効果がわかりやすく現れたグラフを例にします。

1つめのグラフでは、5月から7月にかけてEC2のコストが大きく上昇しています。これは、 2017年9月8日からBacklogの新規スペースのドメインがbacklog.comに変更 となることへの準備と関連しています。

この推移をもとに、新規・既存それぞれのインスタンスに対するリザーブドインスタンスの適用状態の見直しやインスタンスの整理を行いました。その結果、コストが上昇する以前の水準近くまで下がりました。 その後、新たなリソース増強などを行ったため増加を示しています。

2つめのグラフでは、様々な AWS のサービスのコストを並べています。途中で途切れている線は、そこで利用を停止したものを示しています。 このように、「利用していないがコストが発生しているものはないか」「必要以上のコストとなっていないか」などを推移から読み取ることで、最適化を行っています。

月別レポートCSVから必要な情報を取り出すには

月別レポートCSVをもとにクエリを作成するのですが、このCSVにはリージョン名 ( ap-northeast-1 や us-west-1 など ) や サービス名 ( NatGateway や EBS など)を直接参照するカラムがありません。

どうにか値を参照できないかと探したところ、 usage_type というカラムが利用できそうでした。

このカラムには APS1-EBS:VolumeIOUsage や USW2-ElasticIP:IdleAddress といった、リージョン名とサービス名を組み合わせた値が入っています。これをもとに、必要な情報を取り出すことにしました。

以下が作成したクエリの例です。( usage_typeにはなぜか USE1 ( オレゴン ) を示す文字列がなく、ELSE で判定しました。 )

SELECT linked_account_name,
       linked_account_id,
       billing_month,
       CASE
            WHEN usage_type LIKE '%BoxUsage%' THEN 'BoxUsage'
            WHEN usage_type LIKE '%NatGateway%' THEN 'NatGateway'
            WHEN usage_type LIKE '%ElasticIP%' THEN 'ElasticIP'
            WHEN usage_type LIKE '%HeavyUsage%' THEN 'HeavyUsage'
            WHEN usage_type LIKE '%NatGateway%' THEN 'NatGateway'
            WHEN usage_type LIKE '%EBS%' THEN 'EBS'
            WHEN usage_type LIKE '%LCUUsage%' THEN 'LB'
            WHEN usage_type LIKE '%LoadBalancerUsage%' THEN 'LB'
            WHEN usage_type LIKE '%DataProcessing%' THEN 'LB'
            WHEN usage_type LIKE '%LoadBalancerUsage%' THEN 'LB'
            WHEN usage_type LIKE '%NatGateway%' THEN 'NatGateway'
            WHEN usage_type LIKE '%DataProcessing%' THEN 'LB'
            ELSE 'else'
       END AS usage_type,
          
       CASE
            WHEN SUBSTRING_INDEX(usage_type ,'-',1) = 'APN1' THEN 'ap-northeast-1'
            WHEN SUBSTRING_INDEX(usage_type ,'-',1) = 'APS1' THEN 'ap-southeast-1'
            WHEN SUBSTRING_INDEX(usage_type ,'-',1) = 'USW1' THEN 'us-west-1'
            WHEN SUBSTRING_INDEX(usage_type ,'-',1) = 'USW2' THEN 'us-west-2'
            WHEN SUBSTRING_INDEX(usage_type ,'-',1) = 'USE2' THEN 'us-east-2'
            WHEN SUBSTRING_INDEX(usage_type ,'-',1) = 'APS2' THEN 'ap-southeast-2'
            ELSE 'us-east-1'
       END AS REGION,
       cost_before_tax
FROM aws_monthly_bills
WHERE .....

実際の分析では、Backlog、Typetalk、Cacoo、社内環境用のそれぞれにかかる主要なコストをひとつのチャートにまとめたり、ヌーラボのサービスごとに並べたりと様々な視点で比較できるクエリを作成しています。

re:dashのチャートを眺めてみると、最古のデータは2013年7月でした。コスト分析から始まったre:dash導入ですが、Backlogのユーザー数や環境の増加とともに右肩上がりを描くものや、横ばいのもの、ある時期から費用が発生したものなどBacklogの歴史を見るようでもありました。

Backlogでは、re:dashを使ってコスト分析やサービス改善を進めるのが好きな方を募集しています!ご興味ある方はお気軽にお問い合わせください。

開発メンバー募集中

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる