第5章 ポリシーチェーンと APIcast ネイティブデプロイメントのインテグレーション

ネイティブ APIcast デプロイメントの場合、THREESCALE_CONFIG_FILE 環境変数を使用して設定ファイルを指定することにより、カスタムポリシーチェーン を統合することができます。以下の例では、設定ファイル example.json を指定しています。

THREESCALE_CONFIG_FILE=example.json bin/apicast

5.1. ポリシーでの変数およびフィルターの使用

一部の「APIcast 標準ポリシー」では Liquid テンプレートがサポートされます。Liquid テンプレートにより、通常の文字列値だけでなくリクエストのコンテキストに存在する変数も使用することができます。

コンテキスト変数を使用するには、その名前を {{ および }} で囲みます (例: {{ uri }})。変数がオブジェクトの場合には、その属性にもアクセスすることができます (例: {{ somevar.attr }})。

すべてのポリシーで使用することのできる標準の変数を以下に示します。

  • uri: クエリーパラメーターを除外したリクエストのパス。組み込まれた NGINX 変数 $uri の値
  • host: リクエストのホスト (組み込まれた NGINX 変数 $host の値)
  • remote_addr: クライアントの IP アドレスト (組み込まれた NGINX 変数 $remote_addr の値)
  • headers: リクエストヘッダーが含まれるオブジェクト。特定のヘッダーの値を取得するには、{{headers['Some-Header']}} を使用します。
  • http_method: リクエストのメソッド (GET、POST 等)

これらの標準変数はリクエストのコンテキストで使用されますが、ポリシーではコンテキストにさらに変数を追加することができます。なお、ここで使われるフェーズとは、APIcast のすべての実行ステップを指します。以下に示す状況では、ポリシーチェーンのすべてのポリシーで変数を使用することができます。

  • 同一フェーズ内 (ポリシーで変数が追加され、追加後に次のポリシーで使用される)。
  • 次フェースで (あるフェーズで変数が追加され、その変数が次のフェーズで使用される)。

標準の 3scale APIcast ポリシーでコンテキストに追加される変数の例を以下に示します。

  • jwt: 解析された JWT トークンの JSON ペイロード (OpenID Connect 認証用)
  • credentials: アプリケーションのクレデンシャルを保持するオブジェクト。たとえば "app_id": "972f7b4f""user_key": "13b668c4d1e10eaebaa5144b4749713f" 等。
  • service: 現在のリクエストが処理されるサービスの設定を保持するオブジェクト。たとえば、サービス ID は {{ service.id }} として利用可能です。

コンテキストで使用することのできるオブジェクトおよび値の完全なリストは、「Liquid Context Debug」を参照してください。

変数は Liquid テンプレートの機能を活用して使用されます。たとえば {{ remote_addr }}{{ headers['Some-Header'] }}{{ jwt.aud }} 等。値に変数をサポートするポリシーは、_type 接尾辞が付く特殊なパラメーターを持ちます (例: value_typename_type 等)。このパラメーターには、2 つの値を設定することができます (プレーンテキストの場合の plain および liquid テンプレートの場合の liquid)。

APIcast では、変数の値に適用することのできる Liquid フィルターもサポートされます。フィルターは Liquid 変数の値に NGINX 関数を適用します。

フィルターは変数出力タグ {{ }} で囲み、変数の名前または実際の値、パイプ記号 |、およびフィルター名の順に定義します。以下に例を示します。

  • {{ 'username:password' | encode_base64 }} (ここで username:password が変数)
  • {{ uri | escape_uri }}

パラメーターを必要としないフィルターもあります。この場合には、変数の代わりに空の文字列を使用することができます。たとえば、{{ '' | utctime }} は現在の時刻を TUC タイムゾーンで返します。

フィルターは、{{ variable | function1 | function2 }} のようにつなげることができます。たとえば {{ '' | utctime | escape_uri }}

利用可能な関数のリストを以下に示します。