目次を開く
さくらのクラウド AppRun Dedicated API の落とし穴まとめ(実エラー付き)|400/500の原因

さくらのクラウド AppRun Dedicated API の落とし穴まとめ(実エラー付き)|400/500の原因

AppRun Dedicated API は仕様が厳密で、必須パラメータや上限を外すと即エラーになります。
本記事では、実際に遭遇したエラーログをそのまま載せつつ、原因 → 対策 → 再発防止の順で整理します。

先に結論:Dedicated API は「仕様が厳密でエラーが素直」。
だからこそ 上限/必須値(maxItems / name長 / service principal / env secret)を最初に固定するのが最短です。


この記事でわかること

  • maxItems必須かつ 上限 30 の罠
  • Cluster / ASG / LB / App の 名前は 20 文字以内
  • Service Principal がないと 500 で詰むケース
  • envsecret フィールド必須の落とし穴
  • TimeoutSecondsバリデーションで落ちる条件

1) maxItems が必須&上限 30(ListClusters が即死する)

発生エラー

HTTP 400 Bad Request: {"error_message":"operation ListClusters: decode params: query: \"maxItems\" not set"}
HTTP 400 Bad Request: {"error_message":"operation ListClusters: decode params: query: \"maxItems\": int: value 100 greater than 30"}

原因

  • ListClusters では maxItems必須
  • さらに値は 30 が上限(31以上は 400)

対策(結論)

  • 必ず maxItems=30 を付与する

GET /clusters?maxItems=30

2) 名前の文字数制限(<= 20)|Cluster/ASG/LB/App 全部に効く

発生エラー(代表)

HTTP 400 Bad Request: {"error_message":"operation CreateCluster: decode request: validate: invalid: name (string: len 24 greater than maximum 20)"}
HTTP 400 Bad Request: {"error_message":"operation CreateAutoScalingGroup: decode request: validate: invalid: name (string: len 23 greater than maximum 20)"}
HTTP 400 Bad Request: {"error_message":"operation CreateLoadBalancer: decode request: validate: invalid: name (string: len 22 greater than maximum 20)"}

原因

  • name フィールドが 20文字制限
  • Cluster / AutoScalingGroup / LoadBalancer / Application あたりで横断的に引っかかる

対策(結論)

  • 命名ルールを最初から 20 文字以内に固定する

再発防止Tips(おすすめ命名パターン)

  • proj-env-role を短縮する
    例:ss-prd-fe / ss-prd-be / ss-stg-fe
  • suffix を短縮:frontendfebackendbeproductionprd

命名は「後で直す」が一番コスト高いので、最初に縛るのが正義。


3) Service Principal 必須|無いと 500 で止まることがある

発生エラー

HTTP 500 Internal Server Error: {"status":500,"title":"failed to register cluster service principal"}
[apprun-dedicated] service principal id is missing or placeholder

原因

  • クラスタ登録時に Service Principal が必要
  • 未設定 or プレースホルダだと 内部登録に失敗して 500 になることがある

対策(結論)

  • IAM で Service Principal ID を発行
  • 環境変数や設定値に 明示的にセットする(暗黙期待しない)

4) env に secret フィールド必須|「secret://」でも自動ではない

発生エラー

HTTP 400 Bad Request: {"error_message":"operation CreateApplicationVersion: decode request: decode application/json: decode CreateApplicationVersion: callback: decode field \"env\": callback: invalid: secret (field required)"}

原因

  • env を送る場合、各項目に secret必須フィールド
  • secret:// を使っていても、API 側が secret を推論しないケースがある

対策(結論)

  • env を送信するなら 必ず secret を明示
  • ルール:secret:// を含む値は secret=true にする(クライアント側で)

例(イメージ)

{
  "env": [
    { "key": "DB_PASSWORD", "value": "secret://xxx", "secret": true },
    { "key": "APP_ENV", "value": "production", "secret": false }
  ]
}

5) TimeoutSeconds バリデーション|許容値以外は 400

発生エラー

code: 400, message: Validation Error, inner_error: {domain: global, reason: application invalid field, message: invalid TimeoutSeconds, location_type: body, location: TimeoutSeconds}

原因

  • TimeoutSeconds許容される値が固定(範囲/候補がある)
  • 想定外の値だと “invalid TimeoutSeconds” で 400

対策(結論)

  • AppRun 側で許容される値のみをセットする
  • 実装上は「入力値をそのまま投げる」のではなく、**バリデーション(許容リスト or 範囲チェック)**を入れる

まとめ|Dedicated API は「仕様の前提をコードに埋める」と安定する

AppRun Dedicated API は、
必須パラメータと**制約(上限・文字数・必須フィールド)**を外すと素直に落ちます。

  • maxItems=30 を必ず付ける(必須&上限30)
  • name は 20 文字以内(Cluster/ASG/LB/App)
  • Service Principal を必ず用意して明示
  • env は secret 必須(自動推論に頼らない)
  • TimeoutSeconds は許容値のみ

一度踏むと二度と踏まない系のエラーなので、**「制約を設定にする」より「制約をコードに固定」**した方が早いです。


FAQ

Q. なぜ maxItems は必須なんですか?

A. ListClusters のクエリパラメータとして必須扱いになっており、未指定は decode 段階で弾かれます(400)。

Q. “name 20文字制限” はどこに効きますか?

A. Cluster / AutoScalingGroup / LoadBalancer / Application など、複数リソースにまたがって効きます。命名規約を短縮前提にするのがおすすめです。

Q. secret:// を使ってるのに secret が必須なのはなぜ?

A. API デコード時に secret フィールドが required 扱いのため、値から推論されません。クライアント側で secret=true/false を必ず付ける必要があります。

記事をシェアする