Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クラウドネイティブに支える従量課金集計―Mackerel「daifukucho」の設計と運用

Avatar for mackerelio mackerelio
November 18, 2025

 クラウドネイティブに支える従量課金集計―Mackerel「daifukucho」の設計と運用

本講演では、はてなが提供するオブザーバビリティプラットフォームMackerelの従量課金集計システム「daifukucho」の設計と運用を紹介します。Mackerelは2024年末にOpenTelemetryへ正式対応し、メトリック・スパン単位での課金体系が必要となりました。daifukuchoは課金根拠を後から検証でき、利用状況をユーザーに可視化することを目的に構築されました。AWS上にDataFirehose、StepFunctions、Athena等を組み合わせ、ほぼ生データを蓄積するシンプルな構成で、大量のデータを長期間安全に保存しつつ低コストで集計を実現しています。設計の背景には、課金への信頼性確保やユーザーへの透明性提供といった要求がありました。講演ではこのアーキテクチャに至った経緯、開発を安全に進めた工夫、さらに運用中に発生したトラブル事例を共有し、従量課金システムを支える技術と課題解決の実例を提示します。

https://event.cloudnativedays.jp/cndw2025 にて発表

Avatar for mackerelio

mackerelio

November 18, 2025
Tweet

More Decks by mackerelio

Other Decks in Technology

Transcript

  1. 3

  2. daifukucho以前 : 課題 • 集計の計算がすごく難しい ◦ 集計のタイミングなどに起因して仕様に直感的でない妥協が複数 あり、全容を把握するのがすごく難しい ◦ 実際に積年のbugが見つかりつつあった…

    • メトリック投稿システムのbugの影響を受けやすい ◦ 誤ってメトリックを重複して投稿すると、重複して課金される • メトリック投稿の証跡が残ってゐない ◦ 計数・データ移動・数度の集計のたびに情報を失ってゐた ▪ 元データを捨ててゐた ◦ 何か問題があると、集計済みの情報を失ったデータと、アクセス ログをもとに起こった事を想像するしかなかった 8
  3. daifukucho以前 : 2024年初頭の状況 • 数々の金銭上の問題が起こってゐた ◦ AWSインテグレーション WAF連携のメトリック数の過剰カウントに関するご報告 ▪ 【続報】クラウドインテグレーション

    メトリック数の過剰カウントに関するご報 告 ▪ (2022/06/15追記)クラウドインテグレーション メトリック数の過剰カウント ついてのお詫びと詳細のお知らせ ◦ 月途中にホストの利用が全てなくなった場合に利用料金を過剰に請求していた事象につ いてのお詫びと詳細のお知らせ ◦ Google Cloudインテグレーションにおける監視の不備に関するご報告 ◦ ごめんなさい • OpenTelemetryメトリック対応の課金システムを作る必要があった 9
  4. 新しい課金根拠システムへの要求 • 月毎のメトリック数・ホスト数を正しく集計する ◦ 「1メトリック」「1ホスト」の意味が月の日数によって変はる ◦ メトリックは往々にして遅れて届く • できるかぎり生の証跡を残す ◦

    メトリックが一点投稿されるごとに一つの証跡が残ると理想 • 利用量がユーザーに可視化される ◦ テナント毎に毎日集計する • 集計ロジックは柔軟である ◦ 重複して投稿されたメトリックをある程度は「1メトリック」と してまとめたりできる • 移行期間は旧集計システムと併存する 12
  5. データを保存できるか? • 本番の実全データをFirehoseにも送って性能を確かめる ◦ 初めは社内利用のデータだけを流す ▪ 段階的に、安全に ◦ 本番の処理に影響を与へないやう ▪

    Firehoseへの送信に失敗してもエラーを起こさない(ログを 吐くだけ)やうにする • Parquetに変換しストレージを節約する • 商品毎にFirehoseを分ける ◦ 商品ごとに流量や集計処理が全く異なるので、一緒に処理しない 18
  6. 集計できるか? : Athena 本命 • データはS3に保存するのがコストも低く管理も楽 ◦ S3から大量のデータを集計するならAthenaが本命 • Glue

    Crawlerでテーブルを作る ◦ 毎時単位でパーティショニングする • Step Functionsで商品毎に並列処理し、エラーに対処する • SAと議論し、「そのデータ量を処理できるかはやってみないとわか らない」と やってみたところ、できたので採用 22
  7. 利用量を閲覧できるか? : 都度クエリー • 都度クエリーするコストを抑へたいので、テナント×日毎にパーティ ショニングする ◦ Firehoseでパーティショニング ▪ Firehoseの上限(500個/ストリーム)を超える

    ◦ Glue Databrewでパーティショニング ▪ パーティション数の上限はあり、考慮する必要がある • そもそも都度クエリーする事による、パフォーマンスと料金への影響 が予想しづらい 事前に集計するのが、実装も難しくなく、料金も安い事がわかったの で、不採用 28
  8. 利用量を閲覧できるか? : 事前に集計 • 毎日前日のデータを集計し、Auroraに保存しておく • Auroraのパフォーマンスは予想しやすい • Auroraの料金も予想しやすい •

    課金用に、もともとはAthenaで一月分のデータを集計するつもりで ゐたが、データが多過ぎた ◦ 一日分のデータは充分に集計できる ◦ 課金用にも日毎に集計しておいたデータを使ふ 以上多数の利点があり、採用 29
  9. 完成したdaifukuchoの設計 : 保存・集計 • メトリックの投稿を受け付けるシステムが証跡を生成し、一定バッ ファ毎にFirehoseに送る • Parquetに変換しS3に保存する • 毎日Step

    Functionsを起動する ◦ Glue CrawlerでAthenaのパーティションを作る ◦ 商品毎に並列で集計する ▪ Athenaで計算する ▪ 結果をAuroraに書き込む 32
  10. • RDSを追加することとなった • 月末にデータが出せないと事故になるので、影響が大きい ◦ 日次バッチで、毎日稼働状況を確認する ◦ 稼働しなくなったとしても、障害時の対応やコンポーネントの状 態可視化もバッチの集計期間が短ければ対処しやすくなる •

    利用状況データもふつうのレスポンスで出せるようになる • しかし、データを守る範囲が増える ◦ S3だけではなく、RDSを改ざんなどから守る必要が出てきた データストアは2段構成に 37
  11. • 強い権限を配らない形とするため、作業者に直接権限を渡さないよう にした ◦ 具体的には、RDSのIAM認証を行うことにした ◦ 参照ユーザーを整備、IAMでの許可範囲の権限のみ実行可能に • ただし、作業でマスターパスワードは必要なことはある ◦

    これまでも接続ログの監査を実施しており、同一の業務手順に載 せることにした • RDSのIAM認証の存在は把握していたが、今回初めて採用した ◦ 使い心地はよかった RDSのIAM認証と接続ログの監査 38
  12. • 利用状況画面を開発するにあたって、アプリケーションからRDSに接 続する必要が出てきた ◦ この従量課金システムが障害時に、このアプリケーション自体へ の影響は最小限に抑える必要がある ◦ “サブシステムのメンテナンス”で、本体を停止するのは、サブシ ステムではない •

    さまざまなパラメータを見極めて、直接実装するのは難儀に思われた ◦ いい感じにサーキットブレーカーする仕組みが今のところない • いい感じのサーキットブレーカーを簡単に実装する必要性が出てきた 既存のシステムからのRDSの参照 39
  13. • awslabs/aws-lambda-go-api-proxy を用いて、Lambda内にHTTPア プリケーションを実装 ◦ このライブラリはアーカイブされている • OpenAPI 定義からジェネレータでコード生成 ◦

    コードとして書く部分は、SQLのクエリ、入出力だけ。という状 態にする • WebアプリケーションはECSを基盤として実装することがこれまで多 かったが、想定されるリクエスト数から、Lambdaを採用することに した RDSを参照するプロキシを実装する 41
  14. • Mackerelのシステムから、HTTP APIを通じて、RDSのデータを参照 することができるようになった • 利用状況を知ることができる画面づくり • これまでのお客様の声 ◦ 毎月何台の利用になるか月末にならないとわからないから心配だ

    ▪ 台数が変わらなければ、問題ない。とお伝えするものの、お 客様側で、台数が変わっていないことを可視化までは至らな い ◦ 使いすぎては困るので見積もり、金額がどうなるか教えてほしい ▪ 平均されますよ。と伝えても、響かない 利用状況を知ることができる仕組み お客様のクラウド破産を防ぎたい 42
  15. • どういう機能が満たせてい る必要があるか洗い出した • 下記のような要件が見えた ◦ リアルタイムは不要 ◦ 商品ごとに日毎で見える ◦

    グラフで見たい ◦ 過去の月も遡れる ◦ 昨日のデータが見れる • 通知は必要か?という議論 もあったが、まずは見れる ところまで。を要件とした ユーザーストーリーマップとMVP 43
  16. • 10年を超えるサービス、グ ラフのコンポーネントは大 きなデザイン変更を経験し ておらず、愛着のある人も 多い • 積み重ね棒グラフのデザイ ンは、実装されていない •

    これまでのグラフのコン ポーネントとは異なるライ ブラリを採用しつつも、カ ラースキームを踏襲 装飾にはこだわりたい 45
  17. • 昨日までは動作していたが、突然実行時間が90分まで増えた ◦ 普段は20分程度 • 実行計画の結果は特に変わっていない • Athena がクエリする先の S3バケットも、昨日のクエリ対象のバケッ

    トと今日の対象を見比べても、データ量に違いはあんまりない • 複数のクエリの実行時間の増大(2倍)を確認した • 色々手を尽くしたが、抜本的な改善はできなかった。 ◦ もはやこれまでか....AWSのサポートに連絡する Athenaの調子が悪い 48