目次を開く
さくらのクラウドAppRun 起動しない原因と対策

さくらのクラウドAppRun 起動しない原因と対策

〜 AppRun Dedicated で稼働コンテナ数が 0 / no available server の場合 〜

AppRun で 「起動しない」
正確には 「デプロイは成功しているのに、稼働コンテナ数が 0 のまま進まない」
という状態にハマったことはありませんか?

  • 起動ログは出ている
  • でも画面は表示されない
  • LB 経由では no available server
  • コンテナ数はずっと 0

この記事では、AppRun Dedicated で実際に詰まったケースをもとに、
AppRun が起動しないときの原因と、最短で直す方法をまとめます。

検索されやすいように、実際に出たエラーメッセージもそのまま載せています。


TL;DR(結論だけ)

AppRun Dedicated で起動しない原因の 9割はヘルスチェックです。

  • ヘルスチェックは 必ず 200 を返す軽い専用エンドポイント
  • timeout は 10〜15 秒(5 秒は短すぎる)
  • Next.js は 0.0.0.0 で bind
  • Django は ALLOWED_HOSTS に LB の送信元 IP を含める

代表的なエラー:

no available server
ERROR Invalid HTTP_HOST header: '133.125.86.137:8000'.
You may need to add '133.125.86.137' to ALLOWED_HOSTS.
django.core.exceptions.DisallowedHost

前提となる技術スタック(この記事の構成)

本記事は、以下の構成を前提にしています。

フロントエンド

  • Framework: Next.js(App Router)
  • 起動方式: next start
  • 実行環境: AppRun Dedicated
  • 公開方式: AppRun Dedicated + ロードバランサ
  • ヘルスチェック: 認証なし・即 200 を返す API

バックエンド

  • Framework: Django
  • 実行環境: AppRun Dedicated(フロントとは別コンテナ)
  • ヘルスチェック: /api/health/
  • 注意点: ALLOWED_HOSTS の設定が必須

※ 他の構成でも考え方は同じですが、
設定箇所はフレームワークごとに異なります。


AppRun が起動しないときの典型的な症状

以下に当てはまる場合、この記事の対象です。

  • AppRun Dedicated の 稼働コンテナ数が 0 のまま
  • 起動ログは出ているのに画面が表示されない
  • LB 経由のアクセスで no available server が返る
  • Django のログに Invalid HTTP_HOST header が出ている

AppRun 起動しない原因パターン

1) ヘルスチェックが 200 を返せていない

AppRun Dedicated では、
ヘルスチェックが成功しない限りコンテナは Ready になりません。

よくある失敗:

  • トップページや /login を指定している
  • 認証・SSR・リライトに巻き込まれて遅い
  • 起動直後に timeout 5 秒で落ちている

結果として、

  • コンテナは起動している
  • でも Ready にならない
  • 稼働コンテナ数は 0 のまま

になります。


2) Next.js が 0.0.0.0 で bind していない

next start のデフォルト設定では、
localhost に bind され、外部から到達できないことがあります。

この場合:

  • コンテナ内部では動いている
  • でも LB からは接続できない
  • ヘルスチェック失敗
  • 起動しない扱い

という状態になります。


3) Django の ALLOWED_HOSTS が原因で起動しない

AppRun / LB 側は、
IP アドレスを Host ヘッダに入れて疎通確認する場合があります。

ALLOWED_HOSTS に IP が含まれていないと、

Invalid HTTP_HOST header
django.core.exceptions.DisallowedHost

が発生し、400 を返します。

この 400 が原因で:

  • ヘルスチェック失敗
  • コンテナが Ready にならない
  • AppRun が起動しない

という流れになります。


対策(最短で直す)

フロントエンド(Next.js)

1. ヘルスチェック専用エンドポイントを作る

// frontend/app/api/health/route.ts
export async function GET() {
  return new Response("ok", { status: 200 });
}
  • 認証なし
  • DB 接続なし
  • 即 200

これが重要です。


2. AppRun のヘルスチェックを専用パスに設定

例:

/healthz

3. timeout を 10〜15 秒に延ばす

起動直後は、

  • コンテナ起動
  • 初期化
  • 接続確認

などで一時的に遅くなります。
5 秒は短すぎます。


4. Next.js を 0.0.0.0 で bind する

{
  "scripts": {
    "start": "next start -p 3000 -H 0.0.0.0"
  }
}

バックエンド(Django)

ALLOWED_HOSTS に LB の送信元 IP を追加

ALLOWED_HOSTS = [
  "backend.example.jp",
  "133.125.86.137",
]

※ 一時的に * で逃げるのは非推奨
(本番では必ず明示的に指定)


動作確認チェックリスト

  • https://<frontend-host>/healthz200
  • AppRun Dedicated の 稼働コンテナ数が 1 以上
  • no available server が出ない
  • 画面が正常に表示される

AppRun 起動しないときの検索ワード別まとめ

  • AppRun 起動しない
    → ヘルスチェックが通っていない可能性が高い
  • AppRun Dedicated 稼働コンテナ数 0
    → コンテナが Ready になっていない(多くはヘルスチェック)
  • AppRun no available server
    → LB から到達可能なコンテナが存在しない
  • AppRun Django DisallowedHost
    ALLOWED_HOSTS に IP が不足している

まとめ

  • AppRun Dedicated で「起動しない」ときは
    まずヘルスチェックを疑う
  • 200 を返す軽い専用エンドポイントを用意する
  • timeout は短すぎない
  • Next.js の bind、Django の ALLOWED_HOSTS は盲点

運用目線のひとこと

起動ログが出ているのに動かない AppRun は、
だいたいヘルスチェック。

ここを切り分けられるようになると、
AppRun Dedicated は一気に扱いやすくなります。


Q&A(AppRun が起動しないときによくある質問)

Q1. AppRun が起動しないのですが、何から確認すればいいですか?

まず ヘルスチェックを確認してください。
AppRun Dedicated では、ヘルスチェックが成功しない限り
コンテナは Ready にならず、稼働コンテナ数は 0 のままになります。

特に以下を優先して確認します。

  • ヘルスチェックが 必ず 200 を返しているか
  • 認証・DB 接続・SSR に依存していないか
  • timeout が 5 秒など短すぎないか

Q2. AppRun Dedicated で「稼働コンテナ数が 0」のままです。なぜですか?

多くの場合、ヘルスチェック失敗が原因です。

  • コンテナは起動している
  • しかし Ready 判定に失敗している
  • 結果として稼働コンテナ数が 0 のまま

という状態になります。

ログに no available server が出ている場合も、
根本原因は ヘルスチェックが通っていないケースがほとんどです。


Q3. AppRun で no available server が出るのはなぜですか?

ロードバランサから見て、
到達可能な Ready 状態のコンテナが存在しないためです。

原因として多いのは:

  • ヘルスチェックが 200 を返していない
  • Next.js が 0.0.0.0 で bind していない
  • Django が 400 を返している(DisallowedHost

Q4. AppRun × Django で Invalid HTTP_HOST header が出ます。どうすればいいですか?

ALLOWED_HOSTS
ロードバランサの送信元 IP アドレスを追加してください。

AppRun / LB 側は、IP アドレスを Host ヘッダに入れて
疎通確認を行うことがあります。

ALLOWED_HOSTS = [
  "backend.example.jp",
  "133.125.86.137",
]

これが不足していると、
Django が 400 を返し、ヘルスチェックが失敗します。


Q5. AppRun のヘルスチェックにトップページを使ってもいいですか?

おすすめしません。

トップページは以下の理由で不安定になりやすいです。

  • 認証が絡む
  • SSR が重い
  • 起動直後は依存サービスが未初期化

必ずヘルスチェック専用の軽いエンドポイントを用意してください。


Q6. AppRun のヘルスチェック timeout は何秒が適切ですか?

10〜15 秒がおすすめです。

起動直後は、

  • コンテナ起動
  • 初期化処理
  • 接続確認

が重なるため、
5 秒は短すぎて失敗しやすいです。


Q7. AppRun で「起動ログは出ているのに動かない」のはなぜですか?

AppRun では、

  • プロセスが起動している
  • サービスとして利用可能

です。

ヘルスチェックが通らないと、
起動ログが出ていても「起動しない」扱いになります。


Q8. AppRun Dedicated と共有型で挙動は違いますか?

細部は違いますが、
「ヘルスチェックが通らないと起動しない」点は共通です。

Dedicated のほうが

  • 設定自由度が高い
  • その分、初期設定ミスに気づきにくい

という特徴があります。

記事をシェアする