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"
-
- ポリシーの例が含まれる公開リポジトリー をフォークするか、そのコンテンツが含まれるプライベートリポジトリーを作成します。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-policy
BuildConfig がapicast-policy:example
イメージをビルドおよびプッシュし、それをapicast-custom-policies
BuildConfig がソースとして使用する。これによりダグの一貫性が維持されます。
-
以下のコマンドを実行して OpenShift オブジェクトを作成します。
oc new-app -f openshift.yml --param AMP_RELEASE=2.13
ビルドが自動的に開始されない場合には、以下の 2 つのコマンドを実行します。
apicast-example-policy
を変更している場合には、ご自分の BuildConfig 名に置き換えます (例:apicast-<name>-policy
)。最初のコマンドが完了するのを待ってから、2 番目のコマンドを実行してください。oc start-build apicast-example-policy oc start-build apicast-custom-policies
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
カスタマイズしたイメージを指定し、OpenShift テンプレートを使用して APIcast をデプロイします。
oc new-app -f customizedApicast.yml
カスタムポリシーが 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' }, } }
lua-rover
は、LuaRocks に関するラッパーです。lua-rover
は、依存関係の推移ロックを提供します。LuaRocks は、Lua モジュールのパッケージマネージャーです。カスタムポリシーが含まれるディレクトリーに、
lua-rover
ロックファイルを追加します。ファイルの名前は
Roverfile.lock
である必要があります。JSON to XML
カスタムポリシーの例では、Roverfile.lock
の内容は以下のようになります。xml2lua 1.5-2||productionbash-4.4
Roverfile
およびRoverfile.lock
を併用することで、APIcast または 3scale operator が依存関係ライブラリーをフェッチできます。カスタムポリシーを定義するファイルで、Lua 依存関係を指定する行を追加します。
JSON to XML
カスタムポリシーの例では、以下の行を指定します。local xml2lua = require("xml2lua")
カスタムポリシーの構築に使用する Dockerfile で、
Roverfile
およびRoverfile.lock
をコピーし、rover install
を実行します。JSON to XML
カスタムポリシーの例では、以下の行を Dockerfile に追加します。COPY Roverfile . COPY Roverfile.lock . RUN rover install --roverfile=/opt/app-root/src/Roverfile
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)
次のステップ
外部 Lua 依存関係を持つカスタムポリシーをデプロイする残りの手順は、他のカスタムポリシーのデプロイと同じです。つまり、イメージをリポジトリーにプッシュし、APIcast イメージをビルドしたばかりのイメージに置き換える必要があります。
関連情報