Cloud Run、Cloud Functions、または App Engine を使用した Cloud CDN の設定

このページでは、リクエストをサーバーレス バックエンドにルーティングする外部 HTTP(S) ロードバランサの作成方法を説明します。ここでのサーバーレスという用語は、サーバーレス コンピューティング プロダクトである App Engine、Cloud Functions、Cloud Run を意味します。

サーバーレス NEG を使用すると、外部 HTTP(S) 負荷分散を適用した Google Cloud サーバーレス アプリを使用できます。サーバーレス NEG バックエンドを使用してロードバランサを構成した後は、そのロードバランサへのリクエストがサーバーレス アプリのバックエンドにルーティングされるようになります。

サーバーレス NEG の詳細については、サーバーレス NEG の概要をご覧ください。

始める前に

  1. App Engine、Cloud Functions、または Cloud Run のサービスをデプロイする
  2. Google Cloud SDK をインストールする(まだインストールしていない場合)
  3. 権限を構成する
  4. SSL 証明書リソースを追加する

App Engine、Cloud Functions、または Cloud Run のサービスをデプロイする

このページで説明する手順では、Cloud Run、Cloud Functions、または App Engine のサービスをすでに実行中であることを前提としています。

このページの例では、Cloud Run Python クイックスタートを使用して、Cloud Run サービスを us-central1 リージョンにデプロイしています。このページの残りの部分では、サーバーレス NEG バックエンドを使用してこのサービスにリクエストをルーティングする外部 HTTP(S) ロードバランサを設定する方法を説明します。

サーバーレス アプリをまだデプロイしていない場合、またはサンプルアプリでサーバーレス NEG を試す場合は、以下のいずれかのクイックスタートを使用してください。サーバーレス アプリはどのリージョンでも作成できますが、後でサーバーレス NEG とロードバランサを作成する際は、サーバーレス アプリと同じリージョンで作成する必要があります。

Cloud Run

シンプルな Hello World アプリケーションを作成してコンテナ イメージにパッケージ化し、パッケージ化したコンテナ イメージを Cloud Run にデプロイする場合は、クイックスタート: ビルドとデプロイをご覧ください。

サンプル コンテナをすでに Container Registry にアップロードしている場合は、クイックスタート: 事前にビルドされたサンプル コンテナをデプロイするをご覧ください。

Cloud Functions

Cloud Functions: Python クイックスタートをご覧ください。

App Engine

次の Python 3 向け App Engine クイックスタート ガイドをご覧ください。

Google Cloud SDK をインストールする

gcloud コマンドライン ツールをインストールします。このツールのコンセプトとインストールについては、gcloud の概要をご覧ください。

これまで gcloud コマンドライン ツールを実行したことがない場合は、gcloud init を実行して gcloud ディレクトリを初期化します。

権限を構成する

このガイドに沿って作業を進めるには、プロジェクト内でサーバーレス NEG と外部 HTTP(S) ロードバランサを作成する必要があります。そのためにはプロジェクトのオーナーまたは編集者であるか、または次の Compute Engine IAM ロールを持っている必要があります。

タスク 必要なロール
ロードバランサとネットワーク コンポーネントの作成 ネットワーク管理者
NEG の作成と変更 Compute インスタンス管理者
SSL 証明書の作成と変更 セキュリティ管理者

外部 IP アドレスの予約

この段階でサービスは実行中なので、顧客がロードバランサにアクセスするために使用するグローバル静的外部 IP アドレスを設定します。

Console

  1. Google Cloud Console で外部 IP アドレスのページに移動します。
    [外部 IP アドレス] ページに移動
  2. [静的アドレスを予約] をクリックして、IPv4 アドレスを予約します。
  3. example-ip の [名前] を割り当てます。
  4. ネットワーク階層を [プレミアム] に設定します。
  5. [IP バージョン] を IPv4 に設定します。
  6. [タイプ] で [グローバル] をオンにします。
  7. [予約] をクリックします。

gcloud

gcloud compute addresses create example-ip \
    --ip-version=IPV4 \
    --global

予約されている IPv4 アドレスをメモします。

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

SSL 証明書リソースを作成する

HTTPS ロードバランサを作成するには、ロードバランサのフロントエンドに SSL 証明書リソースを追加する必要があります。Google マネージド SSL 証明書またはセルフマネージド SSL 証明書を使用して SSL 証明書リソースを作成します。

  • Google マネージド証明書。このうち、Google Cloud が自動的に取得、管理、更新する Google マネージド証明書をおすすめします。Google マネージド証明書を作成するには、そのドメインをプロビジョニングするためのドメインと DNS レコードが必要です。ドメインがない場合は、Google Domains から取得できます。また、前の手順で作成したロードバランサの IP アドレス(example-ip)を指すようにドメインの DNS A レコードを更新する必要があります。詳しい手順については、Google マネージド証明書をご覧ください。

  • 自己署名証明書。この段階でドメインを設定したくない場合は、テスト用に自己署名 SSL 証明書を使用できます。

この例では、SSL 証明書リソースがすでに作成されていることを前提としています。

SSL 証明書リソース(または Google マネージド証明書で必要とされるドメイン)を作成せずにこのプロセスをテストする場合、このページの手順を使用して代わりに HTTP ロードバランサを設定できます。

外部 HTTP(S) ロードバランサの作成

次の図では、ロードバランサがサーバーレス NEG バックエンドを使用して、リクエストをサーバーレス Cloud Run サービスに転送しています。この例では、Cloud Run Python クイックスタートを使用して Cloud Run サービスをデプロイしています。

Cloud Run アプリの HTTPS 負荷分散(クリックして拡大)
Cloud Run アプリの HTTPS 負荷分散

サーバーレス NEG バックエンドを使用するバックエンド サービスではヘルスチェックがサポートされません。したがって、ロードバランサでサーバーレス NEG バックエンドのみを使用する場合、ヘルスチェックを許可するファイアウォール ルールを作成する必要はありません。

Console

ロードバランサに名前を付ける

  1. Google Cloud Console で [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. [HTTP(S) 負荷分散] で [構成を開始] をクリックします。
  3. [インターネット接続または内部専用] で [インターネットから自分の VM へ] を選択します。
  4. [続行] をクリックします。
  5. ロードバランサの [名前] に「serverless-lb」と入力します。
  6. ウィンドウを開いたままにして続行します。

バックエンド サービスの構成

  1. [バックエンドの構成] をクリックします。
  2. [バックエンド サービスを作成または選択] プルダウン メニューで、マウスポインタを [バックエンド サービス] に合わせ、[バックエンド サービスを作成] を選択します。
  3. [名前] を入力します。
  4. [バックエンド タイプ] で、[サーバーレス ネットワーク エンドポイント グループ] を選択します。
  5. [プロトコル] は変更せず、そのままにします。このパラメータは無視されます。
  6. [バックエンド] の [新しいバックエンド] ウィンドウで、[サーバーレス ネットワーク エンドポイント グループの作成] を選択します。
  7. [名前] を入力します。
  8. [リージョン] で、us-central1 を選択します。[Cloud Run] を選択します。
  9. [サービス名を選択] を選択します。
  10. [サービス] プルダウンで、ロードバランサを作成する Cloud Run サービスを選択します。
  11. [作成] をクリックします。
  12. [新しいバックエンド] ウィンドウで、[完了] をクリックします。
  13. [Cloud CDN を有効にする] を選択します。デフォルトのキャッシュ モードTTL の設定を維持します。
  14. [作成] をクリックします。

ホストルールとパスマッチャーを構成する

ホストルールとパスマッチャーは、外部 HTTP(S) ロードバランサの URL マップの構成要素です。

  1. [ホストとパスのルール] をクリックします。
  2. デフォルトのホストとパスを保持します。この例では、すべてのリクエストが前の手順で作成したバックエンド サービスに送信されます。

フロントエンドを構成する

  1. [フロントエンドの構成] をクリックします。
  2. [名前] を入力します。
  3. HTTPS ロードバランサを作成するには、SSL 証明書gcloud compute ssl-certificates list)が必要です。前に説明したように、Google マネージド証明書を使用することをおすすめします。外部 HTTP(S) ロードバランサを構成するには、次のフィールドに値を入力します。

    以下のオプションが次の値で構成されていることを確認します。

    プロパティ 値(値を入力するか、指定されたオプションを選択)
    プロトコル HTTPS
    ネットワーク サービス階層 プレミアム
    IP バージョン IPv4
    IP アドレス example-ip
    ポート 443
    証明書 既存の SSL 証明書を選択するか、新しい証明書を作成します。

    HTTPS ロードバランサを作成するには、HTTPS プロキシで使用する SSL 証明書リソースが必要です。SSL 証明書リソースは、Google マネージド SSL 証明書またはセルフマネージド SSL 証明書を使用して作成できます。
    Google マネージド証明書を作成するには、ドメインが必要です。ドメインの A レコードは、ロードバランサの IP アドレス(この例では example-ip)に解決される必要があります。Google Cloud マネージド証明書を使用することをおすすめします。これらの証明書は Google Cloud で自動的に取得、管理、更新されます。ドメインがない場合は、自己署名 SSL 証明書を使用してテストできます。

  4. [完了] をクリックします。

構成の確認

  1. [確認と完了] をクリックします。
  2. バックエンド バケットホストとパスのルールフロントエンドを確認します。
  3. [作成] をクリックします。
  4. ロードバランサの作成が完了するまで待ちます。
  5. ロードバランサの名前(serverless-lb)をクリックします。
  6. ロードバランサの IP アドレスをメモします(次のタスクで使用します)。次のタスクでは IP_ADDRESS とします。

gcloud

  1. サーバーレス アプリにサーバーレス NEG を作成します。Cloud Run サービスを使用してサーバーレス NEG を作成するには、次のコマンドを実行します。

    gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
        --region=us-central1 \
        --network-endpoint-type=serverless  \
        --cloud-run-service=CLOUD_RUN_SERVICE_NAME
    
    その他のオプションについては、gcloud compute network-endpoint-groups creategcloud リファレンス ガイドをご覧ください。
  2. バックエンド サービスを作成します。
    gcloud compute backend-services create BACKEND_SERVICE_NAME \
        --global \
        --enable-cdn \
        --cache-mode=CACHE_MODE \
        --custom-response-header='Cache-Status: {cdn_cache_status}' \
        --custom-response-header='Cache-ID: {cdn_cache_id}'
    

    CACHE_MODE を次のいずれかに置き換えます。

    • CACHE_All_STATIC(デフォルト): 静的コンテンツを自動的にキャッシュに保存します。キャッシュ不可としてマークされている(Cache-Control レスポンス ヘッダー内の privateno-store、または no-cache のディレクティブ)レスポンスは、キャッシュに保存されません。動的コンテンツをキャッシュに保存するには、コンテンツに有効なキャッシュ ヘッダーが含まれている必要があります。これは、すべての新しい Cloud CDN 対応バックエンドのデフォルトの動作です。

    • USE_ORIGIN_HEADERS: コンテンツをキャッシュに保存するには、送信元で有効なキャッシュ ヘッダーを設定する必要があります。これらのヘッダーがないレスポンスは Google のエッジでキャッシュに保存されません。リクエストごとに送信元を完全に通過する必要があるため、パフォーマンスに影響が及び、送信元サーバーの負荷が増加する可能性があります。これは、既存のすべての Cloud CDN 対応バックエンドのデフォルトの動作です。

    • FORCE_CACHE_ALL: Cache-Control レスポンス ヘッダー内の privateno-store、または no-cache のディレクティブを無視して、すべてのコンテンツをキャッシュに保存します。この結果、ユーザー単位の(ユーザーを特定可能な)限定公開コンテンツがキャッシュに保存される場合があります。これを有効にするのは、限定公開コンテンツまたは動的コンテンツを配信していないバックエンド(Cloud Storage バケットなど)に限定する必要があります。

    Cloud CDN が認識するキャッシュ ディレクティブ、および Cloud CDN によってキャッシュされないコンテンツについては、キャッシュ可能なコンテンツおよびキャッシュに保存できないコンテンツをご覧ください。

  3. サーバーレス NEG をバックエンドとしてバックエンド サービスに追加します。

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --global \
        --network-endpoint-group=SERVERLESS_NEG_NAME \
        --network-endpoint-group-region=us-central1
    
  4. 受信リクエストをバックエンド サービスにルーティングするための URL マップを作成します。
    gcloud compute url-maps create URL_MAP_NAME \
        --default-service BACKEND_SERVICE_NAME
    

    この URL マップの例では、1 つのサーバーレス アプリを表す 1 つのバックエンド サービスのみを対象としているため、ホストルールやパスマッチャーを設定する必要はありません。複数のバックエンド サービスを対象とする場合、ホスト名に基づいてリクエストを特定のサービスに転送するにはホストルールを使用します。また、パスマッチャーを設定すると、リクエストパスに基づいてリクエストを特定のサービスに転送できます。

  5. HTTPS ロードバランサを作成するには、HTTPS ターゲット プロキシで使用する SSL 証明書リソースが必要です。SSL 証明書リソースは、Google マネージド SSL 証明書またはセルフマネージド SSL 証明書を使用して作成できます。このうち、Google Cloud が自動的に取得、管理、更新する Google マネージド証明書をおすすめします。

    Google マネージド証明書を作成するには、ドメインが必要です。ドメインがない場合は、自己署名 SSL 証明書を使用してテストできます。

    Google マネージド SSL 証明書リソースを作成するには、次のコマンドを実行します。

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
        --domains DOMAIN
    

    セルフマネージド SSL 証明書リソースを作成するには、次のコマンドを実行します。

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
        --certificate CRT_FILE_PATH \
        --private-key KEY_FILE_PATH
    

  6. URL マップにリクエストをルーティングするターゲット HTTP(S) プロキシを作成します。

    HTTPS ロードバランサの場合は、HTTPS ターゲット プロキシを作成します。プロキシはロードバランサの一部であり、HTTPS 負荷分散用の SSL 証明書を保持するため、この手順で証明書も読み込みます。

    gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
        --ssl-certificates=SSL_CERTIFICATE_NAME \
        --url-map=URL_MAP_NAME
    

  7. 受信リクエストをプロキシにルーティングするグローバル転送ルールを作成します。

    HTTPS ロードバランサの場合:

    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
        --address=example-ip \
        --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
        --global \
        --ports=443
    

ロードバランサの IP アドレスを使用するようにドメインの DNS レコードを更新する

まだ行っていない場合は、ロードバランサの IP アドレスを参照するようにドメインの DNS A または AAAA レコードを更新します。これにより、既存のカスタム ドメイン URL に送信されたトラフィックがロードバランサ経由でルーティングされるようになります。

たとえば、example.com のカスタム ドメインがあり、すべてのサービスがこのドメインにマッピングされている場合は、ロードバランサの IP アドレスを参照するように example.com の DNS A または AAAA レコードを更新する必要があります。

DNS レコードを更新する前に、カスタム ドメインのローカル DNS での解決をロードバランサの IP アドレスにすることで、ローカルで構成をテストできます。ローカルでテストするには、example.com がロードバランサの IP アドレスを指すように、ローカルマシン上の /etc/hosts/ ファイルを変更するか、curl --resolve フラグを使用して、curl がリクエストにロードバランサの IP アドレスを使用するように強制します。

example.com の DNS レコードが HTTPS ロードバランサの IP アドレスに解決されると、example.com に送信されたリクエストがロードバランサ経由でルーティングされるようになります。ロードバランサは、その URL マップに従ってリクエストを該当するバックエンド サービスにディスパッチします。さらに、URL マスクを使用してバックエンド サービスが構成されている場合、サーバーレス NEG はこの URL マスクを使用してリクエストを適切な Cloud Run、Cloud Functions、または App Engine のサービスにルーティングします。

Google マネージド証明書を使用する場合、既存のサービスを外部 HTTP(S) ロードバランサに移行すると、ダウンタイム(通常は 1 時間以内)が発生する可能性があります。これは、ロードバランサの IP アドレスを指すように DNS レコードを更新するまで、外部 HTTP(S) ロードバランサの SSL 証明書がプロビジョニングされないためです。

ロードバランサをテストする

ロードバランサを構成したので、ロードバランサの IP アドレスにトラフィックを送信できるようになりました。ドメインを構成した場合、ドメイン名にトラフィックを送信することもできます。ただし、DNS の伝播が完了するまでに時間がかかることがあるため、テスト用の IP アドレスで始めることもできます。

  1. Google Cloud Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. 作成したロードバランサをクリックします。
  3. ロードバランサの IP アドレスをメモします。
  4. HTTPS ロードバランサの場合は、ウェブブラウザを使用して https://IP_ADDRESS に移動し、ロードバランサをテストします。IP_ADDRESS は、ロードバランサの IP アドレスに置き換えます。helloworld サービスのホームページが表示されます。

    結果に問題があり、Google マネージド証明書を使用している場合は、証明書リソースのステータスが ACTIVE であることを確認します。詳しくは、Google マネージド SSL 証明書リソースのステータスをご覧ください。

    テストに自己署名証明書を使用した場合、ブラウザに警告が表示されます。自己署名証明書を受け付けるためには、ブラウザで明示的に設定する必要があります。警告は無視してクリックし、実際のページを表示します。

  5. キャッシュ レスポンスを確認するには、ローカルマシンのコマンドラインから curl を使用します。IP_ADDRESS は、ロードバランサの IPv4 アドレスに置き換えます。

    curl -v -o/dev/null https://IP_ADDRESS
    

    Google マネージド証明書を使用している場合は、ロードバランサの IP アドレスを指すドメインをテストします。次に例を示します。

    curl -v -o/dev/null -k -s 'https://DOMAIN:443' --connect-to DOMAIN:443:IP_ADDRESS:443
    

    自己署名証明書を使用する場合は、-k フラグも指定する必要があります。curl の -k オプションを指定すると、自己署名証明書を使用している場合に curl が機能します。独自のサイトをテストする場合にのみ、-k パラメータを使用してください。通常の状況下では有効な証明書が重要なセキュリティ手段となります。証明書の警告は無視しないでください。

    出力には、レスポンスがキャッシュから配信されたことを示すために構成したカスタム ヘッダー Cache-IDCache-Status が含まれます。

    HTTP/2 200
    cache-status: hit
    cache-id: SEA-b9fa975e
    

    出力には、キャッシュ ヒットがあったことを示すレスポンス ヘッダーが含まれます。つまり、サーバーレス アプリ内の静的アセットは、Cloud CDN エッジ キャッシュからユーザーに配信されたものです。

    cache-status ヘッダーは、Cloud CDN にキャッシュされていないレスポンスの disabled 値を示しています。キャッシュに保存されたレスポンスの場合、cache-status ヘッダー値は hitmiss、または revalidated になります。

Cloud CDN を無効にする

Console

単一のバックエンド サービスに対して Cloud CDN を無効にする

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

    [Cloud CDN] ページに移動

  2. 送信元の行の右側で [メニュー] をクリックし、[編集] を選択します。
  3. Cloud CDN の使用を停止するバックエンド サービスのチェックボックスをオフにします。
  4. [更新] をクリックします。

送信元のすべてのバックエンド サービスに対して Cloud CDN を削除する

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

    [Cloud CDN] ページに移動

  2. 送信元の行の右側で [メニュー] をクリックし、[削除] を選択します。
  3. 確認のため、もう一度 [削除] をクリックします。

gcloud

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --no-enable-cdn

Cloud CDN を無効にしても、キャッシュの無効化や消去は行われません。Cloud CDN を無効にして再度有効にすると、キャッシュに保存されたコンテンツの大半はキャッシュに残っています。キャッシュのコンテンツを使用しないようにするには、コンテンツの無効化が必要です。

次のステップ