HTTP から HTTPS へのリダイレクトの設定

この例では、URL リダイレクトを使用して、すべてのリクエストをポート 80(HTTP)からポート 443(HTTPS)にリダイレクトする方法について説明します。

HTTPS は、TLS(SSL)を使用して HTTP リクエストとレスポンスを暗号化し、通信を保護します。HTTPS を使用するウェブサイトでは、URL の先頭に http:// ではなく https:// が付いています。

アーキテクチャ

HTTP トラフィックを HTTPS にリダイレクトするには、次の手順を行う必要があります。

  1. (前提条件)ポート 443 で HTTPS トラフィックをすでに提供している外部 HTTPS ロードバランサ(ここでは LB1)が必要です。
  2. 部分的な外部 HTTP ロードバランサ(ここでは LB2)を作成します。LB2 の設定は次のとおりです。

    • バックエンドなし
    • LB1 と同じフロントエンド IP アドレス
    • URL マップに構成されたリダイレクト

次の図に、このアーキテクチャを示します。

HTTP から HTTPS へのリダイレクト構成(クリックして拡大)
HTTP から HTTPS へのリダイレクト構成

前提条件: 外部 HTTPS ロードバランサ(LB1)の設定

外部 HTTPS ロードバランサがまだ構成されていない場合は、次のいずれかのガイドを使用して設定を完了します。バックエンドのタイプに応じて手順を選択します。

すでに HTTPS ロードバランサが動作している場合は、HTTPS ロードバランサへのトラフィックのリダイレクトに進んでください。

HTTPS ロードバランサへのトラフィックのリダイレクト

外部 HTTPS ロードバランサ(LB1)が動作していることを確認したら、部分的な外部 HTTP ロードバランサ(LB2)を作成し、トラフィックを LB1 にリダイレクトするようにフロントエンドを構成できます。

この例では、301 レスポンス コードを使用しています。別のレスポンス コードを使用することもできます。

gcloud でリダイレクトを構成するには、YAML ファイルをインポートし、ターゲット HTTP プロキシがトラフィックをリダイレクトする URL マップを参照するように設定する必要があります。Cloud Console を使用している場合、この処理は自動的に行われます。

Console

構成を開始する

  1. Google Cloud Console で、[Cloud Load balancing] ページに移動します。

    [Cloud Load balancing] に移動

  2. [HTTP(S) 負荷分散] で [構成を開始] をクリックします。
  3. [インターネットから自分の VM へ] をオンにし、[続行] をクリックします。
  4. ロードバランサの名前を入力します(例: http-redirect)。
  5. ウィンドウを開いたままにして続行します。

バックエンド構成をスキップする

  1. [バックエンドの構成] セクションをスキップします。
    このロードバランサにバックエンドは必要ありません。

URL マップでリダイレクトを構成する

  1. ページの左側の列で、[ホストとパスのルール] をクリックします。
  2. [詳細なホストとパスのルール(URL リダイレクト、URL の書き換え)] を選択します。
  3. [アクション] で、[クライアントを別のホスト / パスにリダイレクト] を選択します。
  4. [接頭辞のリダイレクト] フィールドは空欄のままにします。
  5. [パス リダイレクト] で、[接頭辞のリダイレクト] を選択します。
  6. [パス値] は空欄のままにします。
  7. [リダイレクトのレスポンス コード] で、[301 - Moved Permanently(恒久的に移動した)] を選択します。
  8. [HTTPS リダイレクト] で、[有効] を選択します。
  9. [完了] をクリックします。
  10. ロードバランサ構成ページを開いたままにして続行します。

LB1 で使用されている IP アドレスで HTTP 転送ルールを構成する

  1. ロードバランサの構成ページで、[フロントエンドの構成] をクリックします。
  2. [プロトコル] を HTTP に設定します。
  3. [IP アドレス] に、HTTPS ロードバランサに使用した IP アドレスを設定します。
  4. [ポート] が 80 に設定され、HTTP トラフィックが許可されていることを確認します。
  5. [完了] をクリックします。
  6. ウィンドウを開いたままにして続行します。

構成を確認する

  1. 左側のパネルで、[確認と完了] をクリックします。
  2. 現在の設定と作成しようとしている内容を比較します。
  3. 設定に問題がない場合は、[作成] をクリックします。

gcloud

  1. YAML ファイル /tmp/web-map-http.yaml を作成します。この例では、レスポンス コードとして MOVED_PERMANENTLY_DEFAULT を使用しています。

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
      redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
      httpsRedirect: True
    tests:
    - description: Test with no query parameters
      host: foobar
      path: /test/
      expectedOutputUrl: https://foobar/test/
      expectedRedirectResponseCode: 301
    - description: Test with query parameters
      host: foobar
      path: /test/?parameter1=value1&parameter2=value2
      expectedOutputUrl: https://foobar/test/?parameter1=value1&parameter2=value2
      expectedRedirectResponseCode: 301
    
  2. URL マップを検証します。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    テストに合格し、コマンドによって成功メッセージが出力された場合は、URL マップに変更を保存します。

  3. YAML ファイルをインポートして、HTTP ロードバランサの URL マップを作成します。この URL マップの名前は web-map-http です。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

    既存の URL マップを更新する場合、次のプロンプトが表示されます。

    Url Map [web-map-http] will be overwritten.
    
    Do you want to continue (Y/n)?
    

    続行するには [Y] を押します。

  4. URL マップが更新されていることを確認します。HTTP ロードバランサの URL マップは次のようになります。

    gcloud compute url-maps describe web-map-http
    
    creationTimestamp: '2020-03-23T10:53:44.976-07:00'
    defaultUrlRedirect:
     httpsRedirect: true
     redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
    fingerprint: 3A5N_RLrED8=
    id: '2020316695093397831'
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  5. web-map-http を URL マップとして使用して、新しいターゲット HTTP プロキシを作成するか、既存のターゲット HTTP プロキシを更新します。

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=web-map-http \
       --global
    

    または

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  6. 受信リクエストをプロキシにルーティングするグローバル転送ルールを作成します。--address フラグで lb-ipv4-1 を指定します。これは、外部 HTTPS ロードバランサに使用されるものと同じ IP アドレスです。

    gcloud compute forwarding-rules create http-content-rule \
       --address=lb-ipv4-1 \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    

完了すると、Cloud Console に次の 2 つのロードバランサが表示されます。

両方のロードバランサ

Cloud Console には、web-map-httpロードバランサに関する情報が次のように表示されます。

HTTP ロードバランサ

カスタム ヘッダーの追加

必要に応じて、HTTPS ロードバランサのバックエンド サービスに HTTP Strict-Transport-Security ヘッダーを次のように追加します。

  • ヘッダー名: Strict-Transport-Security
  • ヘッダー値: max-age=31536000; includeSubDomains; preload

この設定でカスタム ヘッダーがクライアントに送信され、次回クライアントが HTTP 経由で URL にアクセスしようとすると、ブラウザはリダイレクトします。

カスタム ヘッダーをバックエンド サービス構成に追加するには、次のように --custom-response-header フラグを使用します。

gcloud compute backend-services update BACKEND_SERVICE_NAME_LB1 \
    --global \
    --custom-response-header='Strict-Transport-Security:max-age=31536000; includeSubDomains; preload'

詳細については、カスタム ヘッダーの作成をご覧ください。

HTTP から HTTPS へのリダイレクトをテストする

両方のロードバランサで使用している予約済みの IP アドレスをメモします。

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

この例では、予約済みの IP アドレスが 34.98.77.106 であるとしています。http://34.98.77.106/ URL は https://34.98.77.106/ にリダイレクトされます。

数分経過したら、次の curl コマンドを実行してテストします。

curl -v http://hostname.com

出力例:

* Connected to 34.98.77.106 (34.98.77.106) port 80 (#0)
> GET / HTTP/1.1
> Host: hostname.com
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Referrer-Policy: no-referrer
< Location: https://hostname.com
< Content-Length: 220
< Date: Fri, 30 Jul 2021 21:32:25 GMT
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://hostname.com">here</A>.
</BODY></HTML>
* Connection #0 to host hostname.com left intact