Spring Cloud Gateway YAML 設定における記述ルールと典型的なミス事例

微サービスアーキテクチャにおける統一APIゲートウェイとしてSpring Cloud Gatewayを利用する際、ルート設定はYAML形式で記述されることが一般的です。このYAML設定は非常に構造に敏感であり、わずかな書式ミスだけでもサービス起動失敗や設定が反映され不上手などの深刻な問題を引き起こします。以下に、実装中に発生しやすいエラーとその対処方法、ならびにYAMLの厳密な構文規則について整理します。

1. YAML 設定ファイルの基本構造例

以下は、管理者API用のルート設定を定義した正しいYAMLの例です。

routes:
  - id: sl-express-ms-web-manager
    uri: lb://sl-express-ms-web-manager
    predicates:
      - Path=/manager/**
    filters:
      - ManagerToken
      - StripPrefix=1

この構成は、/manager/** へのリクエストを sl-express-ms-web-manager サービスへ負荷分散し、ManagerToken フィルタによる認証チェックを実施、さらにパスの先頭1セグメントを削除するという動作を実現しています。

2. YAML の構文ルールと注意点

(1) インデントは空格のみ、統一性が必須

YAMLでは、階層構造をインデントで表現します。このインデントには絶対にタブ文字を使わず、必ず半角スペースで統一する必要があります。たとえば2つの異なるインデント幅が混在すると、構文解析に失敗します。

正しい記述誤った記述(NG)
routes:
  - id: service-manager
    uri: lb://service-manager
    predicates:
      - Path=/manager/**
routes:
   - id: service-manager
    uri: lb://service-manager  # ← 2文字と4文字の混在で構文誤り

(2) リスト要素には「-」が必要

配列(YAMLではリスト)を記述する際には、各行の先頭で記号「-」を用い、その後に必ず半角スペースを1つ入れる必要があります。これは入れ子のあるルート、述語、フィルタ定義で繰り返し登場します。

正しい例NG例
filters:
  - ManagerToken
  - StripPrefix=1
filters:
  ManagerToken         # ❌ - が抜けています
  -StripPrefix=1       # ❌ 「-」直後のスペースがありません

(3) キーと値の記述形式

ペア形式(マップ)を記述する際には、コロン(:)の直後に半角スペース1つを必須とし、前にはスペースを置かないでください。これはJSONやプロパティファイルとの混在時に特に注意が必要です。

正しい形式誤った形式
predicates:
  - Path=/manager/**
predicates:
  - Path=/manager/**  # ← Pathの後のスペースが欠けている
  - Path : /user/**   # ❌ コロンの直前が不正に空いている

(4) 複数行文字列の記述

特定のフィルタ設定や説明文など、改行を保持したい場合は「|」記号を用います。一方、改行を空白に折りたたみたい場合は「>」を用います。ただし実際のルート設定にはそこまで複雑な文字列は多くありません。

# 式展開する必要がない文字列を保持
description: |
  manager パス以下の呼び出しには、
  ManagerToken フィルタによる
  認証が必須です。

(5) 特殊文字のエスケープ処理

コロン(:)、ハッシュ記号(#)といったYAML構文で意味を持つ記号をリテラルとして使う場合は、その値を二重引用符で囲む必要があります。

example:
  pattern: "observe the colon\: here"
  # pattern: observe the colon: here  # ← この場合、行末までがコメント文として扱われる

3. YAML 構文が厳格な理由

YAMLは「Yet Another Markup Language」ではなく、「YAML Ain’t Markup Language」の略であり、人間が読みやすく、簡潔に構造を表現することを目的として設計されています。このため、JSONやXMLと比べて柔軟で直感的である一方で、記号やインデントの誤りに対して極めて非情に反応します。

比較対象YAMLJSON
インデント構文の核
(誤りで解析失敗)
無関係
(自由に空白可)
コメント記法サポート
#
非サポート
拡張型日時・数値・バイナリなど文字列・数値・真偽値・配列・オブジェクトのみ
可読性高い(自然言語に近い)低め(機械眼球視点)

4. 実際によくあるバグの事例

事例①:インデントの不整合

gateway:
  routes:
    - id: user-service
      uri: lb://user-service
      predicates:
       - Path=/user/**    # ← 1文字だけずれたインデント!

事例②:リスト記号の欠如

predicates:
  Path=/api/**
  Method=GET

事例③:誤ったスペースの位置

filters:
  -StripPrefix=1    # コンパイル時に「stray '-'」エラー発生
  URI : lb://xxx    # 結果としてキー名が「URI 「:」」になる

上記のいずれも、構文エラーとしてアプリケーションの起動直後に失敗します。実際の開発では vSCodium や IntelliJ IDEA などのIDEでYAML Linterを有効化しておくことで、未然に防げるミスが多数あります。

タグ: SpringCloudGateway YAML Microservices route-configuration APIGateway

7月27日 16:07 投稿