AWS CodeBuildをGitHub Actionsのself-hosted runnerとして指定する

AWS

2025.12.20

Topics

この記事はNHN テコラス Advent Calendar 2025 の 20 日目の記事です。

はじめに

GitHub Actionsは非常に便利なサービスですが、案件対応をする中で月末に時間の上限に達し、ビルドが実行できないといった状況に度々遭遇することがあります。
今年もアドベントカレンダーでテックブログを書く機会をいただけましたので、少し気になっていたAWS CodeBuildのGitHubアクションランナーについて紹介します。

概要

こちらはGitHub ActionsをGitHubホステッドランナー上ではなく、代わりにAWS CodeBuildを使ってビルドを実行できるような機能です。
ご参考 : AWS CodeBuild がホストする GitHub Actions ランナーを設定

本記事ではコンテナのイメージをビルドしてAmazon ECRにプッシュする処理を例として記載します。

設定内容

IAMロールの準備

AWS CodeBuildでコンテナのビルドを利用するIAMロールに以下の権限を追加する必要があります。
必要に応じてResourceにECRのarnを指定してご利用ください。

{
    "Effect": "Allow",
    "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload"
    ],
    "Resource": "*"
}

AWS CodeBuildとGitHubの連携設定

AWS CodeBuildとGitHubの連携方法の設定については3つの方法が用意されています。

  • GitHub アプリ
  • 個人用アクセストークン
  • OAuth アプリ

GitHub上のSettings -> Developer settingsで設定できる認証方法に対応しています。

本記事では個人用アクセストークンを用いて認証を行います。

個人用アクセストークンの作成

必要な権限は以下の3点になります。

  • repo
  • workflow
  • admin:repo_hook

個人用アクセストークンをAWS Secrets Managerに登録

認証に利用するAWS Secrets Managerには、以下3点を記載する必要があります。

項目名 登録内容
ServerType GITHUB
AuthType PERSONAL_ACCESS_TOKEN
Token 取得した個人用アクセストークン

AWS CodeBuildの設定

AWS CodeBuildの作成を行います。

プロジェクトタイプはランナープロジェクトを選択し、「アカウント認証情報を管理します。」をクリックします。

今回はアクセストークンを用いて認証しますので、「個人用アクセストークン」から先程作成したAWS Secrets Managerを選択し、保存します。

「アカウントは Secrets Manager シークレット経由で正常に接続されました。」という表記になっていれば認証成功です。
紐付けたいリポジトリのURLを入力します。

GitHub Actions用のファイルを用いてビルドを実行する

フォルダ構成

[waka]% tree -a -L 3
.
├── .github                                                                                                                                                                                                                                                                     
│   └── workflows                                                                                                                                                                                                                                                               
│       └── ecr-build-and-push.yml    
├── Dockerfile
├── README.md
├── docker-compose.yml
└── index.html

以下はecr-build-and-push.ymlの記載内容のサンプルになります。
envの部分とruns-onのcodebuildのプロジェクト名を書き換えるとそのままビルドまでできるかと思います。

name: Build and Push Docker Image

on:
  push:
    branches:
      - main
  workflow_dispatch:

env:
  AWS_REGION: [region]
  AWS_ACCOUNT_ID: [account_id]
  ECR_REPOSITORY: [repo_name]
  IMAGE_TAG: [tag]
jobs:
  build-and-push:
    runs-on:
      - codebuild-[codebuildのプロジェクト名]-${{ github.run_id }}-${{ github.run_attempt }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Login to Amazon ECR
        run: |
          aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com

      - name: Build Docker image
        run: |
          docker build -t ${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} .

      - name: Tag Docker image
        run: |
          docker tag ${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
          docker tag ${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ github.sha }}

      - name: Push Docker image to ECR
        run: |
          docker push ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
          docker push ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ github.sha }}

      - name: Output image URI
        run: |
          echo "Image pushed to: ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}"
          echo "Image pushed to: ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ github.sha }}"

上記yamlではpush時にビルドが実行される設定としておりますので、GitHub Actionsが実行されAWS CodeBuild上でもビルドが成功しているのが確認できるかと思います。

おわりに

self-hosted runnerとしてAWS CodeBuildを設定すれば時間の上限に達するという状況がなく、ビルド用のサーバーを用意する必要もないため契約しているGitHubのプランによっては移管も検討できるかと思います。

NHN テコラスの採用情報はこちら

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

waka

2022年に中途入社した人です。好きなAWSサービスはLambdaです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら