DataScript では、次の仮想サービス関数を使用できます:
機能 |
説明 |
---|---|
カウンタ タイプのメトリックを作成および操作します。詳細については、『VMware NSX Advanced Load Balancer モニタリングおよび運用性ガイド』の「NSX Advanced Load Balancer のモニタリング コンポーネント」のトピックを参照してください。 |
|
ゲージ タイプのメトリックを作成および操作します。 |
|
指定された名前と指定されたタイプを持つメトリック値が存在する場合は、ユーザー定義のメトリック値を返します。 |
|
絶対、カウンタ、またはゲージ タイプのメトリックの値を返します。 |
|
クライアント IP アドレスを返します |
|
クライアントの送信元ポートを返します |
|
現在の TCP/UDP 接続を閉じます |
|
VS の IP アドレスを返します |
|
カスタム ログを に書き込みます。 |
|
仮想サービスの名前を返します。 |
|
接続の VS ポートを返します。 |
|
ロード バランシング トラフィックの後に使用されるキーを使用して、パーシステンス エントリを作成します。 |
|
avi.vs.rate_limit( type, string_to_limit, [defer_action=False] ) |
さまざまな種類のエンティティのレートを制限します。 |
イベント間で使用可能なグローバル変数を設定します。 |
|
avi.vs.table_insert( [table_name,] key, value [, lifetime] ) |
カスタム データを時間ベースのテーブルに格納します。 |
テーブル内のデータを検索します。 |
|
avi.vs.table_refresh( [table_name,] key [, lifetime_exten] ) |
テーブル エントリの有効期限を更新します。 |
さまざまな種類のエンティティのレートを制限します。 |
|
テーブルからデータを削除します。 |
|
現在の仮想サービスに適用されているサービス エンジンあたりの開いている接続数の合計を返します。 |
|
現在の仮想サービスに適用されているサービス エンジンの合計数を返します。 |
avi.vs.analytics.counter
機能 |
|
説明 |
指定したカウンタ メトリックを増分またはクリアします。 詳細については、『VMware NSX Advanced Load Balancer モニタリングおよび運用性ガイド』の「NSX Advanced Load Balancer のモニタリング コンポーネント」のトピックを参照してください |
イベント |
|
パラメータ |
注:
|
戻り値 |
値は返されません |
関連 |
|
例 |
|
avi.vs.analytics.gauge
機能 |
|
説明 |
指定したゲージ メトリックを増分、減分、設定、またはクリアします。 詳細については、『VMware NSX Advanced Load Balancer モニタリングおよび運用性ガイド』の「NSX Advanced Load Balancer のモニタリング コンポーネント」のトピックを参照してください。 |
イベント |
|
パラメータ |
注:
|
戻り値 |
値は返されません |
関連 |
|
例 |
|
avi.vs.analytics.get_metric
機能 |
|
説明 |
カウンタまたはゲージ タイプのメトリックの値を返します。これを行う前に、この関数はまず metric_name が定義されているかどうかを確認します。定義されている場合は、metric_type の値を以前に保存されたタイプと比較します。metric_name が定義されていないか、タイプが正しくない場合、この関数はログにエラーを報告し、この関数の呼び出しの原因となる要求/応答はキャンセルされます。 詳細については、『VMware NSX Advanced Load Balancer モニタリングおよび運用性ガイド』の「NSX Advanced Load Balancer のモニタリング コンポーネント」のトピックにある「ユーザー定義のメトリック」セクションを参照してください。 |
イベント |
|
パラメータ |
|
戻り値 |
メトリックの値 |
関連 |
|
例 |
goo-current-val を goo という名前の counter-type メトリックの現在の値に設定します(存在する場合)。 goo-current-val = avi.vs.analytics.get_metric ("goo", avi.vs.analytics.METRICTYPE_COUNTER) |
avi.vs.analytics.get_counter
機能 |
|
説明 |
絶対、カウンタ、またはゲージのタイプのメトリックの値を返します。これを行う前に、この関数はまず |
イベント |
|
パラメータ |
|
戻り値 |
メトリックの値 |
関連 |
|
例 |
TBD |
avi.vs.client_ip
機能 |
|
説明 |
クライアントの IPv4 または IPv6 アドレスを返します。 |
イベント |
すべて |
パラメータ |
なし |
戻り値 |
クライアントの送信元 IP アドレスを含む文字列。 |
例 |
クライアントの送信元 IP アドレスを HTTP ヘッダーに挿入します。 avi.http.add_header("XFF", avi.vs.client_ip()) |
avi.vs.client_port
機能 |
|
説明 |
クライアントの送信元ポートを返します。 |
イベント |
|
パラメータ |
なし |
戻り値 |
クライアントの送信元ポートを含む文字列。 |
例 |
接続の 10 分の 1 を pool1 に分散して A/B テストを提供する簡単な方法。 if string.endswith(avi.vs.client_port(), "0") then avi.pool.select("Pool1") else avi.pool.select("Pool2") end |
avi.vs.close.connection
機能 |
|
説明 |
現在の TCP/UDP 接続を終了します。UDP 接続の場合、reset フラグを設定しても影響はありません。 |
イベント |
|
パラメータ |
|
戻り値 |
戻り値はありません |
例 |
if avi.vs.client_ip() == "10.1.1.1" then avi.vs.close_conn() end avi.vs.close_conn(1) |
avi.vs.ip
機能 |
|
説明 |
要求または接続を受け入れた仮想サービスの IPv6 アドレスを返します。 |
イベント |
|
パラメータ |
|
戻り値 |
たとえば、10.1.1.1 のように、(小数点で区切られた)オクテット形式の |
例 |
VS トラフィックの送信元をサーバに通知するヘッダーを挿入します。 avi.http.add_header("VS_IP", avi.vs.ip()) |
avi.vs.log
機能 |
|
説明 |
接続または要求に関連付けられた、 |
イベント |
|
パラメータ |
|
戻り値 |
なし |
例 |
DataScript「Log1」HTTP_REQ イベントから: avi.vs.log("Hello World!") DataScript「Log2」HTTP_RESP イベントから: num = 2 avi.vs.log("Hello " .. num .. " You!") クライアント ログからの出力: DataScript Log: [string "Log1"]:1: Hello World! DataScript Log: [string "Log2"]:1: Hello 2 You!
注:
ログの先頭にはメタ情報が付加されます。これは、通常、 重要なログの例: DataScript「Log1」HTTP_REQ イベントから: avi.vs.log("Hello World!", avi.SIG_ENABLE) クライアント ログからの出力: DataScript Log: [string "Log1"]:1: Hello World! Significance: Datascript Significant Log. |
avi.vs.name
機能 |
|
説明 |
要求または接続を受け入れた仮想サービスの名前を返します。 |
イベント |
|
パラメータ |
なし |
戻り値 |
仮想サービス名が含まれる文字列。 |
例 |
サーバに送信されるトラフィックにヘッダーを挿入します。X-Source:www.avi.com-10.1.1.1 avi.http.add_header("X-Source", avi.vs.name() .. "-" .. avi.vs.ip()) |
avi.vs.port()
機能 |
|
説明 |
要求または接続を受信した仮想サービス ポートを返します。 |
イベント |
|
パラメータ |
なし |
戻り値 |
仮想サービスのポート番号を含む文字列。 |
例 |
HTTP 要求がポート 443 に到達しなかった場合は、接続を終了します。 if avi.vs.port() ~= "443" then avi.http.close_conn() end |
avi.vs.persist
機能 |
|
説明 |
オプションの指定されたプールまたは仮想サービスに適用されているプールに要求をロード バランシングします。 この関数は、同様にキー値のパーシステンス エントリも作成します。キーはパラメータに渡され、値はロード バランシングされた IP アドレス、ポートです(例:10.10.10.10-80)。 オプションの有効期間により、パーシステンス テーブル エントリが渡された有効期間で作成されるようになります。 デフォルトは 300s です。 この API は、内部で従来のロード バランシングを実行し、値がロード バランシングされたバックエンド サーバであるパーシステンス テーブル エントリを自動的に作成します。 この API を繰り返し呼び出すと、タイムアウトが更新されます。 |
イベント |
|
パラメータ |
キー、[lifetime]、[pool] |
戻り値 |
戻り値はありません |
例 |
if username == “my_user” then avi.vs.persist(username, 3600, “POOL_80”) |
この API は DataScript から生成され、この API が実行された後はこれ以上のステートメントはありません。これはターミナル API です。
avi.vs.rate.limit
機能 |
|
説明 |
さまざまな種類のエンティティのレートを制限します。 |
イベント |
|
パラメータ |
|
戻り値 |
この関数は、2 つのオプション変数を返します。これらは、単純に情報を提供します。
使用可能なオプションは次のとおりです。
|
DataScript は、1 つ以上の仮想サービスに適用された、HTTP アプリケーション プロファイル内にネストされたレート制限プロファイルを参照するように構成する必要があります。このレート制限プロファイルの関連付けは、CLI または API を介して行われます。次の CLI 構文は、プロファイルを変更する方法を示しています。
configure applicationprofile <application_profile_name> dos_rl_profile rl_profile custom_requests_rate_limit count <max_number_of_requests_allowed> period <time_period_during_which_those_requests_should_be_allowed> -- Rate limiter allows requests as long as count is not exceeded within period seconds action type <action_type> -- Default for action_type is avi.RL_ACTION_CLOSE_CONN save -- Repeat until you exit the application profile
ユーザー インターフェイスでレート制限プロファイルを構成するには、次の手順を実行します。
コントローラで、[テンプレート] に移動します。
[アプリケーション] タブで、アプリケーション プロファイルを選択して編集します(または、新しいプロファイルを作成します)。
[DDoS] タブを選択します。
[レート制限の追加] で、[仮想サービスのすべての URL の任意のカスタム ストリングにマッピングされる HTTP 要求でレートを制限します] を選択します。
[しきい値] および [期間] の値を入力します。この特定のユースケースでは、[アクション] を [HTTP ローカル応答の送信]、[状態コード] を [429] として選択します。ファイルをアップロードする必要はありません。
[保存] をクリックします。
基本的なレート制限
例 1
一意の ID に基づいてクライアントをレート制限します(この場合は HTTP ヘッダー値)
時間あたりの要求数は、レート制限プロファイル内で定義されます
avi.vs.rate_limit(avi.RL_CUSTOM_STRING, avi.http.get_header("userID"))
ペナルティ タイマーによるレート制限
ペナルティ ボックスを追加してレート制限のロジックを拡張します
通常、レート制限では、期間 Y に X 個の接続のみが
許可されます。ペナルティ ボックスでは、ユーザーが制限を超えると、
ペナルティ タイマーが期限切れになるまで、要求を送信することはできません。
userID = avi.http.get_header("userID") penalty_time = 900 -- Check if the userID has been added to the table of blocked users -- The table is used to create a "penalty box" of 900 seconds -- If user is not in the list then given_action variable is nil given_action, remaining_time = avi.vs.table_lookup(userID, 0) if given_action then avi.http.close_conn() else -- if userID is not in the penalty box table count_exceeded, given_action = avi.vs.rate_limit(avi.RL_CUSTOM_STRING, userID, true) if count_exceeded then -- user just crossed the threshold and is now added to the penalty box table avi.vs.table_insert(userID, given_action, penalty_time) -- Since the optional defer_action flag from avi.vs.rate_limit() is set to true -- The rate limit profile is not enforcing the limit, so it is enforced below avi.http.close_conn() end end
avi.vs.rate.limit.exceed
NSX Advanced Load Balancer リリース 18.2.9 以降では、既存のレート制限 DataScript API – avi.vs.rate_limit
は廃止されました。レート制限の新しい DataScript API は avi.vs.ratelimit.exceed
です。
廃止された DataScript API – avi.vs.rate_limit( type, string_to_limit, [defer_action=False] )
新しい DataScript API - avi.vs.ratelimit.exceed(rl_name, request_key, [consume])
新しい DataScript レート リミッタで使用されるパラメータは次のとおりです。
機能 |
|
説明 |
さまざまな種類のエンティティのレートを制限します。 |
イベント |
|
パラメータ |
|
戻り値 |
この関数は、次の 2 つの変数を返します。
アクションは、要件に従って構成できます。次の構成セクションでは、仮想サービス ログにイベントを記録するアクションが選択されます。 |
この API は、イベント SSL_PRECONNECT、SSL_CLIENTHELLO、および SSL_HANDSHAKE_DONE ではサポートされていません。
その他の構成
DataScript は、1 つ以上の仮想サービスに適用された、HTTP アプリケーション プロファイル内にネストされたレート制限プロファイルを参照するように構成する必要があります。このレート制限プロファイルの関連付けは、CLI または API を介して行われます。次の CLI 構文は、プロファイルを変更する方法を示しています。
DataScript レート リミッタの構成
CLI にログインし、configure vsdatascriptset <policy name> コマンドを使用してレート リミッタを構成します。ポリシー名を入力し、次のようにレート リミッタに必要な値(カウント、期間、バースト サイズ)を割り当てます。
[admin]: > configure vsdatascriptset rate_limiter_test [admin]: vsdatascriptset> rate_limiters [admin]: vsdatascriptset:rate_limiters> count 1 [admin]: vsdatascriptset:rate_limiters> period 15 [admin]: vsdatascriptset:rate_limiters> burst_sz 0 [admin]: vsdatascriptset:rate_limiters> name rl1 [admin]: vsdatascriptset:rate_limiters> save [admin]: vsdatascriptset> save
必要なアクションを指定して、DataScript で avi.vs.ratelimit.exceed 関数を使用します。次はその例です。
result = avi.vs.ratelimit.exceed("rl1", "key1") if result == true then avi.vs.log("rl exceeds") else avi.vs.log("rl does not exceed") end
avi.vs.reqvar
機能 |
|
説明 |
変数を設定(書き込み)または取得(読み取り)します。これらの変数は、HTTP_REQ イベントと HTTP_RESP イベントの範囲を持ちます。有効期間は HTTP 要求/応答トランザクションの期限に制限されるため、手動で設定を解除する必要はありません。すべての Lua 値は、この変数内に格納できます。現在のイベント中にのみ必要な変数データの場合は、変数をデータにマッピングします。 var = 1 if var == 1 then ... 接続間で保存する必要がある、または仮想サービスの他のサービス エンジンにミラーリングする必要が変数データでは、avi.vs.table_insert() を使用します |
イベント |
|
パラメータ |
なし |
戻り値 |
更新が成功した場合は true、更新に失敗した場合は false。 |
HTTP 要求の例 |
avi.vs.reqvar.foo = 10
if avi.vs.reqvar.foo == 10 then avi.vs.log("Foo=" .. avi.vs.reqvar.foo) end |
avi.vs.table_insert
機能 |
|
説明 |
テーブル API は、カスタム データの保存と取得に使用されます。avi.vs.table_lookup API はキーを検索し、対応する値を返します。このキー値ストアは仮想サービスごとに一意で、VS をホストするすべてのサービス エンジンにミラーリングされます。 |
イベント |
|
パラメータ |
オプションの キーは、値を検索するために使用されます。 オプションの |
戻り値 |
キーの値フィールドを返します。値が存在しない場合、またはキーが存在しない場合は、nil を返します。負でない整数は、エントリの残りの有効期間を秒単位で表します。 |
HTTP 要求の例 |
この使用事例は、ネイティブの App-Cookie パーシステンス モードでも実行できます。 if avi.http.get_cookie("OAM_JSESSIONID") then if avi.vs.table_lookup(avi.http.get_cookie("OAM_JSESSIONID")) then avi.pool.select(avi.vs.table_lookup(avi.http.get_cookie("JSESSIONID"))) end end |
HTTP 応答の例 |
if avi.http.get_cookie("JSESSIONID") ~= "" then avi.vs.table_insert(avi.http.get_cookie("JSESSIONID"), avi.pool.server_ip(), 3600) end |
avi.vs.table_lookup
機能 |
|
説明 |
テーブル API は、カスタム データの保存と取得に使用されます。avi.vs.table_lookup API はキーを検索し、対応する値を返します。このキー値ストアは仮想サービスごとに一意で、VS をホストするすべてのサービス エンジンにミラーリングされます。 |
イベント |
|
パラメータ |
オプションの table_name が指定されていない場合、VS のデフォルト テーブルでキーが検索されます。指定すると、カスタム テーブルが検索されます。 キーは、値を検索するために使用されます。 オプションの lifetime_exten フラグは正の整数にする必要があります。これは、キーの現在の有効期間パラメータに追加する時間の長さを秒単位で示します。指定しない場合、デフォルト値の 300 秒が使用されます。つまり、デフォルトでは、キーの値を検索すると、キーの有効期間がさらに 300 秒延長されます。有効期限に影響を与えずにキーを検索するには、lifetime_exten フラグを 0 に設定します。 |
戻り値 |
キーの値フィールドを返します。値が存在しない場合、またはキーが存在しない場合は、nil を返します。負でない整数は、エントリの残りの有効期間を秒単位で表します。 |
HTTP 要求の例 |
この使用事例は、ネイティブの App-Cookie パーシステンス モードでも実行できます。 if avi.http.get_cookie("OAM_JSESSIONID") then if avi.vs.table_lookup(avi.http.get_cookie("OAM_JSESSIONID")) then avi.pool.select(avi.vs.table_lookup(avi.http.get_cookie("JSESSIONID"))) end end |
HTTP 応答の例 |
if avi.http.get_cookie("JSESSIONID") ~= "" then avi.vs.table_insert(avi.http.get_cookie("JSESSIONID"), avi.pool.server_ip(), 3600) end |
avi.vs.table_refresh
機能 |
|
説明 |
キー/値ストア内のキーのエントリの有効期間を更新します。 |
イベント |
|
パラメータ |
オプションの
|
戻り値 |
更新が成功したらブール値 |
注 |
キー/値のエントリは、VS をホストしているすべてのサービス エンジンから削除されます。 |
例 |
TBD |
avi.vs.table_remove
機能 |
|
説明 |
テーブル API は、カスタム データの保存と取得に使用されます。 |
イベント |
|
パラメータ |
オプションの
|
戻り値 |
なし |
注 |
キー/値のエントリは、VS をホストしているすべてのサービス エンジンから削除されます。 |
例 |
TBD |
avi.vs.get_open_conns
機能 |
avi.vs.get_open_conns() |
説明 |
要求を受信した SE 上の仮想サービスに対して開いている接続数の合計を返します |
イベント |
すべてのイベント |
パラメータ |
なし |
戻り値 |
開いている接続数の合計 |
例 |
次のデータ スクリプトの例では、SE 数と開いている接続数を示します。 local se_count = avi.vs.se_count() local open_conn = avi.vs.get_open_conns() avi.vs.log("Open conns: " .. open_conn .. " for Total SE: " .. se_count) |
avi.vs.se_count
機能 |
avi.vs.get_se_count() |
説明 |
現在の仮想サービスに適用されているサービス エンジンの合計数を返します |
イベント |
すべてのイベント |
パラメータ |
なし |
戻り値 |
それぞれの仮想サービスの SE の合計数 |
例 |
SE が 1 つしかない場合、次のデータ スクリプトの例では 1 が出力されます。 -- scale-out SE open connection limit MAX_OPEN_CON=50 local se_count = avi.vs.se_count() local open_conn = avi.vs.get_open_conns() per_se_max = MAX_OPEN_CON/se_count --Dividing the MAX count per SE, assuming equal distribution. if (open_conn > per_se_max) then avi.vs.log("Current open conns: " .. open_conn .. "> MAX_OPEN_CON=" .. MAX_OPEN_CON .. " for Total SE: " .. se_count) avi.http.response(404, {content_type="text/html"}, "<html> MAX_OPEN_CON=" .. MAX_OPEN_CON .. " exceeded, please try later! </html>\n") else avi.vs.log("Open conns: " .. open_conn .. " for Total SE: " .. se_count) end |