好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

GithubActionsの料金内訳を集計して可視化してみた

今回は GitHub Actions Advent Calendar 2020 - Qiita の5日目の記事として、GithubActionの何にどれくらいコストが掛かったかを可視化した話をしようと思います。

組織でGitHubを契約する場合、OrganizationやEnterpriseアカウントと言った単位で一括で契約をし、支払いをまとめることが多いと思います。
組織の構造や予算の関係上、上記契約のGitHubの料金を複数の請求先に按分して請求することになり、この際の費用按分の計算方法はすでに確立されているものと思います。
基本的に現在のGitHubはユーザー単位($xx/User)の課金なので、組織/プロジェクトに所属するユーザー数で割ったり、関連するリポジトリ数で割ったり。

そんな中、去年発表された GitHub Actions は、使用したコンピューティングリソースの実行時間やストレージ容量に応じて課金されます。
無料枠がかなり大きいので発表当初は意識することが少なかったかもしれませんが、Actionsを使用するプロジェクトが増えてきたりStorage容量が増えてきたりして、そろそろ課金対象になってきた組織も多いのではないでしょうか。

今までのようにユーザー数やリポジトリ数で費用按分したままでも問題なければよいのですが、厳密に予算管理しようとすると、Actionsの料金は別で計算したほうが良さそうです。

ということで、GitHub Actionsを使っているRepositoryを抽出し、その中でActionsにかかった費用を按分するのをやってみました。

利用状況の取得

今回は、費用按分を計算するときは実請求額を元にしたほうが良いだろうということで、個人やOrganizationやEnterprizeのBillingからデータ(csv)を取ってくる方式にしています。
今回はやっていませんが、各Repository・Workflow別の更に詳細な情報については、GitHub API の Actions 項目で取得が可能です。権限があれば Repository一覧 -> 各Repository毎に上記APIを実行、で同じことが出来ます。

下記を参考に、

GitHub Actions の使用状況を表示する - GitHub Docs

Get usage report(利用レポートの取得) から、利用状況のcsvを取得します。

csvは、2020/12/1時点で下記のようなフォーマットになっています。

Date Product Repository Slug Quantity Unit Type Price Per Unit Actions Workflow
YYYY/M/D actions/shared storage repository xxx UBUNTU/Windows/Mac/gb $xxxx workflow path

ここから、

  • リポジトリごとのコストベースの利用状況
  • 無料枠をオーバーしたか
  • オーバーした場合はリポジトリごとの利用(コスト)割合に基づく費用按分

を計算します。

費用按分の計算と、利用状況の可視化

サンプルデータの生成と可視化・按分計算のスクリプトを下記に上げているので、git cloneします。

github.com

まずは上記の手順でGitHub Actionsの利用状況csvを取得します。
もしcsvが手元にない場合は、下記コマンドで擬似Billingデータを生成してください。

$ git clone git@github.com:kusuwada/github_actions_billing_visualizer.git
$ cd github_actions_billing_visualizer
$ pip install -r requirements.txt
$ python generate_sample.py {output_filename.csv} {target month YYYY/M}

次、こんな感じでスクリプトを実行します。

$ python github_actions_cost_viewer.py {target_filename.csv} {target month YYYY/M}

例えば Actions.csv から 2020年12月の利用状況が見たい場合はこんな感じ。

$ python github_actions_cost_viewer.py Actions.csv 2020/12

すると、こんな感じで

  • 無料枠の何%を使っているか
  • お支払額はいくらか
  • 各Repositoryの利用状況に応じた按分費用

を教えてくれます。

[FREE TIER USEGE RATE]
  shared storage: 135.0%
  actions: 56.0%
[TOTAL PAYMENT]: $4.43
  [shared storage]: $4.43
[Details]: 
  [repo-rabbit]: $0.00
  [repo-panda]: $2.06
  [repo-cat-dog]: $0.32
  [repo-camel]: $0.00
  [repo-elephant]: $2.05

今回はstorageしか無料枠をオーバーしていなかったので、storageを使っていないプロジェクトは無料になっていますね👍

また、下記のようなリポジトリごとの利用状況、リポジトリ別・workflowごとの利用状況、日別の利用状況を可視化したimageも生成されます。

リポジトリごとの利用状況

f:id:kusuwada:20201201050620p:plain:w400

Product (actions/shared storage) ごとのグラフ

f:id:kusuwada:20201201050615p:plain:w400

各リポジトリの、日別利用状況

f:id:kusuwada:20201201050611p:plain:w400

各リポジトリの、さらにworkflow別利用状況

f:id:kusuwada:20201201050624p:plain:w400

カスタマイズ

無料枠はdefaultでEnterprise契約のものになていますが、下記を参考に自分たちの契約に合わせて無料枠の値を書き換えてください。

GitHub Actionsの支払いについて - GitHub Docs

ココ github_actions_cost_viewer.py

FREE_TIER = {'shared storage': 50,  # GB
             'actions': 50000}      # min/month

あとがき

2020年12月時点では確認できませんでしたが、今後コストの内訳が見れるようなUIがGitHubに実装されるかもしれませんね。プロジェクトや組織をまたいだ契約にしていると、なかなかすべてのリポジトリの利用状況を把握するのは難しいので、こういった可視化・日時での監視が効果的になって来るんじゃないかと思います。予算上限アラートとかもそのうちOrganization単位で設定できるようになるといいですね。

今回は諸事情によりcsvからグラフ化しましたが、APIかもデータを取ってこれるので、完全に自動化するならこっちを使ったほうが良さそうです。GoogleのDataPortal(旧Data Studio)に突っ込むと、素敵なUIとともに実現できそう。

また、Enterprizeアカウントで請求書払いをしていると、無料枠を越えた場合の支払料金上限を管理できないため、事前に使いそうな料金を前払いするなどの作戦が必要です。前払いした分は、1.5倍まで使えるのでお得感はあるものの、商用環境へのdeployなんかに使う場合は急に前払い分使い切って止まって動かなくなるといった事故が発生しかねないので、事前にこういった事態を想定したフローや回避策を検討しておく必要がありそうです。

参考: GitHub Actionsの支払いについて - GitHub Docs