GitHub ActionsのArm対応でコスト削減したはずが、気づけば課金が発生していた話

半年前に書いた記事で、FargateやFargate Spotによるコスト削減について紹介しました。  
そのときはGitHub Actionsのホストランナーをx86(`ubuntu-latest`)のままにして、QEMUを使ったクロスコンパイルでARM対応する方法を紹介したのですが、実際に運用してみるとビルド時間が数分長くなるという問題にぶつかり、いったんArm化を断念していました。

https://qiita.com/suzuki0430/items/bd75501e168fd7ba16ca

## 再挑戦：「ホストランナーをArmにすればよくね？」

半年経ってCI/CDワークフローを見直していたところ、ふと「そもそもGitHub ActionsのホストランナーをArmにすれば、QEMUとかクロスコンパイルいらなくね？」という超シンプルなアイデアにたどり着きました(なんで半年前に思いつかなかったんだろう...)。

ということで、2回目の「Arm化コスト削減チャレンジ」を始めてみました。

## 方法1: GitHub-hosted runnerの`ubuntu-xx.xx-arm`を使う(パブリックリポジトリ限定)

2025年1月から、GitHub ActionsにArmのホストランナー(`ubuntu-22.04-arm`と`ubuntu-24.04-arm`)が追加され、パブリックリポジトリなら無料プランでも使えるようになりました。

[公式アナウンス](https://github.blog/changelog/2025-01-16-linux-arm64-hosted-runners-now-available-for-free-in-public-repositories-public-preview/)

ワークフローの記述を `runs-on: ubuntu-latest` → `runs-on: ubuntu-24.04-arm` に変えるだけなので、これは楽だ！と思ったのですが...プライベートリポジトリでは利用不可でした。

試しに回してみたところ、しっかりエラーになりました。

![エラーのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/a86a45e2-5071-459a-94f9-cd6a35b2b4cf.png)

なので、パブリックリポジトリを使っている方にはこの方法が一番おすすめです。

## 方法2: Larger runnersでArmホストランナーを自作する(Team or Enterprise Cloud限定)

GitHub Team / Enterprise Cloudプランでは、Larger runnersという機能が使えます。  
カスタムリソース(CPU, RAM)でGitHub-hosted runnerを作成できる機能で、Armアーキテクチャも選択可能です。

幸い私の所属する組織はEnterprise Cloudプランだったので、こちらで試してみました。

### 手順1: Budgetを設定

`https://github.com/enterprises/<enterprise-name>/billing` から「Budgets and alerts」→ Actionsを選び、予算を設定します。

![予算設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/bc17cd11-0cda-41c2-9dc4-0627a63f0a7e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/3ccf174c-1ee3-40cb-92ac-b2692037bf22.png)


### 手順2: Arm runnerを作成

`https://github.com/organizations/<organization-name>/settings/actions/runners`からランナーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d0781ed5-c21a-4e11-943a-28b2c9d065b8.png)

「New GitHub-hosted runner」から作成を開始し、`Name`, `Platform`, `Image`, `Size` を入力して完了です。

![ランナー作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/3cca9528-ae1b-4a35-8b74-23920adda95f.png)

※ この`Name`が`runs-on`に指定する値となります。

### 手順3: WorkflowとECSタスク定義を更新

`runs-on`を以下のように更新します。

```yaml
jobs:
  build-and-push:
    runs-on: 'linux-arm64'
```

ECSタスク定義にも`runtimePlatform`の記述を忘れずに追加します。

```json
"runtimePlatform": {
  "operatingSystemFamily": "LINUX",
  "cpuArchitecture": "ARM64"
}
```

これで、GitHub ActionsとECSの両方でArm対応が完了です。

## 落とし穴：Larger runnersは**無料枠が使えない**

タスクは無事Armで動作し、よっしゃこれでQEMU不要、ビルドも速い、コストも下がる...と思いきや、Larger runnersは課金対象という落とし穴が待っていました。

![課金の内訳](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/5ce132d2-d997-4a5e-b459-af8f38561f00.png)

ドキュメントにも、Larger runnersではGitHub Team / Enterprise Cloudの無料枠がつかえないという記述がありました。

> Included minutes cannot be used for larger runners. These runners will always be charged for, including in public repositories.  
> — [About billing for GitHub Actions](https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions)

つまり、月に20,000分使った場合は100 USDの追加料金がかかります。
一方、Fargate Spotをx86からArmにしたことで削減できるコストは月わずか0.7 USDです。

## 結論：ビルドは速くなったけど、月99ドルの赤字に

QEMUなしで高速ビルド、ECSタスクもArm対応でコスト削減...のはずが、GitHub Actionsのコストが爆増する結果となってしまいました。

| 項目                     | 月間コスト |
|------------------------|------------|
| GitHub Actions Larger runner (20,000分) | $100       |
| Fargate SpotのArm化による削減           | -$0.7      |
| **差額**                   | **+$99.3** |

今回の学びをまとめると、
- Fargate SpotのArm化そのものは意味がある
- しかし、GitHub ActionsでLarger runnerを使うと、思わぬコストがかかる
- コスト削減目的なら、CIランナーの課金体系も確認必須
- ドキュメントはちゃんと読もう

## 参考リンク

- [About GitHub-hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners)
- [About billing for GitHub Actions](https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions)
- [Linux arm64 hosted runners now available for free in public repositories (Public Preview)](https://github.blog/changelog/2025-01-16-linux-arm64-hosted-runners-now-available-for-free-in-public-repositories-public-preview/)