さくらインターネットの AppRun Dedicated(専有型)は、自由度が高い反面、Terraform で apply が通っても activeNodeCount=0(Podが1つも立ち上がらない) という事象によく陥ります。
実案件で特定した「ドキュメントには載っていない仕様」と、復旧のための黄金フローを記録します。
1. 起動失敗の 9 割を占める「SEG」の疎通不足
AppRun 専有型のワーカーノードは、デフォルトで外部ネットワークから隔離されています。
- 罠の正体: ワーカーが起動しても、自身の管理用 コントロールプレーン や、イメージを Pull するための コンテナレジストリ に到達できず、Pod の作成(イメージプル)に失敗します。
- 解決策: プライベートスイッチ側で SEG (Service Entrance Gateway) を有効化し、以下のエンドポイントを接続先として明示的に許可してください。
*.sakuracr.jp(コンテナレジストリ)AppRun 専有型コントロールプレーン- (必要なら)オブジェクトストレージ
2. Terraform のスペック指定(500 Internal Server Error)
HCL で cpu や memory を定義する際、**「物理的に存在しない組み合わせ」**を指定すると、プロバイダー経由の API 叩き上げ時に 500 エラーで即死します。
- NG例:
cpu = 4,memory = 8(4vCPU/8GB は存在しない) - OK例:
cpu = 4,memory = 4またはcpu = 1,memory = 2 - 復旧のコツ: 起動しない原因がリソース不足か設定ミスかを切り分けるため、まずは 1vCPU / 2GB の最小構成で
activeNodeCount=1を目指すのが鉄則です。
3. IP Pool の衝突:runner との「1bit」の争い
ネットワーク設計時、ユーザー用の IP Pool が AppRun のシステムコンポーネント(runner や LB)と重複すると、ASG の作成や割当に失敗します。
- 罠の正体: frontend の IP pool を
.20開始にすると、内部の管理用 IP と衝突するケースがあります。 - 解決策: Pool 開始アドレスを
.21以降にずらして設計します。Terraform# 成功パターンの IP Pool 定義例 network_interface { ip_address_pool { start = "10.20.0.21" # .20を避けて開始 end = "10.20.0.29" } }
4. eth0=shared 時の Default Gateway 制限
- 症状: ASG 作成時に
400 (defaultGateway must not be set)エラー。 - 原因: フロントエンド ASG で
eth0=sharedを使用している場合、他のプライベート NIC に gateway を設定することは仕様上禁止されています。 - 対策: プライベート側の NIC 定義から
gateway設定を削除してください。
5. 【最重要】「更新」不可。再作成こそが唯一の反映
Terraform で ip_address_pool や NIC 設定を書き換えて apply しても、実環境に反映されないことがあります。
- 理由: 既存の ASG/LB が存在する場合、内部の構築スクリプトが「作成済み」と判定して処理をスキップするためです。
- 鉄則: 設定変更時は
terraform destroy→terraform applyによる全削除・再作成が、現状最も確実な反映手段です。
2026-02-03 最終復旧ログ:正常起動へのチェックリスト
もし /healthz が 503 を返し続けているなら、以下の順に確認してください。
- SEG の有効化: レジストリとコントロールプレーンへの経路があるか?(IP は
10.20.0.5/24等でセグメント内に存在するか) - リソースの最小化:
1vCPU / 2GBでスケジューリングに成功するか? - DNS 更新: LB 再作成で Public IP が変わっていないか?(
salessight.east-cloud.jpの A レコードを新 IP に向け直したか) - 証明書の反映: LB 再作成直後は証明書が一時的に self-signed になるケースがあるため、数分待機してブラウザから確認。
「Apply は成功するが、中身は死んでいる」 という AppRun Dedicated 特有の挙動を理解すれば、デバッグ時間は劇的に短縮されます。
AppRun Dedicated 構築トラブルに関するよくある質問(FAQ)
Q: activeNodeCount が 0 のまま、一向に 1 になりません。何を確認すべきですか?
A: まずは SEG(Service Entrance Gateway)の設定を確認してください。 専有型ワーカーは、デフォルトで外部ネットワークから遮断されています。SEG で「コンテナレジストリ(*.sakuracr.jp)」および「AppRun専有型コントロールプレーン」への接続許可設定が漏れていると、イメージのプルができず、ノードが活性化しません。
Q: Terraform でスペック変更(CPU/メモリ)を apply したのに反映されません。
A: AppRun Dedicated の仕様上、既存リソースの「更新」が効かない項目があります。 特に ASG(Auto Scaling Group)や LB の内部設定は、リソースが存在すると構築スクリプトが処理をスキップする設計になっています。設定変更を確実に反映させるには、一度 terraform destroy でリソースを削除してから再作成(apply)を行ってください。
Q: ASG 作成時に「500 Internal Server Error」が発生します。原因は何ですか?
A: 指定したワーカークラス(CPU/メモリの組み合わせ)が実在しない可能性があります。 例えば 4vCPU / 8GB といった組み合わせは提供されていないため、API 側でエラーとなります。4vCPU / 4GB や 2vCPU / 2GB など、さくらインターネットが公式に提供しているスペック表に準じた値を指定してください。
Q: ロードバランサー(LB)を再作成したらサイトにアクセスできなくなりました。
A: LB の Public IP アドレスが変更されている可能性があります。 LB を再作成すると、新しい Public IP が割り当てられます。お使いの DNS サービス(さくら外の DNS や A レコード等)にて、salessight.east-cloud.jp などのドメイン向け先を新しい IP アドレスへ手動で更新する必要があります。
Q: IP Pool の設定で注意すべき「衝突」とは何ですか?
A: AppRun の管理用コンポーネント(runner)との重複です。 同一セグメント内で .20 付近のアドレスはシステム側で使用されるケースが多いです。ユーザー用の IP Pool 開始アドレスを .21 以降に設定することで、アドレスの奪い合いによる起動失敗を回避できます。
この記事の内容が、AppRun Dedicated の構築で夜通しデバッグしているエンジニアの助けになれば幸いです。

