第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 のデプロイ、およびサービスの作成が可能です。
手順
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_SCHEME
、HTTP_HOST
、HTTP_PORT
、およびHTTP_PATH
ヘッダーの値は、3scale のバックエンド API に設定された値を元に自動的に設定されます。 - 3
- この簡単な例では、メッセージの内容が大文字に変換されます。Camel エンタープライズ統合パターンを使用して、リクエストおよびレスポンスメッセージの内容のより複雑な変換を実施することができます (例: XML から JSON への変換)。
- Camel アプリケーションを OpenShift にデプロイし、それをサービスとして公開します。詳細は、「Creating and Deploying Applications on Fuse on OpenShift」を参照してください。