GitHub Actions Self-hosted Runnerのコスト削減と高速化5つの実装パターン¶
この記事の対象者
- DevOpsエンジニア(中級者)でGitHub Actionsのコスト削減を求められている方
この記事のポイント¶
- EC2スポットインスタンスでランナーを80%安く運用
- Docker layer cacheで依存関係インストールを3分→30秒に短縮
- 並列実行とジョブ分割で全体のビルド時間を半減
なぜこの問題が今重要か¶
GitHub-hostedランナーの分単位課金が月額10万円を超えるケースが増加。一方でセルフホステッドランナーの設定ミスによるセキュリティインシデントも報告されており、コストと安全性の両立が急務となっています。
解決ステップ概要¶
| ステップ | 内容 | 到達指標 |
|---|---|---|
| 1 | EC2 Auto Scalingグループ設定 | 起動時間 < 60秒 |
| 2 | Dockerキャッシュ最適化 | キャッシュヒット率 > 90% |
| 3 | ジョブ並列化戦略実装 | 並列度4以上 |
ステップ1: EC2スポットインスタンスでの自動スケーリング¶
AWS Systems Managerと組み合わせることで、ジョブ実行時のみインスタンスを起動する仕組みを構築します。
name: Trigger Self-hosted Runner
on:
workflow_dispatch:
jobs:
start-runner:
runs-on: ubuntu-latest
steps:
- name: Start EC2 runner
run: |
aws ec2 run-instances \
--launch-template LaunchTemplateName=github-runner \
--instance-market-options MarketType=spot
ステップ2: Docker Build Kitによるレイヤーキャッシュ最適化¶
BuildKitの外部キャッシュ機能でS3にビルドキャッシュを永続化し、複数ランナー間で共有します。
# syntax=docker/dockerfile:1.4
FROM node:20-alpine AS deps
WORKDIR /app
--mount=type=cache,id=npm,target=/root/.npm \
COPY package*.json ./
RUN npm ci --cache /root/.npm
対応するworkflow設定:
- name: Build with cache
run: |
docker buildx build \
--cache-from type=s3,region=ap-northeast-1,bucket=build-cache \
--cache-to type=s3,region=ap-northeast-1,bucket=build-cache
ステップ3: Matrix戦略による並列テスト実行¶
テストを論理的に分割し、複数ランナーで同時実行します。
jobs:
test:
strategy:
matrix:
shard: [1, 2, 3, 4]
runs-on: self-hosted
steps:
- run: npm test -- --shard=${{ matrix.shard }}/4
よくある落とし穴と対処¶
| 症状 | 原因 | 即時対処 |
|---|---|---|
| ランナーがオフライン表示 | トークン期限切れ | Systems Manager Parameter Storeでトークン自動更新 |
| ビルドが異常に遅い | ディスク容量不足 | 起動時にdocker system prune -af実行 |
| 権限エラー | IAMロール未設定 | EC2インスタンスプロファイルにS3/ECR権限付与 |
詳細設定(高度な最適化)
### ランナーグループによるリソース最適化 特定のワークフローに専用の高性能インスタンスを割り当て: - GPU搭載インスタンス:機械学習モデルのトレーニング用 - メモリ最適化インスタンス:大規模なデータ処理用 ### Ephemeral Runnerモード ジョブ完了後に自動的にランナーを破棄し、セキュリティを強化:./config.sh --url https://github.com/ORG/REPO \
--token TOKEN --ephemeral --unattended