Heroku AppLinkで特定のAPIはサービスメッシュをバイパスしたい
Heroku AppLinkを導入すると、Heroku Routerからやってくるリクエストを全てサービスメッシュが一旦受け取って、認証チェックを行う。
構築しているHerokuアプリケーションが、Salesforceからのリクエストのみを受け付けるもの、という前提があるならそれで問題ない。
しかし、特定のAPIは別のWebサービスからのリクエストを処理したい...という場合には非常に困るのである。
例えば、一般公開しているECサイトの商品データを返すAPIと、Salesforceからしか受け付けないAPIを、1つのアプリケーションに同居させたい場合がこれにあたる。
一般公開しているECサイトは、当然ながらSalesforceの認証情報なんぞ持っていない。したがって、そんなサイトからのリクエストはサービスメッシュが拒否してしまい、サイトに商品データを表示することができなくなる。
こんな場合、Herokuアプリケーション側で特定のURLパターンではサービスメッシュをバイパスするよう設定することができる(ようになった)。
1. バイパス用の設定ファイルを設置する
Herokuアプリケーションのrootディレクトリに、heroku-applink-service-mesh.yaml
というファイル名で、以下のようなyamlファイルを用意する。
※ファイル名が違うと設定が読み込まれない
バイパスしたいURLパターンや、URLを列挙しておく。
mesh:
authentication:
bypassRoutes:
- "/app/**"
- "/admin/**"
- "/auth/**"
- "/box/**"
- "/salesforce/**"
- "/store/**"
- "/custom/**"
- "/hooks/**"
- "/favicon.ico"
- "/robots.txt"
2. 環境変数を定義する
HEROKU_APPLINK_SERVICE_MESH_ACKNOWLEDGE_RISK_BYPASS
という名前の環境変数を用意して、 true
をセットする。
バイパスするリスクは認識していることを明示する...という具合だ。
上記の設定が完了してHerokuアプリケーションを起動すると、以下のようなログが出力される。
xxx xx 00:00:00 (heroku app name) app/web.1 level=WARN msg="Authentication bypass routes: /app/**, /admin/**, /auth/**, /box/**, /salesforce/**, /store/**, /custom/**, /hooks/**, /favicon.ico, /robots.txt" app=(heroku app name) source=heroku-applink-service-mesh
そして、バイパスに設定したAPIへのリクエストがあると、以下のようなログが出力され、確かにサービスメッシュの処理がスキップされる。
xxx 00 00:00:00 (heroku app name) app/web.1 level=INFO msg="Processing request to /store/product-categories..." app=(heroku app name) source=heroku-applink-service-mesh request-id=d85d442d-4216-1b1d-9916-312219e76156
xxx 00 00:00:00 (heroku app name) app/web.1 level=WARN msg="Bypassing validation and authentication for route /store/product-categories" app=(heroku app name) source=heroku-applink-service-mesh request-id=d85d442d-4216-1b1d-9916-312219e76156
xxx 00 00:00:00 (heroku app name) app/web.1 level=INFO msg="Forwarding request..." app=(heroku app name) source=heroku-applink-service-mesh request-id=d85d442d-4216-1b1d-9916-312219e76156
もちろん、1つのHerokuアプリケーションに同居させなければ、バイパス設定は不要になるが、もし!どうしても!同居させたい場合にはこういう裏技的な設定が必要になる。
ご利用は計画的に。