ADC

変数の構成と使用

最初に変数を作成してから値を割り当てるか、変数に対して実行する操作を指定する必要があります。これらの操作を実行した後は、割り当てをポリシーアクションとして使用できます。

注:一度設定すると、変数の設定を変更またはリセットすることはできません。変数を変更する必要がある場合は、変数とその変数へのすべての参照 (式と代入) を削除する必要があります。その後、変数を新しい設定で再追加したり、参照 (式と代入) を再度追加したりできます。

コマンドラインインターフェイスを使用して変数を設定するには

  1. 変数を作成します。
add ns variable <name> -type <string> [-scope global] [-ifFull ( undef | lru )] [-ifValueTooBig ( undef | truncate )] [-ifNoValue ( undef | init )] [-init <string>] [-expires <positive_integer>] [-comment <string>]
<!--NeedCopy-->

:コマンドパラメータの説明については、マニュアルページ「man add ns variable」を参照してください。

例 1:「my_counter」という名前の ulong 変数を作成し、それを 1 に初期化します。

add ns variable my_counter –type ulong -init 1
<!--NeedCopy-->

例 2:「user_privilege_map」という名前のマップを作成します。マップには、最大長が 15 文字のキーと最大長 10 文字のテキスト値、最大 10000 エントリが含まれます。

add ns variable user_privilege_map -type map(text(15),text(10),10000)
<!--NeedCopy-->

:マップに期限切れでないエントリが 10000 個含まれている場合、新しいキーの割り当てでは、最も使用頻度の低いエントリの 1 つが再使用されます。デフォルトでは、存在しないキーの値を取得しようとする式は、空のテキスト値を初期化します。

値を割り当てるか、変数に対して実行する操作を指定します。これは課題を作成することによって行われます。

add ns assignment <name> -variable <expression> [-set <expression> | -add <expression> | -sub <expression> | -append <expression> | -clear] [-comment <string>]
<!--NeedCopy-->

注:変数は、変数セレクター ($) を使用して参照されます。そのため、 $variable1 はテキスト変数や ulong 変数を参照するのに使われます。同様に、 $variable2 [キー表現] はマップ変数を参照するために使用されます

例 1:「inc_my_counter」という名前の割り当てを定義すると、自動的に「my_counter」変数に 1 が追加されます。

add ns assignment inc_my_counter -variable $my_counter -add 1
<!--NeedCopy-->

例 2:「set_user_privilege」という名前の割り当てを定義して、「user_privilege_map」変数に、「get_user_privilege」HTTP コールアウトによって返される値を含むクライアントの IP アドレスのエントリを追加します。

add ns assignment set_user_privilege -variable $user_privilege_map[client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)
<!--NeedCopy-->

:そのキーのエントリが既に存在する場合、値は置き換えられます。それ以外の場合は、キーと値の新しいエントリが追加されます。以前の user_privilege_map の宣言によると、マップにすでに 10000 個のエントリがある場合、最も使用頻度の低いエントリの 1 つが新しいキーと値に再利用されます。

  1. ポリシー内の変数割り当てを呼び出します。

    マップ変数を操作できる関数は 2 つあります。

    • $name.valueExists(key-expression). キーエクスプレッションで選択されたマップに値がある場合は true を返します。それ以外の場合は false を返します。この関数は、マップエントリが存在する場合は有効期限と LRU 情報を更新しますが、値が存在しない場合は新しいマップエントリを作成しません。

    • $name.valueCount. 変数が現在保持している値の数を返します。これはマップ内のエントリの数です。シングルトン変数の場合、変数が初期化されていない場合は0、そうでない場合は1です。

    例:圧縮ポリシーを使用して 「set_user_privilege」という名前のアサインメントを呼び出します。

add cmp policy set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t).not -resAction set_user_privilege
<!--NeedCopy-->

レスポンス側に HTTP ヘッダーを挿入するユースケース

次の例は、シングルトン変数の例を示しています。

テキスト型のシングルトン変数を追加します。この変数は最大 100 バイトのデータを保持できます。

add ns variable http_req_data -type text(100) -scope transaction
<!--NeedCopy-->

HTTP リクエストデータを変数に保存するために使用される割り当てアクションを追加します。

add ns assignment set_http_req_data -variable $http_req_data -set http.req.body(100)
<!--NeedCopy-->

変数から値を取得する HTTP ヘッダを挿入する書き換えアクションを追加します。

add rewrite action act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")
<!--NeedCopy-->

リクエスト時に評価し、データを保存するための割り当てアクションを実行するリライトポリシーを追加します。このポリシーに該当すると、代入アクションが実行され、データが ns 変数 (http_req_data) に保存されます。

add rewrite policy pol_set_variable true set_http_req_data

bind rewrite global pol_set_variable 10 -type req_dEFAULT
<!--NeedCopy-->

応答時間を評価する書き換えポリシーを追加し、応答に HTTP ヘッダーを追加します。

add rewrite policy pol_ins_header true act_ins_header

bind rewrite global pol_ins_header 10 -type res_dEFAULT
<!--NeedCopy-->

割り当てアクション

NetScalerアプライアンスでは、ポリシールールがtrueと評価されると、ポリシーにバインドされた割り当てアクションがトリガーされます。アクションは変数内の値を更新し、それ以降のポリシー・ルール評価で使用できます。これにより、同じ変数を更新して、同じ機能での今後のポリシー評価に使用できます。以前は、関連する割り当てアクションのポリシーが true と評価された場合、アプライアンスは機能内のすべてのポリシーを評価した後にのみ割り当てアクションを実行していました。そのため、割り当てアクションによって設定された変数値は、その後の機能内のポリシールール評価では使用できません。

この機能は、NetScalerアプライアンス上のクライアントのアクセスリストを制御するユースケースの方がよく理解できます。アクセスの決定は別のウェブサービスによって行われ、リクエストGET /client-access?<client-IP-address>の本文に「BLOCK」または「ALLOW」を含む応答が返されます。HTTP コールアウトは、受信リクエストに関連付けられているクライアントの IP アドレスを含むように設定されます。NetScalerアプライアンスがクライアントから要求を受信すると、アプライアンスはコールアウト要求を生成してコールアウトサーバーに送信します。コールアウトサーバーは、ブラックリストに登録されたIPアドレスのデータベースと、クライアントのIPアドレスがデータベースにリストされているかどうかをチェックするHTTPコールアウトエージェントをホストします。HTTP コールアウトエージェントはコールアウトリクエストを受信し、クライアントの IP アドレスがリストされているかどうかを確認し、応答を送信します。レスポンスは、ステータスコード 200、302 で、本文には「ブロック」または「許可」があります。ステータスコードに基づいて、アプライアンスはポリシー評価を実行します。ポリシー評価が true の場合、割り当てアクションがすぐにトリガーされ、アクションによって変数に値が設定されます。アプライアンスはこの変数値を使用して設定し、同じモジュールでの今後のポリシー評価に使用します。

割り当てアクションの設定のユースケース

以下の手順に従って割り当てアクションを設定し、後続のポリシーで変数を使用してください。

  1. アクセスの決定は別の Web サービスによって行われ、リクエストの本文には BLOCK または ALLOW を含む応答が返されます。

    GET /url-service>/url-allowed?<URL path>

  2. URL へのアクセス決定を格納するマップ変数を設定します。

    add ns variable url_list_map -type 'map(text(1000),text(10),10000)'

  3. HTTP コールアウトを設定して Web サービスにアクセス要求を送信します。

    add policy httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?" + HTTP.REQ.URL.PATH' -resultExpr 'HTTP.RES.BODY(10)'

  4. 割り当てアクションを設定して、コールアウトを呼び出してアクセス決定を取得し、URL のマップエントリに割り当てます。

    add ns assignment client_access_assn -variable '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T]' -set SYS.HTTP_CALLOUT(client_access_callout)

  5. URL リクエストがブロックされた場合に 403 レスポンスを送信するようにレスポンダーアクションを設定します。

    add responder action url_list_block_act respondwith '"HTTP/1.1 403 Forbidden\\r\\n\\r\\n"'

  6. URL のマップエントリがまだ設定されていない場合は、レスポンダーポリシーを設定して設定します。即時アクション拡張では、このポリシーが評価されるときにマップエントリの値が設定されます。機能強化前は、すべてのレスポンダーポリシーが評価され、別のウェブサービスによって決定されるまで、割り当ては行われませんでした。

    add responder policy url_list_assn_pol '!$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn

  7. マップエントリの値が BLOCK の場合、URL へのアクセスをブロックするレスポンダーポリシーを設定します。即時アクションの強化により、前のポリシーで設定されたマップエントリをこのポリシーで使用できます。拡張前は、マップエントリはこの時点ではまだ未設定でした。

    add responder policy client_access_block_pol '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act

  8. レスポンダーポリシーを仮想サーバーにバインドします。:ポリシーをグローバルにバインドすることはできません。別の仮想サーバーで HTTP コールアウトを実行したくないからです。

    bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST

設定ユーティリティを使用して変数を設定するには

  1. AppExpert」>「NS 変数」に移動して、変数を作成します。
  2. AppExpert」>「NS割り当て」に移動して、変数に値を割り当てます。
  3. 割り当てをアクションとして構成する適切な機能領域に移動します。
変数の構成と使用