4.3. カスタム 3scale APIcast ポリシー
APIcast の動作を変更するためのカスタムポリシーを設定します。まず、カスタムポリシーを含む APIcast ポリシーを設定するポリシーチェーンを定義し、続いてポリシーチェーンを APIcast に追加します。
Red Hat 3scale でカスタムポリシーを追加することは可能ですが、そのカスタムポリシーはサポートの対象ではありません。
APIcast のカスタムポリシーは、3scale デプロイメントの設定によって異なります。
- インストールした OpenShift およびコンテナー環境の APIcast 等の Self-managed APIcast デプロイメントに、カスタムポリシーを追加します。
- カスタムポリシーを Hosted APIcast に追加することはできません。
決して、実稼働環境のゲートウェイで直接ポリシーを変更しないでください。変更を必ずテストしてください。
4.3.1. 3scale APIcast デプロイメントのカスタムポリシーについて リンクのコピーリンクがクリップボードにコピーされました!
カスタム APIcast ポリシーを新規に作成することや、標準ポリシーを変更することができます。
カスタムポリシーを作成するには、以下の点を理解している必要があります。
- ポリシーは Lua で記述される。
- ポリシーは適切なファイルディレクトリーに保管しなければならない。
- ポリシーチェーン内での設定場所により、ポリシーの動作が異なる。
- カスタムポリシーを追加するインターフェイスは完全にサポートされているが、カスタムポリシー自体はサポートされていない。
4.3.2. 3scale Embedded APIcast へのカスタムポリシーの追加 リンクのコピーリンクがクリップボードにコピーされました!
オンプレミスデプロイメントにカスタム APIcast ポリシーを追加するには、カスタムポリシーが含まれる OpenShift イメージをビルドし、それをデプロイメントに追加する必要があります。3scale では、サンプルリポジトリーを提供しています。このリポジトリーを、カスタムポリシーを作成してオンプレミスデプロイメントに追加するためのフレームワークとして使用することができます。
このサンプルリポジトリーには、カスタムポリシー用の正しいディレクトリー構造に加えて、イメージストリームを作成するテンプレート、および作成するカスタムポリシーが含まれる新しい APIcast OpenShift イメージをビルドするための BuildConfigs が含まれています。
apicast-custom-policies をビルドすると、ビルドプロセスは新しいイメージを amp-apicast:latest タグにプッシュします。このイメージストリームでイメージが変更されると、デフォルトでは apicast-staging および apicast-production タグの両方が自動的に新しいデプロイメントを開始するように設定されています。ステージング環境または実稼働環境のサービスが中断されるのを避けるためには、Automatically start a new deployment when the image changesチェックボックスの選択を解除して、自動デプロイメントを無効にします。あるいは、実稼働環境用に別のイメージストリームタグ (例: amp-apicast:production) を設定します。
手順
Creating a registry service accountで作成したクレデンシャルを使用して、
docker-registryシークレットを作成します。その際に、以下の点に留意してください。-
your-registry-service-account-usernameを 12345678|username のフォーマットで作成したユーザー名に置き換えてください。 -
your-registry-service-account-passwordを Token Information タブでユーザー名の下に表示されるパスワードの文字列に置き換えてください。 イメージストリームが存在し registry.redhat.io を使用するすべての新規
namespaceについて、docker-registryシークレットを作成します。以下のコマンドを実行して
docker-registryシークレットを作成します。oc create secret docker-registry threescale-registry-auth \ --docker-server=registry.redhat.io \ --docker-username="your-registry-service-account-username" \ --docker-password="your-registry-service-account-password"
oc create secret docker-registry threescale-registry-auth \ --docker-server=registry.redhat.io \ --docker-username="your-registry-service-account-username" \ --docker-password="your-registry-service-account-password"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
- ポリシーの例が含まれる公開リポジトリー をフォークするか、そのコンテンツが含まれるプライベートリポジトリーを作成します。OpenShift がイメージをビルドするには、Git リポジトリーでカスタムポリシーのコードが必要です。プライベート Git リポジトリーを使用するには、OpenShift でシークレットを設定する必要がある点に注意してください。
- リポジトリーをローカルにクローンし、ポリシーの実装を追加し、変更をご自分の Git リポジトリーにプッシュします。
openshift.ymlテンプレートを更新します。具体的には、以下のパラメーターを変更します。-
spec.source.git.uri: https://github.com/3scale/apicast-example-policy.git(ポリシーの BuildConfig): ご自分の Git リポジトリーの場所に変更します。 -
spec.source.images[0].paths.sourcePath: /opt/app-root/policies/example(カスタムポリシーの BuildConfig):exampleをリポジトリーのpoliciesディレクトリーに追加したカスタムポリシーの名前に変更します。 -
オプションで、OpenShift オブジェクト名およびイメージタグを更新します。ただし、変更の一貫性が維持されるようにする必要があります。例:
apicast-example-policyBuildConfig がapicast-policy:exampleイメージをビルドおよびプッシュし、それをapicast-custom-policiesBuildConfig がソースとして使用する。これによりダグの一貫性が維持されます。
-
以下のコマンドを実行して OpenShift オブジェクトを作成します。
oc new-app -f openshift.yml --param AMP_RELEASE=2.13
oc new-app -f openshift.yml --param AMP_RELEASE=2.13Copy to Clipboard Copied! Toggle word wrap Toggle overflow ビルドが自動的に開始されない場合には、以下の 2 つのコマンドを実行します。
apicast-example-policyを変更している場合には、ご自分の BuildConfig 名に置き換えます (例:apicast-<name>-policy)。最初のコマンドが完了するのを待ってから、2 番目のコマンドを実行してください。oc start-build apicast-example-policy oc start-build apicast-custom-policies
oc start-build apicast-example-policy oc start-build apicast-custom-policiesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Embedded APIcast のイメージに
amp-apicast:latestイメージストリームの変更を追跡するトリガーがある場合には、APIcast の新しいデプロイメントが開始されます。apicast-stagingが再開されたら Integration > Policies の順に移動し、Add Policy ボタンをクリックしてご自分のカスタムポリシーがリストに表示されるのを確認します。カスタムポリシーを選択して設定したら、Update Policy Chain をクリックし、カスタムポリシーをステージング APIcast で動作状態にします。
4.3.3. 別の OpenShift Container Platform 上の 3scale へのカスタムポリシーの追加 リンクのコピーリンクがクリップボードにコピーされました!
カスタムポリシーを OpenShift Container Platform (OCP) 上の APIcast に追加することができます。そのためには、ご自分のカスタムポリシーが含まれる APIcast イメージを 統合 OpenShift Container Platform レジストリー から取得します。
手順
- Embedded APIcast にポリシーを追加します。
- APIcast ゲートウェイをメインの OpenShift クラスターにデプロイしていない場合には、メインの OpenShift クラスター上の内部レジストリーへの アクセスを確立します。
- 3scale 2.13 APIcast OpenShift テンプレートを ダウンロードします。
テンプレートを変更するには、デフォルトの
imageディレクトリーを内部レジストリーの完全なイメージ名に置き換えます。image: <registry>/<project>/amp-apicast:latest
image: <registry>/<project>/amp-apicast:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow カスタマイズしたイメージを指定し、OpenShift テンプレートを使用して APIcast をデプロイします。
oc new-app -f customizedApicast.yml
oc new-app -f customizedApicast.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
カスタムポリシーが APIcast に追加されて新しいイメージがビルドされ、そのイメージを使用して APIcast がデプロイされると、管理ポータルではそれらのポリシーが利用可能なポリシーとして自動的に表示されます。既存のサービスはこの新しいポリシーを利用可能なポリシーリストで認識できるので、任意のポリシーチェーンで使用することができます。
カスタムポリシーがイメージから削除され、APIcast が再起動されると、そのポリシーはリスト上で利用可能なポリシーとは表示されなくなるので、ポリシーチェーンに追加することができなくなります。
4.3.4. 3scale カスタムポリシーへの外部 Lua 依存関係の追加 リンクのコピーリンクがクリップボードにコピーされました!
外部の Lua 依存関係をカスタムポリシーに追加して、APIcast がまだ 3scale イメージにない Lua ライブラリーを使用できるようにすることができます。
以下の手順では、レスポンスボディーを JSON から XML に変換するカスタムポリシーの例 を使用して、この作業を行う方法を説明します。カスタムポリシーの例には、Lua で書かれた xml2lua XML パーサーが必要です。完全な例は、ビルドおよびテストを簡潔に示していますが、サンプル手順のみに従ってカスタムポリシーをデプロイすることはできません。外部の Lua 依存関係を持つカスタムポリシーをデプロイするには、この手順と共に 別の OpenShift Container Platform 上の 3scale へのカスタムポリシーの追加 の手順を実施する必要があります。
JSON to XML カスタムポリシーは、例としてのみ提示しています。実稼働環境で使用するためのものではありません。
前提条件
- 3scale カスタムポリシー
- 外部 Lua ライブラリーへのアクセス
手順
カスタムポリシーが含まれるディレクトリーに、外部 Lua ライブラリーを識別するファイルを追加します。
ファイルの名前は
Roverfileである必要があります。JSON to XMLカスタムポリシーの例では、Roverfileの内容は以下のようになります。luarocks { group 'production' { module { 'xml2lua' }, } }luarocks { group 'production' { module { 'xml2lua' }, } }Copy to Clipboard Copied! Toggle word wrap Toggle overflow lua-roverは、LuaRocks に関するラッパーです。lua-roverは、依存関係の推移ロックを提供します。LuaRocks は、Lua モジュールのパッケージマネージャーです。カスタムポリシーが含まれるディレクトリーに、
lua-roverロックファイルを追加します。ファイルの名前は
Roverfile.lockである必要があります。JSON to XMLカスタムポリシーの例では、Roverfile.lockの内容は以下のようになります。xml2lua 1.5-2||productionbash-4.4
xml2lua 1.5-2||productionbash-4.4Copy to Clipboard Copied! Toggle word wrap Toggle overflow RoverfileおよびRoverfile.lockを併用することで、APIcast または 3scale operator が依存関係ライブラリーをフェッチできます。カスタムポリシーを定義するファイルで、Lua 依存関係を指定する行を追加します。
JSON to XMLカスタムポリシーの例では、以下の行を指定します。local xml2lua = require("xml2lua")local xml2lua = require("xml2lua")Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムポリシーの構築に使用する Dockerfile で、
RoverfileおよびRoverfile.lockをコピーし、rover installを実行します。JSON to XMLカスタムポリシーの例では、以下の行を Dockerfile に追加します。COPY Roverfile . COPY Roverfile.lock . RUN rover install --roverfile=/opt/app-root/src/Roverfile
COPY Roverfile . COPY Roverfile.lock . RUN rover install --roverfile=/opt/app-root/src/RoverfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow Dockerfile は、APIcast または 3scale operator を使用してポリシーをビルドすることができます。
カスタムポリシーの
Makefileで、他のカスタムポリシーと同様にbuildターゲットを指定します。たとえば、
buildターゲットは以下のようになります。TARGET_IMAGE="apicast/json_to_xml:latest" # IP="http://localhost:8080" build: docker build . --build-arg IMAGE=registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.13 -t $(TARGET_IMAGE)
TARGET_IMAGE="apicast/json_to_xml:latest" # IP="http://localhost:8080" build: docker build . --build-arg IMAGE=registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.13 -t $(TARGET_IMAGE)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
外部 Lua 依存関係を持つカスタムポリシーをデプロイする残りの手順は、他のカスタムポリシーのデプロイと同じです。つまり、イメージをリポジトリーにプッシュし、APIcast イメージをビルドしたばかりのイメージに置き換える必要があります。
関連情報