GAEで公開したAPIのURLをサブディレクトリでバージョン分けする
公開日: 2019.9.11
アプリなどのAPIをGoogle App Engine(GAE)で公開する際に、将来的にバージョン分けしておいたほうが安心です。GAEなら設定ファイルを書くだけで簡単にバージョン分けができます。
サンプルの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倍になってしまうところでしょうか。(無料枠を超えてしまう可能性が高いですね)
複数アプリを複数ドメインで運用するケースはこちらをどうぞ。
Google App Engine(GAE)でプロジェクト内に複数アプリを複数ドメインで運用する
Google Cloud Platformのサーバーレスサービス・GAE(Google App Engine)の「サービス」機能を使って、1プロジェクトで複数アプリを複数ドメインで運用する方法をまとめました。
価格は記載がある場合を除き、すべて税込みです。
関連キーワード
サーバレスの新着記事
- サーバレスCloudflare R2の料金体系・無料枠まとめ 2024.8.21
- サーバレスCloudflare R2をCyberduckで使う方法 2024.7.31
- サーバレスAIの学習ボット・クローラーからサイトを守るメリットとブロックする方法 2024.7.19
- サーバレスCloudFlare Pagesのビルド環境の違い 2024.5.9
- サーバレスCloudflare D1の料金体系・無料枠まとめ 2024.3.25
- サーバレスCloudflare PagesでNuxt3のビルド時に「ENOENT: no such file or directory」エラーの対象方法 2024.3.21
- サーバレスGitlab CLIでpush時に「glab auth not found」となった際の対処方法 2024.3.19
- サーバレスCloudFlare Workers AIの料金体系・無料枠まとめ 2024.2.2