Application Load Balancer(ALB)Ingress の基本的なルーティングルールは、静的ルーティングに適しています。たとえば、固定パスに基づいてルーティングを構成したり、リクエストヘッダーでトラフィックをフィルタリングしたりできます。ただし、ALB Ingress の基本的なルーティングルールでは、多数のルーティングルールが必要な場合やビジネスロジックが複雑な場合のトラフィックルーティング要件を満たせない場合があります。Alibaba Cloud は、プログラム可能なスクリプト機能である AScript を提供しており、前述のシナリオでのルーティングルールの構成を簡素化できます。AScript は、正規表現に基づくコンテンツマッチング、機密コンピューティング、コンテンツの書き換えなどの動的ロジック処理機能を提供します。このトピックでは、AScript を使用して ALB Ingress のルーティングルールを構成する方法について説明し、例を示します。
サンプルシナリオ
企業は ALB Ingress を使用して外部サービスを提供しており、異常なリクエストが頻繁に発生しています。悪意のあるリクエストと未確認のリクエストが多数発生すると、バックエンドサーバーの負荷が大幅に増加します。その結果、アプリケーションの応答速度が低下し、ユーザーエクスペリエンスが低下します。企業は、次のルールに基づいて異常なリクエストをブロックするように ALB Ingress を構成します。
ALB Ingress は、リクエストを受信すると、リクエストが次の要件を満たしているかどうかを確認します。
クライアントは、
example.comドメイン名を使用して ALB Ingress にアクセスします。リクエストの URI は
/order/createで始まります。HTTP リクエストの User-Agent(UA)ヘッダーには、
trusted文字列が含まれていません。
リクエストが上記の要件を満たしている場合、ALB Ingress は HTTP ステータスコードを 403 に設定し、次の応答メッセージを返します:The order data is abnormal。それ以外の場合、ALB Ingress はリクエストをバックエンドサービスに転送します。
ALB はドメイン名と URL に基づいてトラフィックをルーティングする転送ルールをサポートしていますが、詳細なユーザー行動分析における ALB の機能は限られています。AScript を使用すると、詳細なユーザー行動分析の要件を満たすことができます。詳細については、「手順」をご参照ください。
課金
デフォルトでは、AScript は ConfigMap の scriptContent パラメーターに 25 行のコードの無料クォータを提供します。コード行を追加すると、超過分に対して課金されます。課金ルールの詳細については、「ALB 課金ルール」をご参照ください。
前提条件
ALB Ingress コントローラーがクラスターにインストールされており、コンポーネントのバージョンが 2.15.0 以降です。詳細については、「ALB Ingress コントローラーの管理」をご参照ください。
説明ALB Ingress を使用して ACK 専用クラスター にデプロイされたサービスにアクセスするには、まず、クラスターに ALB Ingress コントローラーへのアクセス権限を付与する必要があります。詳細については、「ACK 専用クラスターに ALB Ingress コントローラーへのアクセスを承認する」をご参照ください。
kubectl クライアントが ACK クラスターに接続されています。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
AlbConfig と IngressClass が作成されています。詳細については、「ALB Ingress を作成する」をご参照ください。
手順
AScript を使用して ALB Ingress を構成する場合は、AScript を使用して ConfigMap にスクリプトを構成し、使用する AlbConfig に ConfigMap を関連付ける必要があります。
ConfigMap にスクリプトを構成する
ascript_configmap.yaml という名前のファイルを作成し、次のコードをファイルにコピーします。
次のサンプルコードは、AScript を使用して作成されたスクリプトの例を示しています。サンプルシナリオ セクションで説明されている問題を解決するために、このスクリプトを使用できます。リクエストが
host example.comhostから送信され、リクエスト URL に/order/createが含まれ、リクエストのUAヘッダーにtrusted文字列が含まれていない場合、ALB Ingress は HTTP ステータスコード 403 と ConfigMap で指定されたエラーメッセージを返します。この例では、5 行のコードが指定されています。AScript の構文と変数の詳細については、「参考資料」をご参照ください。
apiVersion: v1 kind: ConfigMap metadata: name: ascript-rule namespace: default data: scriptContent: | if and(eq($host,'example.com'),eq(get(split($request_uri, '?'),1),'/order/create')){ if not(match_re($http_user_agent,'.*trusted.*')){ exit(403,'{"code":10063,"msg":"The order data is abnormal","data":{}}') } }次のコマンドを実行して、ConfigMap を作成します。
kubectl apply -f ascript_configmap.yaml
スクリプトを AlbConfig に関連付ける
次のコマンドを実行して、AlbConfig を変更します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> を AlbConfig の名前に置き換えます。aScriptConfigフィールドを AlbConfig 構成に追加して、スクリプトを AlbConfig に関連付けます。変更を保存して終了すると、スクリプトが有効になります。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: default spec: config: name: alb-test-1 addressType: Intranet listeners: - port: 80 protocol: HTTP aScriptConfig: # スクリプトの詳細。 - aScriptName: ascript-rule # スクリプトの名前。 enabled: true # スクリプトを有効にするかどうかを指定します。 position: RequestFoot # スクリプトを実行する位置。RequestFoot の値は、Ingress のルーティングルールが適用された後にスクリプトが実行されることを指定します。 configMapNamespace: default # スクリプトを格納する ConfigMap の名前空間。説明AScript を使用して構成されたスクリプトの実行位置の詳細については、「AScript」をご参照ください。
結果の確認
次のコマンドを実行して、ALB Ingress にアクセスします。応答に
403 Forbiddenエラーコードと{"code":10063,"msg":"The order data is abnormal","data":{}}エラーメッセージが含まれている場合、AScript を使用して構成されたスクリプトが有効になっています。curl -v -H "Host:example.com" -H "User-Agent:suspicious test" http://<ドメイン名>/order/create
ALB コンソール で、ALB インスタンスのリスナーに構成されているスクリプトを表示できます。

参考資料
AScript の構文の詳細については、「AScript 構文」をご参照ください。
AScript のビルトイン関数と変数の詳細については、「AScript ビルトイン変数」および「AScript ビルトイン関数」をご参照ください。