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アプリケーションに同居させなければ、バイパス設定は不要になるが、もし!どうしても!同居させたい場合にはこういう裏技的な設定が必要になる。

ご利用は計画的に。