概要

Amazon Elastic Kubernetes Service (EKS)で使用可能な、AWS Load Balancer Controller(LBC)がApplication Load Balancer(ALB)のURLとホストヘッダーの書き換えに対応しました。

これまでは、URLやホストヘッダーを書き換えるには、独自のアプリケーションロジックを組むか、サードパーティ製のプロキシを導入・管理する必要があり、これはEKSでも同様でした。

この課題に対し、昨年ALB自体に書き換え機能が実装され、続いてLBCもこの機能に対応しました。これにより、追加のアプリ実装などなしに高度なルーティングがAWSのインフラ層(ALB)で実現可能になりました。
※この機能は現時点ではALBでのみサポートされており、他のロードバランサー(例:NLBなど)では使用できません。

本記事では、これらの機能を実装するためのIngressの記述方法を解説します。

LBCの導入経験があり、Ingressの基本的な仕組みを理解している方を対象としています。
LBCの導入方法やIngressの基本について知りたい方は、こちらのiret.media記事「EKS と AWS Load Balancer Controller で実現するPodへのアクセス制御」もあわせてご覧ください。

用語
  • AWS Load Balancer Controller
    • EKSクラスター向けのロードバランサーを管理できるオープンソースのコントローラーで、クラスターアプリケーションを外部に公開できます。
  • Ingress
    • LBCがロードバランサーを作成・管理するための設定を記述するマニフェスト(YAML形式の定義ファイル)です。

対応状況

ALBがURLとホストヘッダーの書き換えに対応したのは、2025年10月中旬頃のため比較的新しい機能です。
こちらのAWS ブログで仕組みやコンソールでの手順が説明されています。

LBCがALBのURLとホストヘッダーの書き換えに対応したのはv2.14.1のため、それ以上のバージョンを使用してください。

記述解説

LBCでURLやホストヘッダーの書き換えを行うためには下記のアノテーションが必要になります。

  • alb.ingress.kubernetes.io/transforms.${transforms-name}
LBC公式の記述例
  • URLの書き換え
alb.ingress.kubernetes.io/transforms.my-service: >
    [
        {
            "type": "url-rewrite",
            "urlRewriteConfig": {
                "rewrites": [
                    {
                        "regex": "^\\/api\\/(.+)$",
                        "replace": "/$1"
                    }
                ]
            }
        }
    ]
  • ホストヘッダーの書き換え
alb.ingress.kubernetes.io/transforms.my-service: >
    [
        {
            "type": "host-header-rewrite",
            "hostHeaderRewriteConfig": {
                "rewrites": [
                    {
                        "regex": "^(.+)\\.example\\.com$",
                        "replace": "$1.example.org"
                    }
                ]
            }
        }
    ]
解説

どちらも、リクエストがregexに一致した場合、一致した部分をreplaceの指定に従い書き換えます。

  • ${transforms-name}は任意の名前を指定できますが、Ingressルール内でルーティングを定義する際のspec.serviceNameと一致させる必要があります。
  • regexはreplaceは正規表現を使用できるため、下記のように/api/を取り除いて残りのパスだけにするなども可能です。
    • 例:/api/users → /users
    • “regex”: “^\\/api\\/(.+)$”
    • “replace”: “/$1”
書き換えの確認

どのように書き換えたいかテストしたい場合、AWSコンソールでテストトランスフォームを使用できます。

  • ロードバランサー > リスナー > ルールを追加する > トランスフォームを追加 > テストトランスフォームを選択(下記画像の矢印)

  • 正規表現(regex)と置換値(replace)を入力し、テスト値に正規表現を含めることでテストできます(画像はホストヘッダーの場合)。

記述例

/example/* に一致するリクエストに対して、ALBはホストヘッダーを S3 バケットのアドレスに書き換えます。

  1. リクエスト:example-load-balancer.elb.ap-northeast-1.amazonaws.com/example/index.html
  2. パスが /example/* に一致するため、ALB がホストヘッダーを以下のように書き換えます。
  3. 実際のリクエスト:example-bucket.s3.ap-northeast-1.amazonaws.com/example/index.html
  • 書き換える部分以外は変更されないため、/example/index.htmlはそのまま残ります。
  • ${transforms-name}とspec.serviceNameを今回の例ではrewriteで一致させています。
alb.ingress.kubernetes.io/transforms.rewrite: >
      [
        {
          "type": "host-header-rewrite",
          "hostHeaderRewriteConfig": {
            "rewrites": [
              {
                "regex": "example-load-balancer.elb.ap-northeast-1.amazonaws.com",
                "replace": "example-bucket.s3.ap-northeast-1.amazonaws.com"
              }
            ]
          }
        }   
      ] 

spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /example/*
            pathType: ImplementationSpecific
            backend:
              service:          
                name: rewrite
                port:
                  number: 443

まとめ

AWS Load Balancer ControllerがURLとホストヘッダーの書き換えに対応したため、Ingressの記述方法を紹介しました。
URLとホストヘッダーの書き換え以外のカスタマイズについては、LBC ドキュメントを参照ください。