Service Mesh(ASM)では、VirtualService CustomResourceDefinition(CRD)の headers フィールドを使用して、リクエストヘッダーとレスポンスヘッダーをカスタマイズできます。 VirtualService CRD を使用すると、ルートレベルで HTTP ヘッダーを追加、変更、または削除できます。 これにより、ヘッダー情報のカスタマイズされた処理が実装されます。
前提条件
HTTPBin アプリケーションがデプロイされています。 詳細については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
ステップ 1:VirtualService CRD を定義する
VirtualService は、リクエストヘッダーとレスポンスヘッダーの単純な追加、変更、削除など、ほとんどの一般的なヘッダー操作要件を満たすことができます。 たとえば、ヘッダー値を固定の静的文字列に設定できます。 さらに、組み込み式を使用して、リクエストヘッダー値とレスポンスヘッダー値を動的に生成できます。 これらの式は通常 % 記号で囲まれ、リクエスト属性などのさまざまな動的コンテンツを参照できます。 ログにアクセスするために使用されるすべての HTTP コマンド演算子は、カスタムリクエストヘッダーまたはレスポンスヘッダーで指定できます。 たとえば、%UPSTREAM_CLUSTER% はサービスプロバイダーの名前を示します。 詳細については、「Command Operators」をご参照ください。
ルーティングルールに基づいて、リクエストとレスポンスの HTTP ヘッダーをカスタマイズできます。 これは、トレース、ロギング、セキュリティヘッダーの追加、特定のサービスロジックの実装などのシナリオで役立ちます。 次のセクションでは、VirtualService の構成例を示します。 この例では、リクエストヘッダーとレスポンスヘッダーをカスタマイズする方法を示します。
種類 | 説明 |
リクエストヘッダー |
|
レスポンスヘッダー |
|
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin-vs
spec:
gateways:
- httpbin
hosts:
- '*'
http:
- route:
- destination:
host: httpbin
port:
number: 8000
weight: 100
headers:
request:
add:
x-custom-request-header: "custom-value" # カスタムリクエストヘッダーを追加します。
x-dynamic-request-header: "%START_TIME%" # カスタムリクエストヘッダーを追加します。
set:
x-another-request-header: "another-value" # リクエストヘッダーを変更または設定します。
remove:
-x-unwanted-header # リクエストヘッダーを削除します。
response:
add:
x-custom-response-header: "custom-response-value" # カスタムレスポンスヘッダーを追加します。
set:
x-another-response-header: "another-response-value" # レスポンスヘッダーを変更または設定します。
remove:
-x-unwanted-response-header # レスポンスヘッダーを削除します。
VirtualService CRD を使用して、HTTP ヘッダーを設定および変更できます。 ただし、Envoy がアクセスログのデフォルト設定を保持している場合、Envoy アクセスログにはこれらの変更は記録されません。 Envoy アクセスログにカスタムヘッダーを記録する場合は、Envoy のログ形式を変更する必要があります。
ステップ 2:アクセスログでカスタムリクエストヘッダーとレスポンスヘッダーを表示する
ASM では、ログ形式をカスタマイズできます。 アクセスログのカスタム式は、リクエストヘッダー、レスポンスヘッダー、および Envoy の組み込み値から値を取得できます。 詳細については、「アクセスログの形式のカスタマイズ」をご参照ください。
次の表に、アクセスログにコンテンツを表示するために使用される 3 つの新しいフィールドを示します。
フィールド | 種類 | 値 |
my-x-custom-request-header | リクエスト属性 | %REQ(x-custom-request-header)% |
my-x-dynamic-request-header | リクエスト属性 | %REQ(x-dynamic-request-header)% |
my-x-custom-response-header | レスポンス属性 | %RESP(x-custom-response-header)% |
VirtualService で、レスポンスヘッダーの変更がロギング後に有効になる場合、これらの変更されたレスポンスヘッダーはアクセスログに記録されません。
ゲートウェイ ポッドのアクセスログを確認すると、次のような内容が表示されます。
{ "bytes_received": "9", "bytes_sent": "33", "response_code": "200", "my-x-custom-request-header": "custom-value", "my-x-dynamic-request-header":"2024-01-16T14:49:21.187Z" "my-x-custom-response-header": "custom-response-value" }HTTPBin ポッドのアクセスログを確認すると、次のような内容が表示されます。
{ "bytes_received": "9", "bytes_sent": "33", "response_code": "200", "my-x-custom-request-header": "custom-value", "my-x-dynamic-request-header": "2024-01-16T14:49:21.187Z" "my-x-custom-response-header": "-" }