サービスメッシュ内でのトラフィックルーティング時、トレーシング ID の挿入、セキュリティポリシーの適用、またはサービス間でのメタデータの受け渡しなど、多くの場合に HTTP ヘッダーの操作が必要になります。Service Mesh (ASM) では、VirtualService カスタムリソース定義 (CRD) の headers フィールドを活用し、ルートレベルで HTTP ヘッダーを操作できます。アプリケーションコードを変更することなく、リクエストおよびレスポンスの両方に対してヘッダーの追加、上書き、削除が可能です。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
HTTPBin アプリケーションがご利用の ASM インスタンスにデプロイ済みであること。手順については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
ヘッダー操作のリファレンス
VirtualService では、ヘッダー操作として以下の 3 種類がサポートされています。
|
操作 |
YAML フィールド |
動作 |
値の型 |
|
|
|
指定された値でヘッダーを追加します。該当ヘッダーが存在しない場合は新規作成されます。 |
|
|
|
|
ヘッダーの値を上書きします。該当ヘッダーが存在しない場合は新規作成されます。 |
|
|
|
|
ヘッダーを完全に削除します。 |
|
静的および動的なヘッダー値
ヘッダー値は、静的な文字列または % 記号で囲まれた動的な Envoy コマンド演算子のいずれかを指定できます。たとえば、%UPSTREAM_CLUSTER% はサービスプロバイダーの名前を示します。アクセスログで使用可能なすべての HTTP コマンド演算子は、カスタムリクエストまたはレスポンスヘッダーでも指定可能です。
|
変数 |
説明 |
|
|
リクエスト開始時のタイムスタンプ |
|
|
アップストリームサービスクラスターの名前 |
利用可能な変数の一覧については、Envoy ドキュメントの「コマンド演算子」をご参照ください。
ヘッダー操作の構成
以下の VirtualService 構成例では、リクエストおよびレスポンスの両方のヘッダーに対して、上記の 3 種類の操作をすべて実行しています。
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
この構成により、以下のような変更が適用されます。
リクエストヘッダー
-
追加:静的値
custom-valueを持つx-custom-request-headerを追加します。 -
追加:
%START_TIME%からランタイムで解決されるリクエスト開始時のタイムスタンプを値とするx-dynamic-request-headerを追加します。 -
上書き:
x-another-request-headerを値another-valueで上書きします。該当ヘッダーが存在しない場合は新規作成されます。 -
削除:
x-unwanted-headerを完全に削除します。
レスポンスヘッダー
-
追加:
x-custom-response-headerを値custom-response-valueで追加します。 -
上書き:
x-another-response-headerを値another-response-valueで上書きします。該当ヘッダーが存在しない場合は新規作成されます。 -
削除:
x-unwanted-response-headerを完全に削除します。
VirtualService CRD を使用して HTTP ヘッダーの設定および変更が可能です。ただし、Envoy のアクセスログがデフォルト設定のままの場合、これらの変更はアクセスログに記録されません。カスタムヘッダーを Envoy のアクセスログに記録したい場合は、Envoy のログフォーマットを変更する必要があります。
アクセスログにおけるカスタムヘッダーの検証
ASM では、ログフォーマットのカスタマイズが可能です。アクセスログのカスタム式では、リクエストヘッダー、レスポンスヘッダー、および Envoy の組み込み値から値を取得できます。手順については、「アクセスログのフォーマットのカスタマイズ」をご参照ください。
アクセスログフォーマットに以下のフィールドを追加してください。
|
フィールド名 |
型 |
ログフォーマット式 |
|
|
リクエスト属性 |
|
|
|
リクエスト属性 |
|
|
|
レスポンス属性 |
|
VirtualService で変更されたレスポンスヘッダーは、Envoy のフィルターチェーンにおいてログ記録ステップの後に変更が適用されるため、アクセスログに表示されない場合があります。これは想定される動作であり、構成ミスではありません。以下の HTTPBin Pod の例をご参照ください。
ログフォーマットを更新した後、ゲートウェイ Pod および HTTPBin Pod の両方のアクセスログを確認してください。
ゲートウェイ Pod のアクセスログ
ゲートウェイ Pod では、リクエストおよびレスポンスの両方のヘッダー変更が記録されます。
{
"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 Pod のアクセスログ
HTTPBin のサイドカーでは、VirtualService によるレスポンスヘッダーの変更がサイドカーのログ記録ポイントより後に適用されるため、追加されたレスポンスヘッダーは記録されません。my-x-custom-response-header フィールドには - が表示されます。
{
"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": "-"
}