AWS API GatewayにインポートするSwaggerではパスパラメータはメソッド毎に定義するべき

AWS APIGateway の REST API で生成した JavaScript SDK で、パスパラメータ付きのメソッド呼び出しが失敗していました。API は コンソールで Swagger のYaml をインポートしていましたが、その定義が良くなかったようです。

//APIクライアント生成
const api = apigClientFactory.newClient({
    "apiKey": "XXXXXX...",});

// GET <endpoint>/data/{id} を呼び出す
const response = await api.dataIdGet(
    {id:"xxx"}, {});
    // GET <endpoint>/data が呼び出されてしまう

直接 SDKのソースを見ると、このメソッドのリソースパスを生成する箇所で、明らかにパスパラメータが展開されていませんでした。

parseParametersToObjectの第2引数が空の配列になっている(以下のここが空っぽのコメント部)ため、GET /data/ を実行してしまう。

apiGateway-js-sdk/apigClient.js:

apigClient.dataIdGet = function (params, body,
    additionalParams)
{
  if(additionalParams === undefined) {
      additionalParams = {};
  }
  apiGateway.core.utils
    .assertParametersDefined(params, [], ['body']);
  var dataIdGetRequest = {
    verb: 'get'.toUpperCase(),
    path: pathComponent + uritemplate('/data/{id}')
      .expand(apiGateway.core.utils
      .parseParametersToObject(params, [ ])),
                           //ここが空っぽ ↑
    headers: apiGateway.core.utils
      .parseParametersToObject(params, []),
    queryParams: apiGateway.core.utils
      .parseParametersToObject(params, []),
    body: body
  };
  return apiGatewayClient.makeRequest(
    dataIdGetRequest, authType,
    additionalParams, config.apiKey);
};

とりあえずこの配列にパスパラメータ名 "id" を入れてやれば正しく呼び出せるようになりました(以下)。

  var dataIdGetRequest = {
    verb: 'get'.toUpperCase(),
    path: pathComponent + uritemplate('/data/{id}')
      .expand(apiGateway.core.utils
      .parseParametersToObject(params, ['id'])),
                     //パスパラメータ名を定義↑

しかしこれでは根本的に解決しません。SDKが更新されるたびに編集しなおすなんてやってられませんからね。

で、調べてみると、パスパラメータをリソース/data/{id}に対して定義していたのがいけなかったと判明しました。Swagger的には問題ないはずなのですが、API Gatewayにインポートする場合、「パスパラメータはメソッドに対して定義する必要がある」ようです。

どちらの場合でも、API Gateway のコンソールではパスパラメータとして認識されていますが、デプロイ済みのAPIで生成するJavaScriptのSDKでは違いが出るみたいです(他言語のSDKでどうなっているのかは不明)。もしかするとAWS側のバグなのかもしれません。