サーバレスのサムネイル

サーバレス

GAEで公開したAPIのURLをサブディレクトリでバージョン分けする

公開日: 2019.9.11

アプリなどのAPIをGoogle App Engine(GAE)で公開する際に、将来的にバージョン分けしておいたほうが安心です。GAEなら設定ファイルを書くだけで簡単にバージョン分けができます。

編集ノート:SERVERSUSでは、パートナーリンクからコミッションを得ています。コミッションが記事の意見や、サービスの評価に影響を与えることはありません。

サンプルのAPIの仕様

  • 利用サービス: Google App Engine
  • フレームワーク:Express(Node.js)
  • バージョンごとにサブディレクトリを切る(example.com/v1/など)

設定方法

設定方法は簡単です。GAEではおなじみの設定ファイル「app.yaml」とサービスを設定する「dispatch.yaml」を使います。

大まかな流れ

GAEは1プロジェクトに一つのアプリしか公開できませんので、サービスを分けて使います。

やっていることは、

  • バージョンごとにサービスを分ける
  • dispatch.yamlでサービスのURLを指定して送信ルートを適用する

この二つだけです。簡単ですね。

このあたりは別の記事にまとめてあるので、そちらもどうぞ。

<<別記事>>

実際の設定

それでは、実際に設定してみましょう。

app.yaml

アプリの挙動を決めるapp.yamlは、下記の通りになります。

service: api-v1
runtime: nodejs10

とします。サービス名を指定しておけばOKです。

わかりやすくするために、その他の設定は書いていませんが、ご自身の環境に合わせてその他の設定も書いてください。

設定ができたら、コマンドラインからGAEにデプロイします。

gcloud app deploy

dispatch.yaml

続いて、サービスと送信ルートを決める「dispatch.yaml」を書いていきます。

dispatch:
  - url: "*app.exmaple.com/v1/*"
    service: api-v1
  - url: "*app.exmaple.com/v2/*"
    service: api-v2

v2はわかりやすくするために書いていますが、まだapp.yamlもアプリも用意していないので、実際には動きません。

v2も同時に設定する場合は、アプリを用意して、先ほどとは別のapp.yamlを用意してserviceの部分を「api-v2」にすればOKです。

設定ファイルがかけたら、GAEにデプロイします。

gcloud app deploy dispatch.yaml

これで、「app.exmaple.com/v1/」でアクセスすれば、作成したAPIアプリがGAEで配信され、「app.exmaple.com」にアクセスしても、「Cannot GET /」となってエラーになるはずです。

おまけ

Expressの場合

Node.js製のExpressの場合は、ドキュメントルートという概念がないため、アプリ側のrootを強制的に「/v1/」にすることができません。

なので、ルートの設定で、それぞれ頭にバージョンを入れるようにして対応します。

index.jsのサンプルは下記のようになると思います。

const createError = require('http-errors');
const express = require('express');
const app = express();

// server
const port = process.env.PORT || 3000
app.listen(port, err => {
    if (err) throw err
    console.log(`> Ready On Server http://localhost:${port}`)
});
app.use(express.json());

app.use('/v1', indexRouter);
app.use('/v1/hoge', hogeRouter);

v2のアプリには、ルートの頭にv2を入れればOKです。

GAEで静的ファイルをホスティングしている場合

GAEは静的ファイルのホスティングもできます。

こちらを利用している場合は、サブディレクトリでの公開するために、別途設定が必要です。

こちらもURLに合わせたルートをapp.yaml「handlers」セクションで設定するすればOKです。

service: api-v1
runtime: nodejs10
handlers:
- url: /v1/status.json
  static_files: public/status.json
  upload: public/status.json
  http_headers:
    Access-Control-Allow-Origin: '*'

バージョンでサブディレクトリを切らない場合は、「url: /status.json」でいいのですが、今回はv1以下になるので「url: /v1/status.json」となります。


簡単にですが、GAEで公開したAPIのURLをサブディレクトリでバージョン分けする方法をみてきました。

普通にVPSとかでサーバーを借りて運用していると、意外と面倒なバージョン分けですが、GAEなら設定ファイルだけでできてしまうので驚きますね。

デメリットは、サービスを切るとそれぞれインスタンスが立ち上がってしまうので、両方にアクセスがある場合は、インスタンス使用量が単純に2倍になってしまうところでしょうか。(無料枠を超えてしまう可能性が高いですね)

複数アプリを複数ドメインで運用するケースはこちらをどうぞ。


価格は記載がある場合を除き、すべて税込みです。

関連キーワード

サーバレスの新着記事