コンテンツにスキップ

GitHub Actions Self-hosted Runnerのコスト削減と高速化5つの実装パターン

この記事の対象者

  • DevOpsエンジニア(中級者)でGitHub Actionsのコスト削減を求められている方

この記事のポイント

  1. EC2スポットインスタンスでランナーを80%安く運用
  2. Docker layer cacheで依存関係インストールを3分→30秒に短縮
  3. 並列実行とジョブ分割で全体のビルド時間を半減

なぜこの問題が今重要か

GitHub-hostedランナーの分単位課金が月額10万円を超えるケースが増加。一方でセルフホステッドランナーの設定ミスによるセキュリティインシデントも報告されており、コストと安全性の両立が急務となっています。

解決ステップ概要

ステップ内容到達指標
1EC2 Auto Scalingグループ設定起動時間 < 60秒
2Dockerキャッシュ最適化キャッシュヒット率 > 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

次に読む(関連記事)