このトピックでは、API Gateway プラグインでパラメーターと条件式を使用する方法について説明します。
1. 概要
プラグインでは、現在の request、response、または system context からパラメーターを取得し、カスタム条件式を使用してそれらを評価できます。このトピックでは、パラメーターを定義し、条件式を記述する方法について説明します。
2. パラメーターの定義
2.1 定義メソッド
条件式を使用する前に、parameters フィールドに必要なすべてのパラメーターを明示的に定義する必要があります。例:
---
parameters:
method: "Method"
appId: "System:CaAppId"
action: "Query:action"
userId: "Token:UserId"parameters フィールドには、文字列型のキーと値のペアが含まれています。key と value は次のように定義されます。
key: 条件式で使用する変数の名前。名前は一意である必要があり、[a-zA-Z_][a-zA-Z0-9]+のフォーマットに従う必要があります。value: パラメーターの場所。場所は{location}または{location}:{name}のフォーマットで定義します。例:location: パラメーターの場所。詳細については、次のセクションをご参照ください。name: パラメーターの名前。この名前を使用して、特定の場所にあるパラメーターを特定します。たとえば、Query:q1は、クエリ文字列内の q1 という名前のパラメーターの最初の値を示します。
2.2 パラメーターの場所
条件式を使用する前に、この条件式で必要なパラメーターを定義する必要があります。次の表に、API Gateway のプラグインが使用できる特定の場所にあるパラメーターを示します。
場所 | スコープ | 説明 |
Method | リクエスト | HTTP リクエストメソッド (大文字)。例:
|
Path | リクエスト | HTTP リクエストの完全なパス。例:
|
StatusCode | 応答 | バックエンド応答の HTTP 応答コード。例:
|
ErrorCode | 応答 | API Gateway のシステムエラー応答のエラーコード。詳細については、「エラーコード」をご参照ください。 |
Header | リクエストまたは応答 |
|
Query | リクエスト |
|
Form | リクエスト |
|
Host | リクエスト |
|
Parameter | リクエスト |
|
BodyJsonField | 応答* |
|
System | リクエストまたは応答 |
|
Token | リクエストまたは応答 | JWT 認証が使用されている場合、 |
XFF | リクエスト |
|
パラメーターの場所の使用上の注意
パラメーターベースのアクセス制御プラグイン、トラフィックシェーピングプラグイン、および バックエンドルーティングプラグインは、リクエストフェーズで実行されます。これらのプラグインは、
Method、Path、Header、Query、Form、Parameter、System、Token、XFFのリクエストの場所からのパラメーターのみをサポートします。エラーコードマッピングプラグインは、応答フェーズで実行されます。これらのプラグインは、
StatusCode、ErrorCode、Header、BodyJsonField、System、Tokenの応答の場所からのパラメーターのみをサポートします。Method、Path、StatusCode、ErrorCode、およびXFFの場所については、場所のみを提供する必要があります。名前は必要ありません。Headerの場所にあるパラメーターがリクエストフェーズでプラグインで使用される場合、プラグインはクライアントリクエストからヘッダーを読み取ります。パラメーターが応答フェーズでプラグインで使用される場合、プラグインはバックエンド応答からヘッダーを読み取ります。Parameterの場所にあるパラメーターは、リクエストフェーズのプラグインでのみ使用されます。システムは、バックエンドパラメーター名ではなく、パラメーター名を使用して、API 定義内で同じ名前のパラメーターを検索します。パラメーターが存在しない場合、nullが返されます。Hostの場所にあるパラメーターは、ワイルドカードドメイン名のパラメーター抽出でのみサポートされます。詳細については、「カスタムドメイン名を使用して API を呼び出す」をご参照ください。完全なホストを取得するには、System:CaDomainシステムパラメーターを使用します。Pathパラメーターは、完全なリクエストパスを指定します。Pathにパラメーターが含まれている場合は、Parameterセクションで定義します。BodyJsonFieldの場所にあるパラメーターは、現在 エラーコードマッピングプラグインでのみサポートされています。JSONPath式を使用して、JSON 応答本文から値を読み取ります。詳細については、「JSONPath の使用上の注意」をご参照ください。Token: JWT 認証プラグインが設定されている場合、Token:{ClaimName}を使用してプラグインで定義された値を読み取ることができます。詳細については、対応するプラグインのドキュメントをご参照ください。
2.3 JSONPath の使用上の注意
BodyJsonField の場所で JSONPath 式を使用して、バックエンド応答の JSON 本文から JSON フィールドを抽出できます。この機能は、エラーコードマッピングプラグインでのみサポートされています。JSONPath の詳細については、「JSONPath」ドキュメントをご参照ください。
例:
code:"BodyJsonField:$.result_code"を使用して、次の応答本文からresult_codeの値を取得します。解析された結果はcode:okです。
{ "result_code": "ok", "message": ... }2.4 システムパラメーター
パラメーター | パラメーター | 有効な値またはサンプル値 |
CaClientIp | リクエストを送信したクライアントの IP アドレス。 | 例: |
CaDomain | リクエストの Host ヘッダーからの完全なドメイン名。 | 例:
|
CaAppId | リクエストを送信したアプリケーションの ID。 | 例:
|
CaAppKey* | リクエストを送信したアプリケーションのキー。 | 例:
|
CaRequestId | API Gateway によって生成された一意のリクエスト ID。 | 例:
|
CaApiName | API 名。 | 例:
|
CaHttpSchema | API の呼び出しに使用されるプロトコル。 | 有効な値: |
CaClientUa | クライアントの User-Agent ヘッダー。 | クライアントによってアップロードされた値を渡します。 |
CaCloudMarketInstanceId | Alibaba Cloud Marketplace での購入関係の ID。 | Alibaba Cloud Marketplace |
CaMarketExpriencePlan | Alibaba Cloud Marketplace のトライアルプランが有効化されているかどうかを指定します。 | 有効化済み: 未有効化: |
3. 条件式
プラグインやその他のシナリオで条件式を使用して、柔軟な条件付き評価を実行できます。
3.1 構文
条件式は SQL 式に似ています。例:
$A > 100 and '$B = 'B'。式の基本フォーマットは
{parameter} {operator} {parameter}です。たとえば、$A > 100では、パラメーターはvariablesまたはconstantsになります。variableは$で始まり、コンテキストで定義されたパラメーターを参照します。たとえば、パラメーターq1:"Query:q1"がparametersで定義されている場合、式で変数$q1を使用できます。この変数の値は、現在のリクエストのq1という名前のクエリパラメーターの値です。constantは、string、number、またはBoolean typeにすることができます。たとえば、"Hello"、'foo'、100、-1、0.1、trueなどです。詳細については、「パラメーターの型と判断ルール」をご参照ください。次の
operatorsがサポートされています。=および==: 等しい。<>および!=: 等しくない。>、>=、<、および<=: 比較。likeおよび!like: 類似性チェック。%ワイルドカードを文字列の先頭または末尾で使用して、文字列の類似性をチェックできます。例:$Query like 'Prefix%'。in_cidrおよび!in_cidr: IP アドレスが特定の CIDR ブロック内にあるかどうかを確認します。例:$ClientIp in_cidr '47.89.XX.XX/24'。nullを使用して、パラメーターが空かどうかを確認します。例:$A == nullまたは$A != null。and、or、xorを使用して、さまざまな式を組み合わせます。デフォルトの評価順序は右から左です。括弧
(と)を使用して、条件の優先順位を指定します。!(と)を使用して、囲まれた式に対して NOT 操作を実行します。たとえば、!(1=1)の結果はfalseです。システムには、特別なシナリオでの評価のためのビルトイン関数があります。
Random():0 と 1の間の浮動小数点数を生成します。この関数は、ブルーグリーンデプロイメントなど、ランダム性が必要なシナリオで使用されます。Timestamp(): ミリ秒単位のUnix タイムスタンプを返します。TimeOfDay():GMTタイムゾーンの現在日の深夜から経過したミリ秒数を返します。
3.2 値の型と判断ルール
式では、次の値の型がサポートされています。
STRING: 文字列型。一重引用符または二重引用符を使用できます。例:"Hello"、'Hello'。NUMBER: 整数または浮動小数点数型。例:1001、-1、0.1、-100.0。BOOLEAN: ブール型。例:true、false。
equal to、not equal to、およびcomparisonオペレーターの場合、異なる型に対する評価ルールは次のとおりです。STRING: 評価に文字列の順序を使用します。例:'123' > '1000'の結果は true です。'A123' > 'A120'の結果は true です。'' < 'a'の結果は true です。
NUMBER: 数値に基づいて評価します。123 > 1000の結果は false です。100.0 == 100の結果は true です。
BOOLEAN: ブール値の評価ルールは、trueがfalseより大きいということです。true == trueの結果は true です。false == falseの結果は true です。true > falseの結果は true です。
equal to、not equal to、およびcomparisonオペレーターの場合、左オペランドと右オペランドのパラメーター型が異なる場合、次の評価ルールが適用されます。STRING NUMBER: 左オペランドをNUMBER型に変換できる場合、値は数値で比較されます。それ以外の場合は、文字列として比較されます。例:'100' = 100.0の結果は true です。'-100' > 0の結果は false です。
STRING BOOLEAN: 左オペランドをBOOLEAN型 (大文字と小文字を区別せずにtrueまたはfalseに等しい) に変換できる場合、比較はBOOLEAN型に基づきます。それ以外の場合、!=比較を除き、他のすべての比較の結果はfalseになります。例:'True' = trueの結果は true です。'False' = falseの結果は true です。'bad' = falseの結果は false です。'bad' != falseの結果は true です。trueまたはfalseではない左オペランドの場合、!=オペレーターのみがtrueを返します。他のすべての比較オペレーターはfalseを返します。'bad' != trueの結果は true です。'0' > falseの結果は false です。'0' <= falseの結果は false です。
NUMBER BOOLEAN: 常にfalseを返します。
null値を使用して、フィールドが空かどうかを確認できます。equal to、not equal to、およびcomparisonオペレーターの場合、評価ルールは次のとおりです。パラメーター
$Aが空の場合、$A == nullの結果は true で、$A != nullの結果は false です。空の文字列
''はnullと等しくありません。'' == nullの結果はfalseで、'' == ''の結果はtrueです。comparisonオペレーターの場合、いずれかのオペランドがnullの場合、結果はfalseになります。
likeおよび!likeオペレーターを使用して、文字列のプレフィックス、サフィックス、および包含を確認できます。評価ルールは次のとおりです。式は、右オペランドとして
STRING定数のみをサポートします。例:$Path like '/users/%'。'%'文字を右オペランドの先頭または末尾で使用して、プレフィックス、サフィックス、および包含チェックをサポートできます。例:プレフィックスチェック:
$Path like '/users/%'、$Path !like '/admin/%'。サフィックスチェック:
$q1 like '%search'、$q1 !like '%.do'。包含チェック:
$ErrorCode like '%400%'、$ErrorCode !like '%200%'。
左オペランドが
NUMBERまたはBOOLEAN型でない場合、評価前にSTRINGフォーマットに変換されます。左オペランドが
nullの場合、結果はfalseになります。
in_cidrおよび!in_cidr式を使用して、IP アドレスが CIDR ブロック内にあるかどうかを確認できます。評価ルールは次のとおりです。この式は、右オペランドとして IPv4 または IPv6 CIDR フォーマットの
STRING定数のみをサポートします。例:$ClientIP in_cidr '10.0.0.0/8'$ClientIP !in_cidr '0:0:0:0:0:FFFF::/96'
左オペランドが
STRING型の場合、IP アドレスとして評価されます。左オペランドが
NUMBERまたはBOOLEAN型であるか、空の場合、結果はfalseになります。System:CaClientIpパラメーターはクライアントの IP アドレスを返し、通常このタイプの評価に使用されます。
4. ユースケース
5% の確率:
Random() < 0.05リクエストされた API がテスト環境に公開されているかどうかを確認します。
parameters:
stage: "System:CaStage"$CaStage = 'TEST'カスタムパラメーター UserName が Admin で、ソース IP アドレスが
47.47.XX.XX/24CIDR ブロック内にあります。
parameters:
UserName: "Token:UserName"
ClientIp: "System:CaClientIp"$UserName = 'Admin' and $CaClientIp in_cidr '47.47.XX.XX/24'現在のリクエストのユーザー ID が 1001、1098、または 2011 で、リクエストが HTTPS プロトコルを使用しています。
parameters:
CaAppId: "System:CaAppId"
HttpSchema: "System:CaHttpSchema"$CaHttpScheme = 'HTTPS' and ($CaAppId = 1001 or $CaAppId = 1098 or $CaAppId = 2011)`応答の StatusCode は 200 ですが、
JSON本文のresult_codeはokではありません。
parameters:
StatusCode: "StatusCode"
ResultCode: "BodyJsonField:$.result_code"$StatusCode = 200 and ($ResultCode <> null and $ResultCode <> 'ok')5. 制限
1 つのプラグインには、最大 16 個のパラメーター定義を含めることができます。
1 つの式は 512 文字を超えることはできません。
BodyJsonField のリクエストまたは応答本文のサイズは 16 KB を超えることはできません。制限を超えた場合、設定は有効になりません。