このトピックでは、API Gatewayプラグインでパラメーターと条件式を使用する方法について説明します。
1. 概要
API Gatewayプラグインを使用すると、リクエスト
、レスポンス
、またはシステムコンテキスト
からパラメーター値を取得し、カスタムの条件式を使用してパラメーター値を判断できます。 このトピックでは、parametersを定義する方法と条件式を記述する方法について説明します。
2. パラメータ定義
2.1 定義方法
条件式を使用する前に、この条件式に必要なすべてのパラメーターをparameters
フィールドに明示的に定義する必要があります。 例:
---
parameters:
method: "Method"
appId: "System:CaAppId"
action: "Query:action"
userId: "Token:UserId"
parameters
フィールドに指定されたパラメーターは、STRING型のキー
と値
のペアです。
key
は、条件式で使用する変数の名前を示します。 名前は一意である必要があり、[a-zA-Z_][a-zA-Z0-9]+
のルールに準拠している必要があります。value
はパラメーターの場所を示します。{location}
または{location }:{ name}
形式で指定します。location
は、パラメーターの場所を示します。 詳細については、次の表を参照してください。name
は、パラメーターの名前を示します。 この名前は、特定の場所でパラメータを見つけるために使用されます。 たとえば、Query:q1
は、クエリ文字列でq1という名前のパラメーターの最初の値を示します。
2.2 パラメーターの場所
条件式を使用する前に、この条件式で必要なパラメーターを定義する必要があります。 次の表に、API Gatewayのプラグインが使用できる特定の場所のパラメーターを示します。
位置 | 適用範囲 | 説明 |
方式 | リクエスト | HTTPリクエストメソッド (大文字) 。 例:
|
パス | リクエスト | HTTPリクエストのフルパス。 例:
|
StatusCode | レスポンス | バックエンド応答のHTTP応答コード。 例:
|
ErrorCode | レスポンス | API Gatewayのシステムエラー応答のエラーコード。 詳細については、エラーコードをご参照ください。 |
ヘッダー | リクエストまたは応答 |
名前が |
クエリ | リクエスト |
|
フォーム | リクエスト | リクエストフォームで名前が |
ホスト | リクエスト | 一致するワイルドカードドメイン名のテンプレートパラメーターを取得するには、 |
パラメーター | リクエスト |
|
BodyJsonField | 回答 * |
|
System | リクエストまたは応答 |
|
トークン | リクエストまたは応答 | JSON Web Token (JWT) 認証プラグインの場合、 |
XFF | リクエスト | X-Forwarded-ForヘッダーのIPアドレスを取得するには、 |
パラメータの場所の使用に関する注意
パラメーターベースのアクセス制御プラグイン、スロットリングプラグイン、およびは、リクエストを受信したときに機能します。 これらのプラグインでは、リクエスト内の
メソッド
、パス
、ヘッダー
、クエリ
、フォーム
、パラメータ
、システム
、トークン
、およびXFF
の場所のパラメータが適用されます。エラーマッピングプラグインは、応答を受信すると機能します。 これらのプラグインでは、
StatusCode
、ErrorCode
、Header
、BodyJsonField
、System
、Token
の各場所のパラメーターが適用されます。[メソッド]
、[パス]
、[ステータスコード]
、[エラーコード]
、および[XFF]
の場所に必要なのは場所のみです。 これらの場所では名前は必要ありません。リクエストフェーズでプラグインの
[ヘッダー]
の場所でパラメーターを使用すると、クライアントからのリクエストに含まれるヘッダーが読み取られます。 応答フェーズでこれらのパラメーターを使用すると、バックエンド応答のヘッダーが読み取られます。[パラメーター]
の場所にあるパラメーターは、リクエストフェーズのプラグインでのみ使用できます。 API定義で同じ名前のパラメーターを検索するには、バックエンドパラメーター
の代わりにフロントエンドパラメーター
を使用します。 同じ名前のパラメーターが存在しない場合、null
値が返されます。ホスト
の場所にあるパラメーターは、ワイルドカードドメイン名のパラメーターを取得した場合にのみ使用できます。 詳細については、「カスタムドメイン名をバインドしてAPI呼び出しを許可する」をご参照ください。 完全なドメイン名のシステムパラメーターを取得するには、system: CaDomain
を使用します。完全なリクエストパスが
path
から返されます。[パス]
の場所でパラメーターが必要な場合は、[パラメーター]
の場所で対応するパラメーターを使用します。BodyJsonField
ロケーションのパラメーターは、エラーコードマッピングプラグインでのみ使用できます。 JSONPath
モードのバックエンド応答のJSON形式の本文でパラメーターを取得します。 詳細については、「2.4」をご参照ください。 JSONPathの使用法ノート。認証にJWT認証プラグインが使用されている場合は、
Token:{CliamName}
を使用して、token
の {CliamName} で指定されたパラメーターの値を取得します。 詳細については、「」をご参照ください。
2.3 JSONPathの使用法ノート
JSONPath式を使用して、BodyJsonField
の場所でエラーコードマッピングプラグインのみのパラメーターを取得できます。 パラメーターは、バックエンド応答で返される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 | リクエストの送信に使用されるプロトコル。 | 有効な値: |
CaClientUa | クライアントのUserAgentヘッダー。 | クライアントによってアップロードされた値を渡します。 |
CaCloudMarketInstanceId | Alibaba Cloud Marketplace上のインスタンスのID。 | Alibaba Cloud Marketplace |
CaMarketExpriencePlan | Alibaba Cloud Marketplaceでエクスペリエンスプランを有効化するかどうかを指定します。 | エクスペリエンス計画を有効にする場合は、パラメーターを エクスペリエンス計画を有効にしない場合は、パラメーターを |
3. 条件式
条件式を使用して、プラグインなどのシナリオの条件に基づいてパラメーター値を判断できます。
3.1 構文
条件式はSQL文に似ています。 例:
$A > 100および '$B = 'B'
。式の形式は
{Parameter} {Operator} {Parameter}
です。 上記の例では、$a> 100
に変数
または定数
を指定できます。変数
は$
で始まり、コンテキストで定義されたパラメーターを参照します。 たとえば、q1:"Query:q1"
はparameters
で定義されています。 式で変数$q1
を使用できます。 この変数の値は、リクエスト内のq1
クエリパラメーターの値です。定数
には、文字列
、数値
、またはブール値
を指定できます。 例えば、定数は、「Hello」
、「foo」
、100
、− 1
、0,1
、またはtrue
とすることができる。 詳細については、「3.2値タイプと判断ルール」をご参照ください。次の
演算子
がサポートされています。=
および==
: に等しい。<>
と!=
: not equal to。>
、>=
、<
、および<=
: 比較。のように
と! のように
: 特定の文字列が指定されたパターンと一致するかどうかを確認します。 パーセント記号%
は、判断でワイルドカードとして使用されます。 例:$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
を使用して、異なる式を右から左の順序で組み合わせることができます。(
および)
を使用して条件式の優先度を指定できます。を使用できます。You can use
! (
と)
囲まれた式に対して論理否定操作を実行するには、 たとえば、の結果は!(1=1)
はfalse
.次の組み込み関数は、特別なシナリオでの判断に使用されます。
Random()
: 浮動小数点数型のパラメータを生成します。 パラメータ値の範囲は0から1です。 このパラメーターは、blue-greenリリースなど、ランダムな入力が必要なシナリオで使用されます。Timestamp()
:UNIX timestamp
を返します。 UNIXタイムスタンプは、1970年1月1日木曜日00:00:00から経過したミリ秒数です。TimeOfDay()
: GMTの現在の日の00:00から経過したミリ秒数を返します。
3.2 値のタイプと判断ルール
次の値型が式でサポートされています。
STRING
: 値は、一重引用符 (') または二重引用符 (") で囲まれた文字列です。 例:"Hello"
と'Hello'
。NUMBER
: 値は整数または浮動小数点数です。 例:1001
、-1
、0.1
、および-100.0
BOOLEAN
: 値はブール値です。 例:true
およびfalse
。
演算子タイプが
等しい
、等しくない
、および比較
の場合、次の判断ルールが適用されます。STRING
型: 文字列の順序を使用して判断します。 例:'123' > '10000'
: 結果は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です。
演算子の型が
等しい
、等しくない
、およびcomparison
の場合、演算子の前後の値の型が異なる場合、次の判断ルールが適用されます。STRING NUMBER
: たとえば、演算子の前の値はSTRING型で、演算子の後の値はNUMBER
型です。 演算子前の値タイプをNUMBERに変更できる場合は、数値を使用して判断します。 それ以外の場合は、文字列順序を使用して判断します。 例:'100' == 100.0
: 結果はtrueです。'-100' > 0
: 結果はfalseです。
STRING BOOLEAN
: たとえば、演算子の前の値はSTRING型で、演算子の後の値はBOOLEAN
型です。 演算子の前の値タイプをBOOLEANに変更でき、その値が大文字と小文字を区別しない場合は、true
とfalse
を含むBOOLEAN
値を使用して判断します。 それ以外の場合は、の判断結果を除きます。!=
、他のすべての判断結果はfalse
. 例:'True' == true
: 結果はtrueです。'False' == false
: 結果はtrueです。'bad' == false
: 結果はfalseです。「悪い」! =false
: 結果は真です。 演算子の前の値が真
またはfalse
の結果のみ!=
は真
.「悪い」! =true。
結果は真です。'0' > false
: 結果はfalseです。'0' <= false
: 結果はfalseです。
NUMBER BOOLEAN
: 演算子の前の値がNUMBER型で、演算子の後の値がBOOLEAN型の場合、結果は常にfalse
になります。
null
値は、パラメーターが空かどうかを確認するために使用されます。 演算子タイプが等しい
、等しくない
、および比較
の場合、次の判断ルールが適用されます。が
$A
変数が空の場合、$A == null
はtrueであり、の結果は$A! =null
はfalseです。空の文字列
''
がnull
と等しくない場合、'' == null
の結果はfalse
で、'' == ''
の結果はtrue
です。comparison
演算子タイプの場合、演算子の両側の値がnull
の場合、結果はfalse
になります。
のように
と! のように
演算子は、プレフィックス、サフィックス、および文字列の包含を一致させるために使用されます。 次の判断ルールが適用されます。式では、演算子の後の値は
STRING
型の定数でなければなりません。 例:'/users/%' のような $Path
文字列の接頭辞、接尾辞、または包含を一致させるために、演算子の後の値の
'%'
ワイルドカード文字が使用されます。 例:プレフィックスマッチング:
'/users/%' のような $パス
と$パス! '/admin/%' のように
.接尾辞マッチング:
'% search' のような $q1
と$q1! '%.do' のように
.包含関係マッチング:
'% 400%' のような $ErrorCode
と$ErrorCode! '% 200%' のように
.
演算子の前の値の型が
NUMBER
またはBOOLEAN
でない場合は、型をSTRING
に変更して判断を行います。演算子の前の値が
null
の場合、結果はfalse
になります。
in_cidr
と! in_cidr
演算子は、IPアドレスがCIDRブロックにあるかどうかを確認するために使用されます。 次の判断ルールが適用されます。演算子の後の値は、
STRING
型の定数で、IPv4またはIPv6 CIDRブロックである必要があります。 例:$ClientIP in_cidr '10.0.0.0/8 '
$ClientIP! in_cidr '0:0:0:0:0:FFFF::/96'
演算子の前の値の型が
STRING
の場合、その値はIPv4 CIDRブロックとして判断されます。演算子の前の値型が
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/24
にあるかどうかを確認します。
parameters:
UserName: "Token:UserName"
ClientIp: "System:CaClientIp"
$UserName = 'Admin' and $CaClientIp in_cidr '47.47.XX.XX/24'
次の式の結果がtrueの場合、CaAppIdパラメーターは1001、1098、または2011に設定され、APIリクエストで使用されるプロトコルはHTTPSです。
parameters:
CaAppId: "System:CaAppId"
HttpSchema: "System:CaHttpSchema"
$CaHttpScheme = 'HTTPS' and ($CaAppId = 1001 or $CaAppId = 1098 or $CaAppId = 2011)`
次の式の結果がtrueの場合、
JSON形式
の本文には、レスポンス内のStatusCodeが200されたときに値がok
ではないresult_code
パラメーターが含まれます。
parameters:
StatusCode: "StatusCode"
ResultCode: "BodyJsonField:$.result_code"
$StatusCode = 200 and ($ResultCode <> null and $ResultCode <> 'ok')
5. 制限事項
プラグインには最大16個のパラメーターを指定できます。
1つの条件式に最大512文字を含めることができます。
BodyJsonFieldで指定されたリクエストまたはレスポンス本文のサイズは、16 KBを超えることはできません。 それ以外の場合、設定は有効になりません。