Cloud Run を使用してリージョン内部アプリケーション ロードバランサを設定する

このドキュメントでは、Cloud Run を使用してリージョン内部アプリケーション ロードバランサをデプロイする方法について説明します。これを設定するには、ロードバランサにサーバーレス NEG バックエンドを使用します。

この手順を試す前に、次のトピックについて理解しておいてください。

サーバーレス NEG を使用すると、ロードバランサで Cloud Run サービスを使用できます。サーバーレス NEG バックエンドを使用してロードバランサを構成した後は、そのロードバランサへのリクエストが Cloud Run バックエンドに転送されるようになります。

始める前に

  1. Google Cloud CLI をインストールする
  2. Cloud Run サービスをデプロイする
  3. 権限を構成する

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

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

gcloud CLI を初めて使用する場合は、gcloud init を実行して gcloud ディレクトリを初期化します。

注: Google Cloud コンソールでは、サーバーレス NEG バックエンドを使用する内部アプリケーション ロードバランサを設定することはできません。

Cloud Run サービスをデプロイする

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

このページの例では、Cloud Run クイックスタートを使用して Cloud Run サービスをデプロイしています。

サーバーレス NEG、ロードバランサ、クライアント VM は、Cloud Run サービスと同じリージョンに存在する必要があります。

インターネットから Cloud Run サービスにアクセスできないようにするには、上り(内向き)を internal に制限します。内部アプリケーション ロードバランサからのトラフィックは内部トラフィックとみなされます。

gcloud run deploy CLOUD_RUN_SERVICE_NAME \
  --platform=managed \
  --allow-unauthenticated \
  --ingress=internal \
  --region=REGION \
  --image=IMAGE_URL

作成するサービスの名前をメモします。このページの残りの部分では、このサービスにリクエストを転送するロードバランサの設定方法について説明します。

権限を構成する

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

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

ネットワークとサブネットを構成する

ネットワークとそのサブネットを構成するには、次の操作を行います。

  • VPC ネットワークとサブネットを作成します。
  • プロキシ専用サブネットを作成します。

VPC ネットワークを作成する

カスタムモードの VPC ネットワークを作成し、リージョン内にサブネットを作成します。

コンソール

  1. Google Cloud コンソールの [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] に移動

  2. [VPC ネットワークを作成] をクリックします。

  3. [名前] に「lb-network」と入力します。

  4. [サブネット作成モード] で [カスタム] を選択します。

  5. [新しいサブネット] セクションで、サブネットに次の構成パラメータを指定します。

    1. [名前] に「lb-subnet」と入力します。
    2. リージョンを選択します。
    3. [IP アドレス範囲] に「10.1.2.0/24」と入力します。
    4. [完了] をクリックします。
  6. [作成] をクリックします。

gcloud

  1. gcloud compute networks create コマンドを使用して、カスタム VPC ネットワークを作成します。

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. lb-network ネットワークにサブネットを作成します。この例では、サブネットに 10.1.2.0/24 の IP アドレス範囲を使用します。任意の有効なサブネット範囲を構成できます。

    gcloud compute networks subnets create lb-subnet \
    --network=lb-network \
    --range=10.1.2.0/24 \
    --region=REGION
    

プロキシ専用サブネットを作成する

lb-network ネットワークの特定のリージョンにある、すべてのリージョン Envoy ベースのロードバランサにプロキシ専用サブネットを作成します。

コンソール

  1. Google Cloud コンソールの [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] に移動

  2. プロキシ専用サブネットを追加する共有 VPC ネットワークの名前をクリックします。

  3. [サブネットを追加] をクリックします。

  4. [名前] フィールドに「proxy-only-subnet」と入力します。

  5. リージョンを選択します。

  6. [目的] を [リージョン マネージド プロキシ] に設定します。

  7. IP アドレス範囲を入力します(10.129.0.0/23 など)。

  8. [追加] をクリックします。

gcloud

  1. gcloud compute networks subnets create コマンドを使用して、プロキシ専用サブネットを作成します。

    この例では、プロキシ専用サブネットに 10.129.0.0/23 の IP アドレス範囲を使用します。任意の有効なサブネット範囲を構成できます。

    gcloud compute networks subnets create proxy-only-subnet \
     --purpose=REGIONAL_MANAGED_PROXY \
     --role=ACTIVE \
     --region=REGION \
     --network=lb-network \
     --range=10.129.0.0/23
    

ロードバランサを作成する

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

Cloud Run アプリケーションの内部 HTTP(S) ロード バランシング アーキテクチャ。
Cloud Run アプリケーションの内部 HTTP(S) ロード バランシング アーキテクチャ。

ロードバランサからサーバーレス NEG バックエンドへのトラフィックは、ファイアウォール ルールの対象外である VPC の外部で定義された特別なルートを使用します。したがって、ロードバランサにサーバーレス NEG バックエンドしかない場合は、プロキシ専用サブネットからサーバーレス バックエンドへのトラフィックを許可するファイアウォール ルールを作成する必要はありません。

コンソール

構成を開始する

  1. Google Cloud コンソールで、[ロード バランシング] ページに移動します。

    [ロード バランシング] に移動

  2. [ロードバランサを作成] をクリックします。
  3. [アプリケーション ロードバランサ(HTTP/S)] カードで [構成を開始] をクリックします。
  4. [インターネット接続または内部専用] で [VM またはサーバーレス サービス間のみ] を選択します。
  5. ウィンドウを開いたままにして続行します。

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

  1. 続行する前に、SSL 証明書があることを確認してください。
  2. [フロントエンドの構成] をクリックします。
  3. 名前を入力します。
  4. 内部アプリケーション ロードバランサを構成するには、各フィールドを次のように指定します。
    1. [プロトコル] で、[HTTPS] を選択します。
    2. [サブネットワーク] でサブネットワークを選択します。
    3. [IP バージョン] で [IPv4] を選択します。
    4. [IP アドレス] で [エフェメラル] を選択します。
    5. [ポート] で 443 を選択します。
    6. [証明書] の下で、既存の SSL 証明書を選択するか、新しい証明書を作成します。

      Compute Engine または Certificate Manager の証明書を作成できます。Certificate Manager を使用して証明書を作成するには、次のいずれかの方法を使用します。

      • リージョン セルフマネージド証明書。リージョン セルフマネージド証明書の作成と使用については、リージョン セルフマネージド証明書をデプロイするをご覧ください。証明書マップはサポートされていません。

      • リージョンの Google マネージド証明書。証明書マップはサポートされていません。

        Certificate Manager では、次のタイプのリージョン Google マネージド証明書がサポートされています。

      • 証明書を作成したら、証明書をターゲット プロキシに直接関連付けます。

        次の例は、Compute Engine SSL 証明書を作成する方法を示しています。

      • [新しい証明書の作成] をクリックします。
        1. [名前] フィールドに名前を入力します。
        2. 該当するフィールドに PEM 形式のファイルをアップロードします。
          • 証明書
          • 秘密鍵
        3. [作成] をクリックします。

    SSL 証明書リソースを設定せずにこのプロセスをテストする場合は、HTTP ロードバランサを設定できます。

  5. (省略可)HTTP ロードバランサを作成する手順は次のとおりです。
    1. [プロトコル] で、HTTP を選択します。
    2. [サブネットワーク] でサブネットワークを選択します。
    3. [IP バージョン] で [IPv4] を選択します。
    4. [IP アドレス] で [エフェメラル] を選択します。
    5. [ポート] で 80 を選択します。
  6. [完了] をクリックします。

バックエンド サービスを構成する

  1. [バックエンドの構成] をクリックします。
  2. [バックエンド サービスの作成または選択] プルダウン メニューで、バックエンド サービスにポインタを合わせて、[バックエンド サービスを作成] を選択します。
  3. [バックエンド サービスの作成] ウィンドウで、[名前] を入力します。
  4. [バックエンド タイプ] で、[サーバーレス ネットワーク エンドポイント グループ] を選択します。
  5. [プロトコル] は変更せず、そのままにします。このパラメータは無視されます。
  6. [バックエンド] > [新しいバックエンド] で [サーバーレス ネットワーク エンドポイント グループの作成] を選択します。
    1. [サーバーレス ネットワーク エンドポイント グループの作成] ウィンドウで、名前を入力します。
    2. [リージョン] に、ロードバランサのリージョンが表示されます。
    3. [サーバーレス ネットワーク エンドポイント グループの種類] フィールドで、[Cloud Run] を選択します。サポートされているタイプは Cloud Run のみです。
    4. [サービス名を選択] を選択します。
    5. [サービス] プルダウン リストから、ロードバランサを作成する Cloud Run サービスを選択します。
    6. [完了] をクリックします。
    7. [作成] をクリックします。
  7. [バックエンド サービスの作成] ウィンドウで [作成] をクリックします。

ルーティング ルールを構成する

ルーティング ルールは、トラフィックの転送方法を決定します。トラフィックは、バックエンド サービスまたは Kubernetes サービスに転送できます。ホストとパスのマッチャーに明確に一致しないトラフィックはすべて、デフォルト サービスに送信されます。

  1. [単純なホストとパスのルール] をクリックします。
  2. [バックエンド] プルダウン リストからバックエンド サービスを選択します。

構成を確認する

  1. [確認と完了] をクリックします。
  2. [バックエンド]、[ホストとパスのルール]、[フロントエンド] の値を確認します。
  3. 省略可: [同等のコード] をクリックして、ロードバランサの作成に使用する REST API リクエストを表示します。
  4. [作成] をクリックします。ロードバランサの作成が完了するまで待ちます。
  5. ロードバランサの名前(serverless-lb)をクリックします。
  6. ロードバランサの IP アドレスをメモします(次のタスクで使用します)。

gcloud

  1. Cloud Run サービスにサーバーレス NEG を作成します。
        gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
            --region=REGION \
            --network-endpoint-type=serverless  \
            --cloud-run-service=CLOUD_RUN_SERVICE_NAME
        
  2. リージョン バックエンド サービスを作成します。--protocol を HTTP に設定します。このパラメータは無視されますが、指定されていないと --protocol はデフォルトで TCP に設定されるため、このパラメータは必須です。
        gcloud compute backend-services create BACKEND_SERVICE_NAME \
            --load-balancing-scheme=INTERNAL_MANAGED \
            --protocol=HTTP \
            --region=REGION
        
  3. サーバーレス NEG をバックエンドとしてバックエンド サービスに追加します。
        gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
            --region=REGION \
            --network-endpoint-group=SERVERLESS_NEG_NAME \
            --network-endpoint-group-region=REGION
        
  4. 受信リクエストをバックエンド サービスに転送するリージョン URL マップを作成します。
        gcloud compute url-maps create URL_MAP_NAME \
            --default-service=BACKEND_SERVICE_NAME \
            --region=REGION
        
    この URL マップの例では、単一のサーバーレス アプリを表す 1 つのバックエンドをターゲットにしています。このため、ホストルールやパスマッチャーを設定する必要はありません。
  5. 省略可: この手順は、クライアントとロードバランサ間で HTTPS を使用している場合に行います。HTTP ロードバランサの場合、必須ではありません。

    Compute Engine または Certificate Manager の証明書を作成できます。Certificate Manager を使用して証明書を作成するには、次のいずれかの方法を使用します。

    • リージョン セルフマネージド証明書。リージョン セルフマネージド証明書の作成と使用については、リージョン セルフマネージド証明書をデプロイするをご覧ください。証明書マップはサポートされていません。

    • リージョンの Google マネージド証明書。証明書マップはサポートされていません。

      Certificate Manager では、次のタイプのリージョン Google マネージド証明書がサポートされています。

    • 証明書を作成したら、証明書をターゲット プロキシに直接関連付けます。

      セルフマネージド SSL 証明書リソースを作成するには:
          gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
              --certificate CRT_FILE_PATH \
              --private-key KEY_FILE_PATH \
              --region=REGION
          
    • URL マップにリクエストを転送するリージョン ターゲット プロキシを作成します。

      HTTP ロードバランサの場合は、HTTP ターゲット プロキシを作成します。
          gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
              --url-map=URL_MAP_NAME \
              --region=REGION
          
      HTTPS ロードバランサの場合は、HTTPS ターゲット プロキシを作成します。プロキシはロードバランサの一部であり、HTTPS ロードバランサ用の SSL 証明書を保持するため、この手順で証明書も読み込みます。
          gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
              --ssl-certificates=SSL_CERTIFICATE_NAME \
              --url-map=URL_MAP_NAME \
              --region=REGION
          
    • 受信リクエストをプロキシに転送する転送ルールを作成します。転送ルールの IP アドレスには、プロキシ専用サブネットを使用しないでください。サブネット(lb-subnet)から有効な IP アドレスを構成できます。

      HTTP ロードバランサの場合:
          gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
              --load-balancing-scheme=INTERNAL_MANAGED \
              --network=lb-network \
              --subnet=lb-subnet \
              --address=IP_ADDRESS \
              --target-http-proxy=TARGET_HTTP_PROXY_NAME \
              --target-http-proxy-region=REGION \
              --region=REGION \
              --ports=80
          
      HTTPS ロードバランサの場合:
          gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
              --load-balancing-scheme=INTERNAL_MANAGED \
              --network=lb-network \
              --subnet=lb-subnet \
              --address=IP_ADDRESS \
              --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
              --target-https-proxy-region=REGION \
              --region=REGION \
              --ports=443
          

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

ロードバランサを構成したので、ロードバランサの IP アドレスにトラフィックを送信できるようになりました。

クライアント VM を作成する

この例では、ロードバランサと同じリージョンにクライアント VM を作成しています(vm-client)。クライアントを使用するのは、ロードバランサの構成を検証し、想定される動作を示すためです。

gcloud

クライアント VM はロードバランサと同じ REGION 内の任意のゾーンにあり、同じ VPC ネットワーク内の任意のサブネットを使用できます。

gcloud compute instances create vm-client \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --network=lb-network \
    --subnet=lb-subnet \
    --zone=ZONE

ファイアウォール ルールを構成する

この例では、テスト クライアント VM に次のファイアウォール ルールが必要です。

fw-allow-ssh。任意のアドレスから TCP ポート 22 での受信 SSH 接続を許可するテスト クライアント VM に適用される上り(内向き)ルール。このルールには、送信元の IP アドレス範囲をより限定的に指定できます。たとえば、SSH セッションを開始するシステムの IP アドレス範囲を指定できます。この例では、ターゲットタグ allow-ssh を使用しています。

コンソール

  1. Google Cloud コンソールで [ファイアウォール ポリシー] ページに移動します。
    [ファイアウォール ポリシー] に移動
  2. [ファイアウォール ルールを作成] をクリックして、SSH 接続の受信を許可するルールを作成します。
    • 名前: allow-ssh
    • ネットワーク: lb-network
    • トラフィックの方向: 上り(内向き)
    • 一致したときのアクション: 許可
    • ターゲット: 指定されたターゲットタグ
    • ターゲットタグ: allow-ssh
    • ソースフィルタ: IPv4 の範囲
    • 送信元 IPv4 範囲: 0.0.0.0/0
    • プロトコルとポート:
      • 指定されたプロトコルとポートを選択します。
      • [TCP] チェックボックスをオンにして、ポート番号に「22」と入力します。
  3. [作成] をクリックします。

gcloud

  1. ネットワーク タグ allow-ssh を使用して、VM との SSH 接続を許可する fw-allow-ssh ファイアウォール ルールを作成します。source-ranges を省略すると、Google Cloud は任意の送信元を対象とするものとしてルールを解釈します。

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

ロードバランサにトラフィックを送信する

ロードバランサの構成が最初にデプロイされた後、構成が反映されるまでには数分かかることがあります。

  • SSH 経由でクライアント インスタンスに接続します。

    gcloud compute ssh vm-client \
      --zone=ZONE
    
  • ロードバランサが想定どおりに Cloud Run サービスのホームページを処理していることを確認します。

    HTTP テストの場合は、次のコマンドを実行します。

    curl IP_ADDRESS
    

    HTTPS テストの場合は、次のコマンドを実行します。

    curl -k -s 'https://TEST_DOMAIN_URL:443' --connect-to TEST_DOMAIN_URL:443:IP_ADDRESS:443
    

    -k フラグを指定すると、curl は証明書の検証をスキップします。

追加の構成オプション

このセクションでは、代替および追加の構成オプションを提供する構成例を示します。これらのタスクはすべて省略可です。また、任意の順序で行うことができます。

URL マスクを使用する

サーバーレス NEG を作成する際に、特定の Cloud Run サービスを選択するのではなく、URL マスクを使用して、同じドメインでリクエストを処理する複数のサービスを指定できます。URL マスクは、URL スキーマのテンプレートです。サーバーレス NEG はこのテンプレートを使用して、受信リクエストの URL からサービス名を抽出し、そのリクエストを適切なサービスにマッピングします。

URL マスクが特に役立つのは、サービスが Google Cloud からデプロイ済みサービスに割り当てられるデフォルトのアドレスではなく、カスタム ドメインにマッピングされている場合です。URL マスクを使用すると、アプリケーションでカスタム URL パターンを使用していても、1 つのルールで複数のサービスとバージョンをターゲットにできます。

サーバーレス NEG の概要: URL マスクをまだ読んでいない場合は、必ずお読みください。

URL マスクを作成する

ロードバランサの URL マスクを作成するには、まず、サービスの URL から取り掛かります。この例では、https://example.com/login で実行されているサーバーレス アプリのサンプルを使用します。この URL で、アプリの login サービスが提供されることになります。

  1. URL から http または https を削除します。これで、example.com/login だけが残ります。
  2. サービス名を URL マスクのプレースホルダに置き換えます。
    • Cloud Run: Cloud Run サービス名をプレースホルダ <service> に置き換えます。Cloud Run サービスにタグが関連付けられている場合は、そのタグ名をプレースホルダ <tag> に置き換えます。この例では、URL マスクが example.com/<service> になります。
  3. 省略可: URL のパスの部分からサービス名を抽出できる場合は、ドメインを省略できます。URL マスクのパスの部分は、最初のスラッシュ(/)文字で区別されます。スラッシュ(/)が URL マスクに存在しない場合、マスクはホストのみを表していると見なされます。したがって、この例では URL マスクを /<service> に短縮できます。

    同様に、URL のホストの部分から <service> を抽出できる場合は、URL マスクからパスを完全に省略できます。

    最初のプレースホルダの前にあるホストまたはサブドメインの部分と、最後のプレースホルダの後にあるパスの部分も省略できます。このような場合、プレースホルダにその部分に必要な情報が取り込まれます。

以下に、これらのルールを説明する例をいくつか示します。

この表では、example.com という名前のカスタム ドメインがあり、すべての Cloud Run サービスがこのドメインにマッピングされていることを前提としています。

サービス、タグ名 Cloud Run のカスタム ドメイン URL URL マスク
サービス: login https://login-home.example.com/web <service>-home.example.com
サービス: login https://example.com/login/web example.com/<service> or /<service>
サービス: login、タグ: test https://test.login.example.com/web <tag>.<service>.example.com
サービス: login、タグ: test https://example.com/home/login/test example.com/home/<service>/<tag> または /home/<service>/<tag>
サービス: login、タグ: test https://test.example.com/home/login/web <tag>.example.com/home/<service>

URL マスクを使用してサーバーレス NEG を作成する

コンソール

新しいロードバランサの場合、このドキュメントで説明したものと同じエンドツーエンドのプロセスを使用できます。バックエンド サービスを構成する場合は、特定のサービスを選択する代わりに、URL マスクを入力します。

既存のロードバランサがある場合は、バックエンド構成を編集し、サーバーレス NEG に特定のサービスの代わりに URL マスクを指定できます。

URL マスクベースのサーバーレス NEG を既存のバックエンド サービスに追加するには、次の操作を行います。

  1. Google Cloud コンソールで、[ロード バランシング] ページに移動します。
    [ロード バランシング] に移動
  2. 編集するバックエンド サービスがあるロードバランサの名前をクリックします。
  3. [ロードバランサの詳細] ページで、[編集] をクリックします。
  4. [Edit global external Application Load Balancer] ページで、[バックエンドの構成] をクリックします。
  5. [バックエンドの構成] ページで、変更するバックエンド サービスの [編集] をクリックします。
  6. [バックエンドを追加] をクリックします。
  7. [サーバーレス ネットワーク エンドポイント グループの作成] を選択します。
    1. [名前] に「helloworld-serverless-neg」と入力します。
    2. [リージョン] に、ロードバランサのリージョンが表示されます。
    3. [サーバーレス ネットワーク エンドポイント グループの種類] で、サポートされているネットワーク エンドポイント グループの種類は Cloud Run のみです。
      1. [URL マスクを使用] を選択します。
      2. URL マスクを入力します。URL マスクの作成方法については、URL マスクの作成をご覧ください。
      3. [作成] をクリックします。

  8. [新しいバックエンド] で、[完了] をクリックします。
  9. [更新] をクリックします。

gcloud

example.com/<service> のサンプル URL マスクを使用してサーバーレス NEG を作成するには:

gcloud compute network-endpoint-groups create SERVERLESS_NEG_MASK_NAME \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-url-mask="example.com/<service>"

サーバーレス NEG の削除

バックエンド サービスに接続しているネットワーク エンドポイント グループは削除できません。NEG を削除する前に、NEG がバックエンド サービスから接続解除されていることを確認してください。

コンソール

  1. 削除するサーバーレス NEG がバックエンド サービスによって使用されていないことを確認するには、[ロード バランシングのコンポーネント] ページの [バックエンド サービス] タブに移動します。
    [バックエンド サービス] に移動
  2. サーバーレス NEG が使用中の場合は、次の操作を行います。
    1. サーバーレス NEG を使用しているバックエンド サービスの名前をクリックします。
    2. [編集] をクリックします。
    3. [バックエンド] のリストで をクリックし、バックエンド サービスからサーバーレス NEG バックエンドを削除します。
    4. [保存] をクリックします。

  3. Google Cloud コンソールの [ネットワーク エンドポイント グループ] ページに移動します。
    [ネットワーク エンドポイント グループ] に移動
  4. 削除するサーバーレス NEG のチェックボックスをオンにします。
  5. [削除] をクリックします。
  6. もう一度 [削除] をクリックして確定します。

gcloud

バックエンド サービスからサーバーレス NEG を削除するには、NEG が作成されたリージョンを指定する必要があります。

gcloud compute backend-services remove-backend BACKEND_SERVICE_NAME \
    --network-endpoint-group=SERVERLESS_NEG_NAME \
    --network-endpoint-group-region=REGION \
    --region=REGION

サーバーレス NEG を削除するには:

gcloud compute network-endpoint-groups delete SERVERLESS_NEG_NAME \
    --region=REGION

次のステップ