GitHub Enterprise の事業単位の課金（コストセンター）について解説します

## はじめに

BIPROGY 株式会社では、AI 技術を用いた質の高い開発体験（いわゆる [AI 駆動開発](https://www.ai-driven.dev/) ）を目指して、様々な AI 技術やツールの利用を検討しています。

先日、[GitHub Copilot](https://github.com/features/copilot)[^1] Enterprise を社内に導入する活動を行いました。GitHub Copilot は GitHub のアドオンライセンスとして提供されるため、GitHub Copilot Enterprise を利用するためには、まず GitHub Enterprise を導入しなければなりません。

GitHub Enterprise の導入を考える上では、いくつかの課題や疑問点がありました。

* **GitHub Enterprise の契約と課金に関する疑問**
  * GitHub Enterprise はどこからどのように購入できるのか？
  * GitHub Enterprise および GitHub Copilot の利用料はどのように集計され、請求されるのか？
* GitHub Enterprise のガバナンスに関する疑問
  * GitHub のアカウント管理や認証方式はどうすべきか？
  * GitHub の Organization や Team の設計はどうすべきか？
  * GitHub Enterprise の設定項目として、何をどのように設定すべきか？
  * GitHub Copilot のライセンス管理はどのように行うのが適切か？

弊社のようなある程度の規模の会社では、特にお金周りの事情が一筋縄ではいかず、何をどこまで細かく管理できるのか、事前にかなり調査しました。本記事では、GitHub Enterprise の課金周りの仕組み、特に "コストセンター" について解説してみたいと思います。

:::note info
他の項目については別の機会に回します。なお、2024年10月時点の内容であり、今後変更される可能性があります。また、本記事は基本的に GitHub Enterprise Cloud を扱います。GitHub Enterprise Server については扱いません。
:::

## そもそも GitHub Enterprise はどうやって買うのか？

GitHub Enterprise は、以下の購入元から購入できます。

- GitHub
  - [フリートライアル](https://github.com/account/enterprises/new) を開始してそのまま課金するか、
  - 既存の Organization を Enterprise 用にアップグレードする
- Microsoft
  Microsoft との契約（EA や MCA など）に基づいて、Azure Marketplace から購入する[^2]
- 代理店  
  例: [オルターブース](https://www.alterbooth.com/products/github/account-management/)

GitHub 利用料は、以下の方法で支払うことができます。

- クレジットカードまたは PayPal で支払う
- GitHub Enterprise に Azure サブスクリプションを接続し、Azure サブスクリプションの支払い設定に基づいて支払う
- 代理店を通して購入した場合は、代理店ごとの支払い方法に準じる

購入元と支払い方法の組み合わせは以下のようになります。まずここを押さえておきましょう

| 支払い方法＼購入元 | GitHub | Microsoft | 代理店 |
| - | - | - | - |
| クレジットカード | 〇 | 〇（※1） | ※2 | 
| PayPal | 〇 | － | ※2 |
| Azure サブスクリプション | 〇 | 〇 | ※2 |
| 代理店ごとの支払い方法 | － | － | 〇 |

※1 Microsoft から購入する場合は通常、GitHub に Azure サブスクリプションを接続します。Azure サブスクリプションはクレジットカードまたはデビットカードで支払いができるため 〇 としています。ただしその場合、クレジットカードを登録する先は GitHub 本体ではなく Azure サブスクリプションとなります。

※2 各代理店にお問合せください。少なくともクレジットカード払いが NG であるところは無いはずです。

:::note
以下の記事を読むと、他に請求書払いができる様子ですが、筆者は確認ができておらず詳細が不明なため表には記載していません。

[https://resources.github.com/ja/metered-billing/](https://resources.github.com/ja/metered-billing/)
> Pay with your preferred payment method: Credit card, PayPal, **invoice**¹, or now, with the addition of a new option, your Microsoft Azure Subscription ID on metered billing.
:::

## GitHub Enterprise の新しい課金プラットフォーム

既定では、**GitHub Enterprise の利用料の請求は、Enterprise 単位の一括請求です。**

GitHub Enterprise の導入目的や Organization／Team の編成方針にも依りますが、Organization や Team 単位に pay-as-you-go[^10] を実現したい場合や、それぞれの利用コストをマネジメント層に報告する必要が生じた際、この仕様だと結構困ります。<font color="grey">大企業の人だけかもしれないですが（涙</font>

このようなシナリオに対応するためか、最近 GitHub Enterprise の課金プラットフォームが強化され、課金の管理がしやすくなりました。

新しい課金プラットフォームでは、以下の機能が提供されます。

> - **支出の見積もり**: コスト センターと予算全体の使用量に基づいて、(年間、毎月などの) 支出の傾向を把握します。
> - **分析情報とデータの収集**: 使用状況レポートを生成して、チームや利害関係者と共有し、予算通りであるかどうかを把握します。
> - **事業単位への課金**: Organization、リポジトリ、およびメンバーを作成してコスト センターに割り当てることで、アカウンタビリティを向上させます。
> - **支出超過の防止**: 予算とアラートを使用して、支出を追跡および制御します。
> - **支出の観察と把握**: 時間の経過とともに、また、製品によって、支出がどのように変化するかを把握します。

https://docs.github.com/ja/enterprise-cloud@latest/billing/using-the-new-billing-platform/about-the-new-billing-platform-for-enterprises

## コストセンター

新しい課金プラットフォームのドキュメント内に、ユースケースとして "事業単位に課金する" というものがあります。  

事業単位の課金管理を行うには、[コストセンター](https://docs.github.com/ja/enterprise-cloud@latest/billing/using-the-new-billing-platform/charging-business-units) という概念を理解する必要があります。コストセンターは、GitHub の利用料を管理するための単位です。コストセンターに登録したリソースに対する利用料は個別に集計され、グラフ等で分けて確認することができます。

コストセンターの仕様を大まかに説明します。

- **コストセンターに登録できるリソースは以下の 3種類**
  - Organization
  - リポジトリ
  - ユーザー（GitHub アカウント）
- **コストセンターに登録されたリソースの利用料は Enterprise 単位には集計されなくなる**
  - コストセンターに登録されていないリソースの利用料は、引き続き Enterprise に集計される
- **異なるコストセンターに同じリソースを多重登録することはできない**
- コストセンターにユーザーを登録すると、ユーザーの "シート料金" が集計されるようになる。"シート料金" とは、今のところ以下の 3種類のライセンスの料金
  - GitHub Enterprise のユーザーライセンス[^11]
  - GitHub Copilot のユーザーライセンス[^12]
  - GitHub Advanced Security のライセンス[^13]
- コストセンターに Organization を登録すると、Organization やその配下のリポジトリに紐づく以下の利用料が集計されるようになる
  - GitHub Actions
  - GitHub Codespaces
  - GitHub Packages
  - Git Large File Storage(Git LFS)
- **GitHub への支払いを、Azure サブスクリプションを接続して管理している場合に限り、コストセンター毎に別の Azure サブスクリプションを登録できる**（ので、請求情報を分離できる）

図にしてみると以下のイメージです。

![cost-center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/344a0927-9494-ca9c-2d0a-b034cb35c15b.png)

:::note
図では、Cost Center 1 には Organization 1 と Organization 2、User1 を登録しています。また、Cost Center 2 には Repository 2 を登録しています。Repository 3 や User2 は、コストセンターを使わない場合と同様に Enterprise 全体に集計されます。コストセンターへのリソースの多重登録はできないため、Organization 2 や User1 を Cost Center 2 に登録することはできません。
:::

すべてのコストセンターの利用料について単純に総和を取れば、Enterprise 全体の利用料となるような仕組みになっています（"Enterprise" も 1つのコストセンターとして捉えることができます）。そのため、同じリソースを複数のコストセンターに重複して登録できません。

また、Organization を登録しただけでは、その中で活動しているユーザーに対する "シート料金" は集計されません。コストセンターでシート料金を集計したい場合は、コストセンターにユーザーを直接追加する必要があります。なぜなら、ユーザーは複数の Organization に参加できるからです。

コストセンター単位の利用料の推移は、Enterprise の設定画面 > Billing & Licensing > Usage から確認することができます。集計単位としてドロップダウンから "Group: Cost Center" を選択してください。グラフは以下のような見た目となります。

![cost-center-graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/4dec1924-5877-d187-d08e-ed6cea33517c.png)

:::note
検証用に作成したコストセンターだったため、名前が適当ですがご容赦ください。
:::

"Enterprise Only" は、筆者が作成したコストセンターではなく、"コストセンターに登録されていないリソースに対する利用料" として GitHub が自動的に認識しているものです。

各コストセンターの詳細は、グラフの下部にある UI から以下のように確認することができます。

![cost-center-items.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/5d56c319-6c67-d28c-0feb-e5b2afbc06be.png)

よく見ると以下のことがわかります。

- **集計は GitHub の機能単位であり、Organization 単位やリポジトリ単位ではない**
- GitHub Enterprise のユーザーライセンス（GHEC seats）は Units が必ず整数で表示されるが、日割り計算はちゃんと行われる。例えば月途中でコストを確認すると、表に表れない日割り計算の要素があるため Units × Price/unit = Gross amount とならない。画像では、`35 × $21 = $735` であるはずのところ、日割り計算のため `$482.48` となっている
- GitHub Copilot のユーザーライセンス（画像中の Copilot Business など）は Units が小数で表示される

太字で書いた項目の通り、コストセンター内で細かい内訳を見ることはできないので、コストセンターは文字通り、**事業単位（= 利用料をまとめても良い単位）で作成する**のが良いと思います。

### Tips: コストセンターに Azure サブスクリプションを接続して請求を分ける

Enterprise 全体に Azure サブスクリプションを接続して GitHub の支払いを管理している場合に限り、それぞれのコストセンターにも Azure サブスクリプションを接続することができるようです（※）。コストセンターごとに異なる Azure サブスクリプションを接続すれば、一括請求ではなく分割請求が可能ということになります。

:::note warn
※ 筆者は実際には試していないので、試した方の情報共有をお待ちしております！
:::

> アカウントが Azure に課金される場合は、Azure サブスクリプション ID を追加するオプションがあります。 コスト センターを使用すると、複数の Azure サブスクリプション ID を使用できるため、Enterprise 内のさまざまな事業単位がその使用量に対して直接支払いを行えます。

https://docs.github.com/ja/enterprise-cloud@latest/billing/using-the-new-billing-platform/charging-business-units

Enterprise の設定画面 > Billing & Licensing > Cost centers > 対象のコストセンターのメニュー（︙）から "Edit" を選択してコストセンターの設定画面を開き、以下の画像のボタンから接続します。

![associate-azure-subscription1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/62521687-1d9d-5ecd-f981-d4ff9e43c905.png)

Azure サブスクリプションの管理権限を持っているアカウントで Azure にログインすると、GitHub は Azure からサブスクリプションの情報を取得して以下のような UI を提示します。接続する Azure サブスクリプションを選択してください。

![associate-azure-subscription2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/94c5ed44-cdbb-dfbd-7b15-d016fbab6008.png)


## コストセンターの課題

### 複数の事業に貢献しているユーザーのシート料金を、誰が支払うかという問題は解決できない

GitHub Copilot について考えてみます。

GitHub Copilot ライセンスはユーザーに紐づくので、ユーザーがどの Organization で活動していても利用できます。一方、ユーザーは複数の Organization に登録できます。

ということは、例えば "Organization + そこで活動するユーザー = 事業単位" とする方針を取った場合に、**先に活動を開始した事業に Copilot のライセンス利用料が計上され、後から開始した事業はタダ乗りできる（下図）** ということになってしまう可能性があります。

![cost-center-hack1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/dcdf8886-e272-354d-da9a-fb00cdde796f.png)

GitHub Enterprise のユーザーライセンス料や Advanced Security についても同様です。よって、事業単位の社内 pay-as-you-go を実現したい場合には、ユーザーをコストセンターに登録する運用は止めておいた方が良いかもしれません。

:::note
それでもシート料金を事業活動と紐づける場合は、手元で情報を管理して何とかするしかないのかなと思います。新しい課金プラットフォームは後発の機能であり、OSS コミュニティやインナーソース向けの機能開発を優先してきた GitHub の、Enterprise 向け機能の弱さが少し出ているような気もします。
:::

### コストセンターへのユーザー登録は API 経由でしか実行できない

前節で「コストセンターにユーザーを登録する運用は止めておいた方が…」と主張しておいてそれを言うのかという感じですが、前節の話はあくまでも「場合によっては」という前提付き。実際に登録したい場合、API しか手段が無いのは不便と言えば不便です。実際に見てみましょう。

コストセンターの編集画面は以下のようになっており、現時点ではユーザーを UI で追加できません。

![cost-center-problem2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/96cd45de-b5a9-620f-523b-1a3f1dec7230.png)

画像中のリンクをクリックすると、[コストセンターへのユーザー登録 API の詳細](https://docs.github.com/ja/enterprise-cloud@latest/rest/enterprise-admin/billing?apiVersion=2022-11-28#add-users-to-a-cost-center) に遷移します。その中に API の実行方法の説明があるので従います。

ここでは、GitHub CLI を使用する場合の手順を示します。

```sh
# Enterprise の操作権限付きで GitHub にログイン
gh auth login -s admin:enterprise

# コストセンターの ID を取得するためにコストセンター一覧を取得
# ENTERPRISE_SLUG は、Enterprise の URL として現れる。
# 例: https://github.com/enterprises/foobar の場合、ENTERPRISE_SLUG は foobar
gh api \
  -H "Accept: application/vnd.github+json" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  enterprises/ENTERPRISE_SLUG/settings/billing/cost-centers

# taro-yamada_company1 を追加
# COST_CENTER_ID は、コストセンター名ではないので注意。実際の ID は GUID 形式。
gh api \
  --method POST \
  -H "Accept: application/vnd.github+json" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  enterprises/ENTERPRISE_SLUG/settings/billing/cost-centers/COST_CENTER_ID/resource \
   -f "users[]=taro-yamada_company1"
```

### コストセンターを作成する API はまだ無い

これ早めに欲しいです。頑張れ GitHub の人('ω')
現時点では無いです。解決は時間の問題だと思いたい。

![cost-center-problem3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895028/b60fe728-2f95-ef6e-83ba-6a2ee6449df4.png)

## まとめ

新しくなった GitHub Enterprise の課金プラットフォームや事業単位の課金（コストセンター）について解説してみました。GitHub Enterprise の導入を検討している人の参考になれば幸いです。

## We Are Hiring!

https://www.biprogy.com/recruit/recruiting/

[^1]: GitHub Inc. が提供する、エディタ上でプログラミングにまつわる様々な補助をしてくれる AI。AI ペアプログラマーと表現される。

[^2]: もしかしたら Marketplace 以外にも購入経路があるかもしれない。ご存知の方は教えていただきたい。

[^10]: 使った分だけ支払う方式。企業内の特定部署や開発チームに pay-as-you-go を要求するのは大変なので、GitHub Enterprise のコストは全て会社の一括負担とするのが最も楽である。特にインナーソース目的の場合。ただ往々にして、会社の（主に懐）事情的にそう上手くは行かないものだ。

[^11]: 例えば EA 契約に基づいて Azure Marketplace から年単位で GitHub Enterpirse のユーザーライセンスを購入している場合、コストセンターにユーザーを登録してもユーザーライセンスのコスト（シート料金）はコストセンターに集計されない。おそらく GitHub と Azure Marketplace で UI が分かれているため、2重の請求とならないようにするための措置であると思われる。

[^12]: 意外と知られていないかもしれないが、GitHub Enterprise 内でユーザーに GitHub Copilot ライセンスを割り当てる際、GitHub Copilot Business と GitHub Copilot Enterprise のどちらを割り当てるか選ぶことができる。

[^13]: "対象期間中に Advanced Security を有効化したリポジトリにコミットしていた場合に課金対象となる" というあたりがやや特殊なので、"シート料金" という言葉のイメージからは少し想像しづらい。