AWS CodeBuildをGitHub Actionsのself-hosted runnerとして指定する
この記事は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に関するお役立ち情報を配信中!
Follow @twitter2022年に中途入社した人です。好きなAWSサービスはLambdaです。
Recommends
こちらもおすすめ
-
Terraform × GitHub Actionsでドリフト検出
2024.12.19
-
IT企業の会社員が仕事や健康について考えた記録〜2025年に手術を受けました
2025.12.7
-
AWS CodePipelineでTerraformパイプラインを実装する
2024.3.28
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16

