このセクションでは、さまざまなエラーと、NSX Advanced Load Balancer で使用可能なトラブルシューティング オプションについて説明します。

DataScript は、次の 2 つの方法のいずれかで失敗することがあります。

  1. 構成エラー

  2. 実行エラー

構成エラー

すべての DataScript は、構成の保存/編集中に解析されます。DataScript 構文が正しくないと、DataScript をコミットしようとすると失敗します。構成時のエラーはデバッグの補助として報告され、ロジック エラーではなく構文エラーをキャッチします。次の DataScript には余分な文字が含まれています。Lua は、この変数を、abc = 1 などのまだ宣言されていない変数として解釈します。

if avi.vs.client_ip() == "10.1.1.1" then
   abc
   avi.http.close_conn()
   def
end
ghi

エラー メッセージ:

Failed to compile the datascript "Drop_Client_on_http_req.ds": luac: Drop_Client_on_http_req.ds:3: '=' expected near 'avi'

上記のルールには 3 つの構文エラーがありますが、最初に発生したエラーのみが報告されます。この例では、abc は宣言されていない変数ですが、次の行を読み取るまではその判断に至りません。したがって、エラーは行 2: http_req.ds:3  ではなく行 3 で報告され、エラーの場所は「avi」の近くとして報告されます。DataScript は、スペースとキャリッジ リターンに対して非常に寛容です。変数宣言 abc = 2 は有効です。

abc
     =
   2

次の DataScript には、if ロジックを完了するための終了がありません。

if avi.vs.client_ip() == "10.1.1.1" then avi.http.close_conn()

エラー メッセージ:

Failed to compile the datascript "Drop_Client_on_http_req.ds": luac: Drop_Client_on_http_req.ds:1: 'end' expected near '<eof>'

実行エラー

DataScript はエラーなしで保存できますが、後でポップアップ表示されるロジックやその他の問題が残っている可能性があります。DataScript の実行でエラーが発生すると、その要求または応答のスクリプト実行が途中で終了します。HTTP 500 Internal Server Error がクライアントに送信され、デバッグを支援するために、途中で終了したスクリプトのスタック トレースを使用してクライアント ログが生成されます。

次の [仮想サービス] > [ログ] フィルタを使用して、DataScript エラーが発生したクライアントを検索します。

significance= “Request ended abnormally: Datascript failed to execute”。クライアント ログを開き、[すべてのヘッダー] をクリックすると、エラーの詳細が表示されます。

ログに記録されているエラーの例を次に示します。

Datascript エラー

[string "Drop Client"]:2: attempt to call field 'close_conn' (a nil value)

DataScript エラー スタック トレース

stack traceback:
coroutine 0:
	[string "Drop Client"]:2: in function <[string "Drop Client"]:1>

このエラーのスタック トレースは理由を提供しない可能性がありますが、有用なヒントを提供します。エラーはルールの 2 行目 "Drop Client"]:2 にあり、close_conn 関数と関係があります。この問題は、ルールを見てすぐには明らかにならない場合があります。

if avi.vs.client_ip() == "10.1.1.1" then
   avi.close_conn()
end

詳細については、avi.http.close_connを参照してください。関数を正しい名前に変更した後、問題が解決されたことをテストして検証します。

上記の例では、ほとんどのクライアントが破損したルールの影響を受けません。この同じロジックを使用して、問題を隔離し、他のユーザーに影響を与えずにテストすることができます。