9. Swagger ベンダ拡張 リファレンス

API Gateway では、Swagger に対してベンダ拡張を行っています。 ベンダ拡張はすべて "x-" で始まる名称となります。

9.1. ベンダ拡張の優先順位

ベンダ拡張は Swagger のトップレベル、Path、Operation の3レベルに個別に指定することができます。 複数指定した場合は、原則後者が優先となります。

以下に例を示します。

swagger: '2.0'
basePath: /hello
x-acl:
  - user1 # トップレベル
paths:
  /sayHello:
    x-acl:
      - user2  # Path レベル
    get:
      operationId: sayHello
      summary: Hello world
      x-acl:
        - user3 # Operation レベル。この例ではこの値が使用される。

ただし、x-proxy については指定した Object の内容がマージされるようになっています。 この場合も、各フィールドについてはトップレベル < Path < Operation の順に、後者が優先されるようにマージされます。

9.2. x-acl

x-acl は、各 API に対するアクセス制御を行います。

x-acl には API を実行可能なユーザID、グループ名の一覧を配列で指定します。 グループ名を指定する場合は先頭に "g:" プレフィクスを付与します。

以下に例を示します。

swagger: '2.0'
basePath: /hello
produces:
  - application/json
paths:
  /sayHello:
    get:
      operationId: sayHello
      summary: Hello world
      x-acl:
        - g:authenticated

9.3. x-proxy

x-proxy にリクエストの proxy に必要な情報を Object 形式で記述します。

proxy の "type" フィールドに proxy の種別を指定します。指定できる値は以下のいずれかです。 省略時は "http" となります。

  • "http" : HTTP Proxy を行う
  • "amqp-publish": RabbitMQ に送信(publish)を行う
  • "amqp-consume": RabbitMQ から受信(consume)を行う

9.3.1. type = http の場合

HTTP Proxy の場合は、x-proxy に以下の値を記述します。

  • uri (必須): Proxy 先の URI。http, https のみ使用可能です。
  • relativePath (オプション): Proxy 先の URI相対パス。"uri" で指定された URI に連結されます。
  • method (必須): HTTP Proxy 時のリクエストメソッド。GET/POST/PUT/DELETE のいずれか。
  • request (オプション): リクエストのマッピング規則
  • response (オプション): レスポンスのマッピング規則

request, response の詳細については、リクエスト・レスポンスマッピング を参照してください。

以下に例を示します。

swagger: '2.0'
basePath: /api1
produces:
  - application/json
x-proxy:
  uri: https://api.example.com
paths:
  /products:
    get:
      x-proxy:
        relativePath: /products
        method: GET
        request:
          headers:
            default: $pass
            mapping:
              Referrer: $drop
              Accept: application/json
          queryParams:
            default: $drop
            mapping:
              token: ${request.queryParams.secret}
              query: $pass
        response:
          body:
            jsonPatch:
              - op: remove
                path: /secret

9.3.2. type = amqp-publish または amqp-consume の場合

RabbitMQ 接続の場合、x-proxy には以下の値を記述します。

  • type (必須): 送信時は amqp-publish を、受信時は amqp-consume を指定します。
  • addrs (必須): RabbitMQ クラスタのホスト/ポート番号の組を指定します。
  • host (必須): RabbitMQ ホストを指定します。
  • port (必須): RabbitMQ ポート番号を指定します。
  • username (必須): RabbitMQ 認証ユーザ名を指定します。
  • password (必須): RabbitMQ 認証パスワードを指定します。
  • vhost (オプション): バーチャルホスト名を指定します。

上記のうち、addrs または host/port のいずれかのみ必須(もう一方はオプション)です。

  • addrs には ["ホスト名:ポート番号", "ホスト名:ポート番号"] のように,ホスト名とポートの組をリストで指定します.
  • addrs ではなく host, port を指定する場合はホストは1台しか指定できません。

送信時(amqp-publish)には以下の値を指定します。

  • exchange (必須): 送信先の Exchange 名を指定します。
  • routingKey (必須): Routing Key を指定します。
  • confirm (オプション): true を指定すると送信時 ack を待ちます。

受信時(amqp-consume)には以下の値を指定します。

  • queue (必須): キュー名を指定します。
  • timeout (オプション): タイムアウト時間をミリ秒で指定します。指定がない場合はポーリングになります。

以下に例を示します。

swagger: '2.0'
basePath: /amqp
x-proxy:
  addrs:
    - rabbitmq1.example.com:5672
    - rabbitmq2.example.com:5672
  username: guest
  password: guest
  vhost: vhost1
paths:
  /publish/{id}:
    post:
      x-proxy:
        type: amqp-publish
        exchange: exchange1
        routingKey: ${request.pathParams.id}
        confirm: false
  /consume/{id}:
    get:
      x-proxy:
        type: amqp-consume
        queue: ${request.pathParams.id}
        timeout: 10000