完全OSSになった3scale 2.3の新機能紹介

初版: 2018/10/31
著者: 田畑義之, 株式会社日立製作所 (GitHubアカウント: [@y-tabata](https://github.com/y-tabata))
本記事は、あくまで執筆者の見解であり、所属企業及びRed Hatの公式なドキュメントではありません。

# はじめに
2018年10月5日、Red Hat 3scale API Management (以下、3scale)の[バージョン2.3](https://access.redhat.com/documentation/en-us/red_hat_3scale/2.3/html/release_notes/)がリリースされました。2018年5月31日の2.2のリリースから約4か月ぶりの新バージョンです。
本稿では、3scale 2.3の新機能を紹介します。

# 3scaleとは
3scaleとは、Red Hat主体で開発が進められているAPI管理製品です。
詳細は、前回執筆した記事「[OSSベースのAPI管理製品 3scale 2.2を試してみた](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc)」の「[3scaleとは](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc#3scale%E3%81%A8%E3%81%AF)」をご参照ください。
元々は商用製品だったため、順次OSS化が進められてきましたが、2018年9月19日、ついに[Systemコンポーネント](https://github.com/3scale/porta)がOSS化され、3scaleは完全にOSSとなりました。

# 2.3の新機能
2.3の新機能を紹介します。
2.3では、前回紹介した[ポリシー機能](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc#%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)が大幅に強化されました。
筆者が開発し、3scale 2.2ではテックプレビューであった、流量制御ポリシーおよびトークンイントロスペクションポリシーは、それぞれ[Edge Limiting Policy](https://access.redhat.com/documentation/en-us/red_hat_3scale/2.3/html/deployment_options/apicast_policies#edge_limiting)、[OAuth 2.0 Token Introspection Policy](https://access.redhat.com/documentation/en-us/red_hat_3scale/2.3/html/deployment_options/apicast_policies#token_introspection)として、テックプレビューが取れ、正式サポートされました。
筆者が新しく開発したスコープチェックポリシーも、[RH-SSO/Keycloak Role Check Policy](https://access.redhat.com/documentation/en-us/red_hat_3scale/2.3/html/deployment_options/apicast_policies#rh-sso_keycloak_role_check)として、先の2つと同様、正式サポートされました。
3機能とも、[リリースノート](https://access.redhat.com/documentation/en-us/red_hat_3scale/2.3/html/release_notes/release-notes)で、主要エンハンスポイント(Major Changes)として取り上げられています(機能の詳細は、前回記事の「[ポリシー機能の今後](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc#%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E6%A9%9F%E8%83%BD%E3%81%AE%E4%BB%8A%E5%BE%8C)」を参照)。

その他、2.3で強化されたポリシーとしては下記があります。

-   <u>新しく追加されたポリシー</u>
    -   3scale Batcher Policy<br>
        3scaleは、APIリクエストが来るたびに、3scale Backendに対して都度Authorize & Reportの通信を行いますが、本ポリシーを使うと、複数のAPIリクエストのAuthorize & Reportの通信を一度にまとめて行うことができます。本ポリシーによって、3scale Backendの分析・流量制御機能は厳密さを失いますが、パフォーマンスを向上することができます。<br>
        また、本ポリシーを用いることによって、3scale BackendがダウンしていてもAPIリクエストは適切に受け付けるといった、ロバスト性の高いシステム構成も構築可能になりました。

    -   3scale Referrer Policy<br>
        本ポリシーを用いることで、Refererヘッダを用いたフィルタリングを行うことができます。

    -   Anonymous Access Policy<br>
        本ポリシーを用いることで、認証情報を付与する機能を持っていないレガシーアプリケーションでも、サービスにアクセスできるようになります。<br>
        具体的には、デフォルトのApp IDやApp Keyをポリシーに設定し、その情報を用いて、認証情報を持たないアプリケーションを認証します。

    -   Logging Policy<br>
        本ポリシーを用いることで、アクセスログを出力するかどうかをサービスごとに設定できます。

    -   URL Rewriting with Captures Policy
        マッチングルールとテンプレートを設定し、APIリクエストがマッチングルールに合致した場合に、テンプレートに沿ってURLを書き換えるポリシーです。
        例えば下記のようなルールとテンプレートを設定した場合、

            マッチングルール: "/api/v1/products/{productId}/details"
            テンプレート: "/internal/products/details?id={productId}&extraparam=anyvalue"

        下記のようなAPIリクエストを発行すると、

            https://<apicast>/api/v1/products/123/details?user_key=abc123secret

        下記のようなAPIリクエストに書き換えられます。

            https://<api-backend>/internal/products/details?user_key=abc123secret&extraparam=anyvalue&id=123

-   <u>拡張されたポリシー</u>

    -   Edge Limiting Policy
        前回紹介した[流量制御機能](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc#%E6%B5%81%E9%87%8F%E5%88%B6%E5%BE%A1rate-limit%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)に加えて、条件付きの流量制御がサポートされました。([PR #839](https://github.com/3scale/apicast/pull/839))
        例えば、下記のような条件付きの流量制御が可能になりました。

            - 残高照会メソッドの呼び出しは、100回/分
            - 振込メソッドの呼び出しは、10回/分

    -   Header Modification Policy
        前回[流量制御機能](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc#%E6%B5%81%E9%87%8F%E5%88%B6%E5%BE%A1rate-limit%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)のところでも紹介した、Liquidテンプレートが、Header Modification Policyでもサポートされました。([PR #716](https://github.com/3scale/apicast/pull/716))
        これにより、例えばアクセストークン(jwt)をAPIcastで解析し、解析結果としてユーザ情報やクライアント情報、スコープ等をヘッダとして付与するなど、APIリクエストごとに可変の値をヘッダに付与するユースケースが、非常に簡単に実現できるようになりました。

    -   URL Rewriting Policy
        クエリパラメータの書き換えもサポートされました。([PR #724](https://github.com/3scale/apicast/pull/724))<br>

ポリシー以外にも、下記機能がサポートされました。

-   Keycloak以外のIdPとの連携機能
-   Prometheus Metrics連携機能
-   Proxy環境対応
-   OpenTracing対応

他の新機能の詳細は[リリースノート](https://access.redhat.com/documentation/en-us/red_hat_3scale/2.3/html/release_notes/release-notes)をご参照ください。

# おわりに
本稿では、3scale 2.3の新機能を紹介しました。
ポリシー機能を中心に、多くの機能が追加され、API管理製品として必要な機能セットは一通り揃ってきた印象です。
また、完全にOSSとなったことで、コミュニティの議論も活発化しており、更なるパワーアップが期待できます。