目次を開く
さくらのクラウドAppRun 専有型 で「クラスタ分割」が必須だった実例

さくらのクラウドAppRun 専有型 で「クラスタ分割」が必須だった実例

概要

さくらのクラウド AppRun Dedicated (専有型)において、
frontend / backend を同一クラスタに配置して運用していたところ、

  • 稼働コンテナ数が 0 になる
  • LB が no available server を返す
  • backend が 想定外の ASG に配置される

といった 原因が非常に分かりづらい不具合が連鎖的に発生しました。

調査の結果、根本原因は
👉 AppRun Dedicated における ASG とクラスタの仕様理解不足

本記事では、

  • なぜこの問題が起きたのか
  • なぜ「クラスタ分割」が唯一の解決策だったのか
  • 今後同じ構成を組まないための設計指針

実例ベースでまとめます。


発生した事象

実際に起きていた状態は以下です。

  • ss-backend-prdss-frontend-asg 上で起動
  • backend 用 ASG は ワーカが起動しているのにアプリ数が 0
  • 結果として Load Balancer が
    no available server を返却

GUI 上では一見問題が分かりづらく、
**「起動しているのに通信できない」**状態が続きました。


原因:ASG は「専用実行先」ではない

ここが最大の落とし穴です。

AppRun Dedicated における ASG(Auto Scaling Group)は、

同一クラスタ内のワーカープール

として扱われます。

つまり、

  • ASG = アプリ専用の実行先
  • この ASG にはこのアプリだけが載る

という保証は 一切ありません

実際に起きた内部状態

  • frontend 用 shared ワーカに backend がスケジューリングされる
  • backend 用 private ワーカが空く
  • 想定していたネットワーク要件(FW / 公開範囲)が崩壊
  • ヘルスチェック不整合 → コンテナ 0 扱い

という 設計上の前提崩れが発生しました。


対応:やるべきことは「クラスタ分割」一択

1) クラスタを用途別に完全分割

用途が異なるアプリは 必ずクラスタを分ける

  • Front 用クラスタ
    ss-dedicated-front
  • Back 用クラスタ
    ss-dedicated-back

これにより、

  • ASG 混在
  • 想定外スケジューリング

物理的に排除できます。


2) Terraform / デプロイ構成の見直し

以下の変更を実施しました。

  • AppRun Dedicated モジュールに infra_components を追加
  • production 環境で frontend / backend を完全に別モジュール化
  • dedicated deploy を front / back で個別実行

👉
**「同一 apply で一緒に作らない」**のがポイントです。


3) Let’s Encrypt(HTTP-01)の落とし穴

クラスタ作成時の注意点です。

  • 80 / 443 両方を開けないと HTTP-01 が通らない
  • 80 を閉じた状態だと クラスタ作成自体が 400 エラーで失敗

「本番は 443 しか使わない」
でも 作成時だけは 80 が必須 です。


重要な学び(設計指針)

  • ASG はアプリ専用実行先ではない
  • 用途が違うならクラスタは必ず分ける
  • AppRun Dedicated は
    「クラスタが境界」
  • Let’s Encrypt を使うなら
    80 / 443 の両開放が必須
  • LB 再作成により IP が変わるため DNS 更新が必要

現在の構成方針(推奨)

  • Frontend
    ss-dedicated-front
  • Backend
    ss-dedicated-back
  • backend は 443 のみ公開
  • DNS は Cloudflare(DNS only)運用

よくある質問(AppRun Dedicated / クラスタ設計)

Q1. AppRun Dedicated で稼働コンテナ数が 0 になる原因は何ですか?

A. 多くの場合、ASG とクラスタ設計の前提ズレが原因です。
AppRun Dedicated の ASG はアプリ専用の実行先ではなく、同一クラスタ内のワーカープールとして扱われます。そのため、Front / Back を同一クラスタに配置すると、想定外の ASG にアプリが配置され、結果として「稼働コンテナ数 0」と判定されることがあります。


Q2. AppRun Dedicated の ASG はアプリごとに固定されますか?

A. いいえ、固定されません
ASG は「アプリ専用」ではなく、同一クラスタ内で共有される実行リソースです。用途の異なるアプリを同居させると、意図しない ASG にスケジューリングされる可能性があります。


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

A. バックエンドアプリが ネットワーク要件を満たさない ASG に配置された場合に発生します。
コンテナ自体は起動していても、ヘルスチェックが通らず、Load Balancer 側では「利用可能なサーバーが存在しない」と判定されます。


Q4. Frontend と Backend は同一クラスタに配置してはいけませんか?

A. 原則として分けるべきです
AppRun Dedicated においては、クラスタが最小の隔離単位です。Front / Back のようにネットワーク要件や公開範囲が異なるアプリは、クラスタ分割しないと不安定化リスクが高いです。


Q5. ASG を分ければクラスタ分割は不要ですか?

A. 不要ではありません。
ASG を分けても、同一クラスタ内であれば混在は起きます
用途が異なる場合は ASG 分離ではなくクラスタ分割が必須です。


Q6. AppRun Dedicated で Let’s Encrypt が取得できない原因は?

A. クラスタ作成時に 80 / 443 の両方が開いていない可能性があります。
HTTP-01 チャレンジでは 80 番ポートが必須で、80 を閉じたままだと クラスタ作成が 400 エラーで失敗します。


Q7. クラスタを作り直すと DNS 設定は必要ですか?

A. はい、必須です
クラスタ再作成により Load Balancer の IP が変更されるため、DNS レコードの更新を忘れると疎通しません。Cloudflare 利用時は DNS only 設定を推奨します。


Q8. AWS ECS と同じ感覚で設計しても大丈夫ですか?

A. 危険です。
ECS の Service / Task 分離の感覚で AppRun Dedicated を設計すると、ASG・クラスタ周りで事故りやすいです。AppRun Dedicated では **「クラスタが境界」**という前提で設計する必要があります。

AppRun Dedicated では **「クラスタが境界」**という前提で設計する必要があります。


まとめ

AppRun Dedicated は便利ですが、
ASG / クラスタの設計思想を AWS 感覚で扱うと事故ります

  • ECS の Service 分離 ≠ AppRun Dedicated
  • ASG 分離 ≠ 安全

👉 クラスタが最小の隔離単位

この前提で設計すると、
今回のような「見えない不具合」は避けられます。

記事をシェアする