Gateway APIで作成したロードバランサーにHTTPSリダイレクトを構成する

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では、GKE で Gateway API を使用して作成したアプリケーションロードバランサーに対して、HTTP リクエストを HTTPS にリダイレクトするように設定する手順を解説します。

はじめに

Gateway API について

Gateway API は、Kubernetes でレイヤ7の高度なトラフィックルーティングを提供するための Kubernetes アドオンであり、Google Cloud では GKE で L7 ロードバランサー(アプリケーションロードバランサー)を利用したい場合に使用されます。

従来から同様の用途で使用されていた Ingress API に様々な改良が加えられたものであり、高度なルーティング(ヘッダーベース、重み付けなど)や、異なる Namespace にあるリソースへのアクセスなどがネイティブにサポートされています。

Gateway API の基本については以下の記事を参照してください。

blog.g-gen.co.jp

アプリケーションロードバランサーの HTTPS リダイレクト機能

Google Cloud で提供されているアプリケーションロードバランサーには、ロードバランサーに対する HTTP リクエストを HTTPS にリダイレクトする(HTTPS を強制する)機能があります。

この機能では、HTTPS リクエストを処理するように構成されたロードバランサーに加えて、そのロードバランサーに対して HTTP リクエストをリダイレクトするためのロードバランサーが構成されます。この2つのロードバランサーは同一の IP アドレスを持ちます。

リダイレクト用のロードバランサーは HTTP リクエストを受信し、そのリクエストを HTTPS リクエストを処理するロードバランサーにリダイレクトする役割を持ちます。これにより、バックエンドサービスのユーザーに HTTPS の使用を強制することができます。

HTTPS リダイレクトの動作イメージ

Gateway API における HTTPS リダイレクト機能

GKE で Gateway API を使用してアプリケーションロードバランサーを作成する場合でも、HTTPS リダイレクト機能を利用することができます。

Gateway API で作成されるロードバランサーの種類を定義する GatewayClass と、それぞれの HTTPS リダイレクト機能のサポート状況を以下の表に示します。

GatewayClass ロードバランサーの種類 HTTPS リダイレクトのサポート
gke-l7-global-external-managed グローバル外部アプリケーション ロードバランサー
gke-l7-global-external-managed-mc グローバル外部アプリケーション ロードバランサー(マルチクラスタ)
gke-l7-regional-external-managed リージョン外部アプリケーション ロードバランサー
gke-l7-regional-external-managed-mc リージョン外部アプリケーション ロードバランサー(マルチクラスタ)
gke-l7-rilb 内部アプリケーション ロードバランサー
gke-l7-rilb-mc 内部アプリケーション ロードバランサー(マルチクラスタ)
gke-l7-gxlb 従来のアプリケーション ロードバランサー ×
gke-l7-gxlb-mc 従来のアプリケーション ロードバランサー ×

当記事の構成について

当記事では、以下の記事で作成した Gateway API リソースと nginx のバックエンドを持つ環境に対して、HTTPS リダイレクトを追加で構成していきます。以降の手順の前提となるサンプル環境を構成するためのマニフェストファイルについては、同記事を参照してください。

blog.g-gen.co.jp

当記事で前提となるサンプル構成

HTTPS リダイレクト用の HTTPRoute リソースを追加する

HTTPS リダイレクト構成前の動作確認

サンプル構成では HTTPS リダイレクトを構成しておらず、また Gateway リソースに HTTP リスナーを設定していないため、HTTP リクエストがロードバランサーを通過することはありません。

HTTPS リダイレクトを構成していない場合は HTTP でサービスにアクセスできない

HTTPS リダイレクト専用の Namespace を作成する

まず、HTTPS リダイレクト用の HTTPRoute を作成するための Namespace を作成します。

HTTPS リダイレクト用の HTTPRoute リソースは、Gateway リソースと別の Namespace に作成する必要があります。もし両方とも同じ Namespace に作成した場合、Gateway が受信した HTTP リクエストは HTTPS にリダイレクトされず、そのままバックエンドサービスにルーティングされてしまいます。

# redirect-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: http-redirect
  labels:
    otherInfra: httpToHttps

Gateway リソースに HTTP 用のリスナーを記述する

Gateway リソースを定義しているサンプル構成のマニフェストファイル(gateway.yaml)に対して、以下のように HTTP 用のリスナーを追記します。HTTP のリスナーとして、先ほど作成した HTTPS リダイレクト用 Namespace の HTTPRoute リソースを指定しておくことがポイントです。

# gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: external-https-gateway
  annotations:
    networking.gke.io/certmap: "my-cert-map"
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
  - name: https-listener
    protocol: HTTPS
    port: 443
  - name: http-listener  # HTTP 用のリスナーを追加する
    protocol: HTTP
    port: 80
    allowedRoutes:
      kinds:
      - kind: HTTPRoute
      namespaces:
        from: Selector
        selector:
          matchLabels:
            otherInfra: httpToHttps  # リダイレクト用 Namespace のラベル

このマニフェストファイルを適用すると、HTTPS 用のロードバランサーとは別に、HTTP をリダイレクトするためのロードバランサーも作成されます。

リダイレクト用のロードバランサーが作成される

リダイレクト用の HTTPRoute リソースを作成する

HTTPS リダイレクト用の設定を定義した、新たな HTTPRoute リソースを作成します。マニフェストファイルは以下のようになります。

# http-redirect.yaml
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: http-redirect
  namespace: http-redirect  # リダイレクト用 Namespace に作成する
spec:
  parentRefs:
  - name: external-https-gateway  # Gateway リソースの名前
    sectionName: http-listener  # Gateway リソースで定義している HTTP リスナーの名前
  rules:
  - filters:
    - type: RequestRedirect  # リクエストをリダイレクトする設定
      requestRedirect:
        scheme: https  # HTTPS にリダイレクトする

作成した HTTPRoute リソースの設定を確認すると、Spec.Rules にリダイレクトの設定が存在することが確認できます。

# 作成した HTTPS リダイレクト用 HTTPRoute の設定を確認する
$ kubectl describe httproutes -n http-redirect
Name:         http-redirect
Namespace:    http-redirect
Labels:       <none>
Annotations:  <none>
API Version:  gateway.networking.k8s.io/v1
Kind:         HTTPRoute
Metadata:
  Creation Timestamp:  2025-08-31T07:47:01Z
  Generation:          2
  Resource Version:    1756626613357455008
  UID:                 143532f1-8f96-4b95-bd28-8294d21e38eb
Spec:
  Parent Refs:
    Group:         gateway.networking.k8s.io
    Kind:          Gateway
    Name:          external-https-gateway
    Namespace:     default
    Section Name:  http-listener
  Rules:
    Filters:
      Request Redirect:
        Scheme:       https
        Status Code:  302
      Type:           RequestRedirect
    Matches:
      Path:
        Type:   PathPrefix
        Value:  /

動作確認

まず、ブラウザから HTTP でアクセスしてみます。HTTPS でサービスに接続できていることがわかります。

HTTP リクエストが HTTPS にリダイレクトされている

リダイレクトの動作を確認するため、curl コマンドで HTTP リクエストを送信してみます。HTTP/1.1 302 Foundhttps://example.com:443/ より、リクエストが HTTPS にリダイレクトされていることがわかります。

# ロードバランサーに HTTP リクエストを送信してリダイレクトの動作を確認する
$ curl -v http://example.com
  
----- 出力例 -----
*   Trying xxx.xxx.xxx.xxx:80...
* Connected to example.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.88.1
> Accept: */*
> 
< HTTP/1.1 302 Found
< Cache-Control: private
< Location: https://example.com:443/
< Content-Length: 0
< Date: Sun, 31 Aug 2025 07:53:13 GMT
< Content-Type: text/html; charset=UTF-8
< 
* Connection #0 to host example.com left intact

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。