第6章 Fuse のポリシーエクステンションを使用した 3scale メッセージコンテンツの変換

Red Hat Fuse を使用して、Red Hat 3scale API Management 用の非常に柔軟なポリシーエクステンションを作成することができます。そのためには、Fuse on OpenShift でポリシーエクステンションを作成し、それらを 3scale 管理ポータルでポリシーとして設定します。APIcast Camel プロキシーポリシーを使用して、リクエストおよびレスポンスのメッセージコンテンツの複雑な変換を実施することができます (例: XML から JSON への変換)。この変換は、Apache Camel インテグレーションのフレームワークに実装されます。

さらに、静的な APIcast コンテナーイメージを再ビルドして再デプロイする代わりに、Camel でカスタムポリシーエクステンションを動的に追加または変更することができます。Camel Domain Specific Language (DSL) で書かれた任意の Camel Enterprise Integration Pattern (EIP) を使用して、APIcast ポリシーエクステンションを実装することができます。これにより、Java や XML 等の使い慣れたプログラミング言語を使用して、ポリシーエクステンションを作成することができます。本トピックの例では、Camel Netty4 HTTP コンポーネントを使用して、HTTP プロキシーを Java で実装しています。

注記

3scale API バックエンドですでに Fuse Camel アプリケーションを使用している場合は、この機能は必要ありません。この場合は、既存の Fuse Camel アプリケーションを使用して変換を実施することができます。

必要なソフトウェアコンポーネント

以下の Red Hat Integration コンポーネントを同じ OpenShift クラスターにデプロイしている必要があります。

  • Fuse on OpenShift 7.10
  • オンプレミス型 3scale 2.11
  • Embedded APIcast (ステージングおよび実稼働環境用のデフォルトゲートウェイ)、または Self-managed APIcast

カスタム Fuse ポリシーを 3scale とは別の OpenShift プロジェクトにデプロイすることができますが、これは必須の要件ではありません。ただし、両プロジェクト間で通信ができるようにしてください。詳細については、『Networking』の「Configuring network policy with OpenShift SDN」を参照してください。

6.1. APIcast と Fuse の Apache Camel による変換のインテグレーション

APIcast と Fuse on OpenShift で Apache Camel アプリケーションとして記述された変換を統合することができます。ポリシーエクステンションによる変換が 3scale に設定およびデプロイされると、3scale トラフィックは Camel ポリシーエクステンションを通過し、メッセージのコンテンツが変換されます。この場合、Camel はリバース HTTP プロキシーとして機能し、APIcast は Camel に 3scale トラフィックを送信し、Camel がそのトラフィックを API バックエンドに送信します。

本トピックの例では、Camel Netty4 HTTP コンポーネントを使用して HTTP プロキシーを作成しています。

  • HTTP プロキシープロトコルを通じて受け取ったリクエストは、HTTP ボディーが大文字に変換されて目的のサービスに転送されます。
  • 目的のサービスからのレスポンスは大文字への変換処理を受け、続いてクライアントに戻されます。
  • 以下の例で、HTTP および HTTPS のユースケースに必要な設定を説明します。

前提条件

  • Fuse on OpenShift 7.10 および 3scale 2.11 を、同じ OpenShift クラスターにデプロイしている必要があります。インストールの詳細については、以下のドキュメントを参照してください。

  • Fuse on OpenShift および 3scale をインストールしてプロジェクトを作成するには、クラスターの管理者権限が必要です。ただし、プロジェクトごとの編集アクセス権限で、デプロイ設定の作成、Pod のデプロイ、およびサービスの作成が可能です。

手順

  1. Camel netty4-http コンポーネントを使用して Java で Apache Camel アプリケーションを作成し、HTTP プロキシーを実装します。これにより、任意の Camel コンポーネントを使用して、メッセージを変換することができます。

    以下に示す簡単な例では、リクエストおよびサービスからのレスポンスを大文字に変換します。

    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.Locale;
    
    import org.apache.camel.Exchange;
    import org.apache.camel.Message;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.model.RouteDefinition;
    
    public class ProxyRoute extends RouteBuilder {
    
        @Override
        public void configure() throws Exception {
            final RouteDefinition from;
            if (Files.exists(keystorePath())) {
                from = from("netty4-http:proxy://0.0.0.0:8443?ssl=true&keyStoreFile=/tls/keystore.jks&passphrase=changeit&trustStoreFile=/tls/keystore.jks"); 1
            } else {
                from = from("netty4-http:proxy://0.0.0.0:8080");
            }
    
            from
                .process(ProxyRoute::uppercase)
                .toD("netty4-http:"
                    + "${headers." + Exchange.HTTP_SCHEME + "}://" 2
                    + "${headers." + Exchange.HTTP_HOST + "}:"
                    + "${headers." + Exchange.HTTP_PORT + "}"
                    + "${headers." + Exchange.HTTP_PATH + "}")
                .process(ProxyRoute::uppercase);
        }
    
        Path keystorePath() {
            return Path.of("/tls", "keystore.jks");
        }
    
        public static void uppercase(final Exchange exchange) { 3
            final Message message = exchange.getIn();
            final String body = message.getBody(String.class);
            message.setBody(body.toUpperCase(Locale.US));
        }
    
    }
    1
    この簡単な例では、Java キーストアファイルが /tls/keystore.jks にマウントされている場合、リスニングポートは 8443 に設定されます。
    2
    3scale により Camel プロキシーポリシーが呼び出されると、HTTP_SCHEMEHTTP_HOSTHTTP_PORT、および HTTP_PATH ヘッダーの値は、3scale のバックエンド API に設定された値を元に自動的に設定されます。
    3
    この簡単な例では、メッセージの内容が大文字に変換されます。Camel エンタープライズ統合パターンを使用して、リクエストおよびレスポンスメッセージの内容のより複雑な変換を実施することができます (例: XML から JSON への変換)。
  2. Camel アプリケーションを OpenShift にデプロイし、それをサービスとして公開します。詳細は、「Creating and Deploying Applications on Fuse on OpenShift」を参照してください。