すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:VirtualService を用いたリクエストおよびレスポンスヘッダーのカスタマイズ

最終更新日:Mar 12, 2026

サービスメッシュ内でのトラフィックルーティング時、トレーシング ID の挿入、セキュリティポリシーの適用、またはサービス間でのメタデータの受け渡しなど、多くの場合に HTTP ヘッダーの操作が必要になります。Service Mesh (ASM) では、VirtualService カスタムリソース定義 (CRD) の headers フィールドを活用し、ルートレベルで HTTP ヘッダーを操作できます。アプリケーションコードを変更することなく、リクエストおよびレスポンスの両方に対してヘッダーの追加、上書き、削除が可能です。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

ヘッダー操作のリファレンス

VirtualService では、ヘッダー操作として以下の 3 種類がサポートされています。

操作

YAML フィールド

動作

値の型

add

headers.request.add / headers.response.add

指定された値でヘッダーを追加します。該当ヘッダーが存在しない場合は新規作成されます。

map<string, string>

set

headers.request.set / headers.response.set

ヘッダーの値を上書きします。該当ヘッダーが存在しない場合は新規作成されます。

map<string, string>

remove

headers.request.remove / headers.response.remove

ヘッダーを完全に削除します。

string[]

静的および動的なヘッダー値

ヘッダー値は、静的な文字列または % 記号で囲まれた動的な Envoy コマンド演算子のいずれかを指定できます。たとえば、%UPSTREAM_CLUSTER% はサービスプロバイダーの名前を示します。アクセスログで使用可能なすべての HTTP コマンド演算子は、カスタムリクエストまたはレスポンスヘッダーでも指定可能です。

変数

説明

%START_TIME%

リクエスト開始時のタイムスタンプ

%UPSTREAM_CLUSTER%

アップストリームサービスクラスターの名前

ヘッダー操作の構成

以下の 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 の組み込み値から値を取得できます。手順については、「アクセスログのフォーマットのカスタマイズ」をご参照ください。

アクセスログフォーマットに以下のフィールドを追加してください。

フィールド名

ログフォーマット式

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 で変更されたレスポンスヘッダーは、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": "-"
}