目次を開く
第3回:さくらのクラウドで構築するモダンアーキテクチャ GitHub Actions × Self-hosted Runner

第3回:さくらのクラウドで構築するモダンアーキテクチャ GitHub Actions × Self-hosted Runner

GitHub ActionsとSelf-hosted RunnerでVPC内DBにmigrateを実行する方法

AppRun構成でCI/CDを成立させる実践設計


📚 さくらのクラウドで作るモダンアーキテクチャ(全5回)


はじめに

AppRunを使ったモダン構成で、ほぼ確実にぶつかる問題があります。

それが

VPC内部にあるデータベースに、CI/CDからどうやってmigrateを流すか

という問題です。

通常のCI/CDでは、

  • GitHub Actions
  • GitLab CI
  • CircleCI

などのクラウドCIが使われます。

しかしこれらは インターネット上の環境で実行されるため、VPC内部には直接アクセスできません。

今回の構成では、

  • データベースはVPC内
  • DBはグローバル公開しない
  • AppRun専有型を利用

という設計なので、

CIからDBに直接アクセスすることができません。


なぜ普通のCIではダメなのか

構成を整理します。

GitHub Actions

Internet

AppRun

VPC Router

Database

ここで問題になるのは

GitHub ActionsはVPCの外にいる

という点です。

つまり、

  • DBを公開しない限り
  • CIはDBに接続できない

という状態になります。

しかしDBを公開するのは、セキュリティ的に好ましくありません。


解決策:Self-hosted Runner

この問題を解決するのが

Self-hosted Runner

です。

これは簡単に言うと、

GitHub Actionsの実行環境を自分のサーバーに置く仕組み

です。

つまり、

  • RunnerをVPC内に配置
  • GitHub ActionsのジョブをRunnerで実行

することで、

CIからVPC内部のリソースにアクセスできるようになります。


Runner配置の構成

今回のシリーズでは以下の構成を採用します。

GitHub Actions

Self-hosted Runner

VPC Router

Database

RunnerをVPC内部に配置することで、

  • DBアクセス
  • migrate実行
  • 内部API接続

が可能になります。


Runnerを配置するセグメント

第2回で紹介したネットワーク構成を思い出してください。

VPC
├─ public-app-seg
├─ private-db-seg
└─ runner-seg

Self-hosted Runnerは

runner-seg

に配置します。

理由は以下です。

  • AppRunと役割が異なる
  • DBアクセスを制御しやすい
  • CI用リソースを分離できる

CI用のサーバーは、必ず専用セグメントに分離するのが安全です。


Runnerのもう一つの問題:インターネットに出られない

RunnerをVPC内部に配置すると、もう一つ問題が発生します。

それは

Runnerがインターネットに出られない

という問題です。

RunnerはCI実行時に以下の通信を行います。

  • GitHub Actions API
  • pip install
  • npm install
  • Docker image pull
  • 外部APIアクセス

そのため 外向き通信が必須になります。


NAT VMの役割

ここで必要になるのが

NAT VM

です。

NAT VMは、

VPC内部のサーバーがインターネットへ出るための出口

として機能します。

構成は以下のようになります。

Runner

VPC Router

NAT VM

Internet

RunnerはNAT VMを経由してインターネットへ接続します。


AWSとの違い

AWSでは

  • NAT Gateway

を利用します。

一方、さくらのクラウドでは

NATはVMで構築する

のが一般的です。

ただしメリットもあります。

  • コストが安い
  • 構成の自由度が高い
  • 通信制御が細かくできる

NAT VMを含めた全体構成

最終的なネットワーク構成は以下になります。

Internet

Cloudflare

AppRun[VPC]
├─ public-seg
│ └─ NAT VM

├─ runner-seg
│ └─ Self-hosted Runner

└─ private-db-seg
└─ Database

通信フロー:

Runner → NAT VM → Internet → GitHub
Runner → VPC Router → Database

この構成により

  • CI/CD
  • VPC内部通信
  • DB保護

を両立できます。


Runnerセットアップ

RunnerはGitHubからスクリプトを取得して起動します。

mkdir actions-runner
cd actions-runnercurl -o actions-runner.tar.gz -L https://github.com/actions/runner/releases/latest/download/actions-runner-linux-x64.tar.gztar xzf actions-runner.tar.gz./config.sh --url https://github.com/your-repo --token TOKEN
./run.sh

これでRunnerがGitHubと接続されます。


GitHub Actions設定例

Djangoのmigrate実行例です。

name: migrateon:
push:
branches:
- mainjobs:
migrate:
runs-on: self-hosted steps:
- uses: actions/checkout@v4 - name: Install dependencies
run: |
pip install -r requirements.txt - name: Run migrate
run: |
python manage.py migrate

重要なのはここです。

runs-on: self-hosted

これによりジョブは

VPC内部のRunner

で実行されます。


Runner運用で気をつけること

Runnerは公開しない

RunnerはCI実行環境です。

外部公開すると攻撃対象になります。

必ずVPC内部に配置します。


Runnerは専用セグメントに置く

CI環境は分離します。

理由:

  • セキュリティ
  • 負荷分離
  • トラブル影響範囲

Runnerは使い捨ても可能

高度な構成では

  • Runner自動生成
  • Job終了後削除

という設計もあります。

今回はシンプル構成を採用します。


まとめ

AppRun構成でCI/CDを成立させるには

Self-hosted Runner + NAT VM

が必要になります。

理由はシンプルです。

  • DBはVPC内部
  • CIはインターネット
  • Runnerは内部
  • Runnerは外に出る必要がある

だから

RunnerをVPC内に置き
NAT VMでインターネットに出る

この構成が最もシンプルで安全です。


次回予告

次回は

AppRun専有型と共用型の違い

を解説します。

ここを理解していないと、

  • VPC接続できない
  • スイッチ接続できない
  • ネットワーク設計が破綻する

という事故が起きます。

AppRun設計の核心です。


よくある質問(FAQ)

Q1. GitHub ActionsからVPC内のデータベースに接続できますか?

通常のGitHub Actionsはインターネット上で実行されるため、VPC内部のデータベースには直接接続できません。
そのため、VPC内にSelf-hosted Runnerを配置し、そのRunner上でCIジョブを実行する構成が必要になります。


Q2. Self-hosted Runnerとは何ですか?

Self-hosted Runnerとは、GitHub Actionsのジョブを自分のサーバーで実行できる仕組みです。
通常はGitHubのクラウド環境でジョブが実行されますが、RunnerをVPC内に配置することで内部リソースへ安全にアクセスできます。


Q3. Self-hosted Runnerはどこに配置するべきですか?

Self-hosted Runnerは専用のセグメント(例:runner-seg)に配置するのが推奨です。
AppRunやデータベースと役割が異なるため、ネットワークを分離することでセキュリティと運用性が向上します。


Q4. Runnerはインターネットに接続する必要がありますか?

はい。Runnerは以下の通信を行うため、外向き通信が必要です。

  • GitHub Actions API
  • パッケージダウンロード(pip / npm)
  • Dockerイメージ取得
  • 外部APIアクセス

そのためVPC内のRunnerはNAT VMなどを経由してインターネットへ接続する必要があります。


Q5. NAT VMとは何ですか?

NAT VMとは、VPC内部のサーバーがインターネットへアクセスするための出口となるサーバーです。
RunnerはNAT VMを経由することで、GitHubやパッケージリポジトリへアクセスできます。


Q6. AWSの場合はどう構成しますか?

AWSでは通常、

  • NAT Gateway
  • ECS / EC2 Runner
  • GitHub Actions

の組み合わせで同様の構成を作ります。
さくらのクラウドではNAT Gatewayの代わりにNAT VMを構築するケースが多いです。


Q7. データベースをグローバル公開してCIから接続するのはダメですか?

可能ではありますが推奨されません。
DBを公開すると攻撃対象が増えるため、VPC内部に閉じたままSelf-hosted Runner経由で操作する方が安全です。

記事をシェアする