Cloud Run 用に Cloud Service Mesh を構成する

このページでは、Cloud Run サービスのさまざまなコンピューティング インフラストラクチャで実行されるように Cloud Service Mesh を構成する方法について説明します。

Cloud Service Mesh では、重み付けトラフィック分割やグローバル ロード バランシングなど、メッシュの高度なトラフィック管理機能を有効にできます。また、Cloud Run サービス間のトラフィックに対するオブザーバビリティとセキュリティ ポリシーも有効にできます。フルマネージドのデータプレーン ソリューションのため、独自のサービス メッシュ サイドカーを維持する運用上の負担が軽減されます。

始める前に

  1. Cloud Service Mesh をよく理解してください。

  2. プロジェクトを設定します。

    gcloud config set core/project PROJECT_ID
  3. Google Cloud コンソールで、プロジェクトに対して次の API を有効にします。

    ネットワーク下り(外向き)にダイレクト VPC ではなく、サーバーレス VPC アクセス コネクタを使用している場合。

  4. gcloud コンポーネントを最新バージョン(488.0.0 以降)に更新します。

    gcloud components update

必要なロール

Cloud Run サービスの構成とデプロイに必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run クライアントのサービス アカウントには、次のロールも付与されている必要があります。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

Cloud Service Mesh を使用した Cloud Run サービス間の呼び出し

Cloud Run は、Cloud Service Mesh のサービス ルーティング API を使用します。これらの API を使用すると、Cloud Run サービスは、指定された run.app URL ではなく、カスタマイズされた URL を使用して他の Cloud Run サービスを呼び出せるようになります。また、Cloud Run は宛先の Cloud Run サービスに対して自動的に認証を行うので、他の Cloud Run サービスにリクエスト認証情報を関連付けるために独自の認証を構成する必要はありません。

Cloud Service Mesh を使用して Cloud Run サービスから別の Cloud Run サービスに呼び出す手順は次のとおりです。

  1. Cloud Service Mesh を設定する
  2. Cloud DNS を設定する
  3. 宛先の Cloud Run サービスを作成する
  4. サーバーレス NEG を作成する
  5. クライアントの Cloud Run サービスを作成する
  6. メッシュ クライアントからサービスを呼び出す

Cloud Service Mesh を設定する

  1. デフォルトの URL を使用してサービスルートを作成するには、Mesh 仕様を mesh.yaml という名前のファイルに保存します。

    name: MESH_NAME

    MESH_NAME は、メッシュ リソースの名前に置き換えます。

  2. 次のコマンドを実行して、仕様から Mesh リソースをインポートします。

    gcloud network-services meshes import MESH_NAME \
      --source=mesh.yaml \
      --location=global

    MESH_NAME は、メッシュ リソースの名前に置き換えます。

Cloud DNS を設定する

プライベート IP アドレスのみをキャプチャするために、ホスト名として完全な run.app URL アドレスと Private Service Connect エンドポイントを併せて使用している場合は、Cloud DNS の設定をスキップして次のセクションに進んでください。

メッシュ クライアントが宛先サービスを呼び出す場合、リクエストで使用されるホスト名は DNS で解決可能である必要があります。サイドカーは、これらの IP アドレス範囲へのすべての IP トラフィックをキャプチャし、適切にリダイレクトするため、任意の有効な RFC 1918 IP アドレスを使用できます。

次の例は、解決する Cloud DNS ゾーンにワイルドカード * エントリを単一の IP アドレスに作成する方法を示しています。排他的な Cloud DNS ゾーンを使用しない場合は、メッシュからアドレス指定できるようにする Cloud Run サービスに対応するすべてのホスト名に対して、Cloud DNS エントリを作成します。

  • 排他的ゾーンに Cloud DNS レコードを作成するには、次のコマンドを実行します。

    1. Cloud DNS で、サービス メッシュ用のプライベート マネージド DNS ゾーンを作成します。

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --networks=VPC_NETWORK_NAME \
      --visibility=private
    2. 新しく作成したプライベート マネージド ゾーン内に DNS レコードを作成します。IP アドレス 10.0.0.1 が未使用であることを確認します。

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      次のように置き換えます。

      • DOMAIN_NAME: DNS ドメインの名前。
      • MESH_NAME: メッシュ リソースの名前。
      • VPC_NETWORK_NAME: VPC ネットワークの名前(例: default)。

Cloud Service Mesh を使用して内部サービスにアクセスする

Cloud Run では、受信ネットワーク トラフィックを「内部」に制限できます。サービスでこの上り(内向き)制限が有効になっている場合、Cloud Run へのアクセスパスを有効にすると、メッシュから Virtual Private Cloud ネットワークを経由するトラフィックを「内部」として設定できます。

Cloud Service Mesh を使用して内部サービスにアクセスするには、次のいずれかの方法を使用します。

宛先の Cloud Run サービスを作成する

Cloud Run の宛先でデフォルトの URL を無効にすることはできません。

  1. 新しい Cloud Run サービスまたは既存の Cloud Run サービスをデプロイします。

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    次のように置き換えます。

    • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
    • REGION: リージョンの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。

サーバーレス ネットワーク エンドポイント グループ(NEG)を作成する

  1. 次のコマンドを実行して、宛先 NEG を作成します。

    gcloud compute network-endpoint-groups create DESTINATION_SERVICE_NAME-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    次のように置き換えます。

    • REGION: リージョンの名前。
    • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
  2. サーバーレス NEG を参照する内部セルフマネージド バックエンド サービスを作成します。

    1. バックエンド サービスを作成します。

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      DESTINATION_SERVICE_NAME は宛先サービスの名前に置き換え、REGION はリージョンの名前に置き換えます。

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

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=DESTINATION_SERVICE_NAME-neg \
      --network-endpoint-group-region=REGION

      DESTINATION_SERVICE_NAME は宛先サービスの名前に置き換え、REGION はリージョンの名前に置き換えます。

  3. バックエンド サービスを参照する HTTP ルートを作成します。

    Mesh リソースとサービスが構成されます。ホスト名をバックエンド サービスに関連付ける HTTPRoute リソースを使用して接続します。

    1. HTTPRoute 仕様を作成し、http_route.yaml というファイルに保存します。

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      ホスト名を、サービスの処理に使用する名前に設定します。同じサービス メッシュ内のすべてのクライアントは、呼び出し元のリージョンとプロジェクトに関係なく、http://<HOSTNAME> URL を使用してこのサービスを呼び出せます。プライベート IP アドレスを使用するように Cloud DNS を設定している場合、ルートのホスト名は完全な run.app URL アドレスにすることもできます。この場合、Cloud DNS の設定手順をスキップできます。

      次のように置き換えます。

      • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
      • DOMAIN_NAME: DNS ドメインの名前。
      • PROJECT_ID: プロジェクトの ID。
      • MESH_NAME: メッシュの名前。
      • REGION: リージョンの名前。
    2. http_route.yaml ファイルの仕様を使用して、HTTPRoute リソースを作成します。

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. 次のコマンドを実行して、Cloud Run 宛先サービスに対する Cloud Run 起動元ロールroles/iam.invoker)を付与します。

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      次のように置き換えます。

      • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
      • REGION: リージョンの名前。
      • PROJECT_NUMBER: プロジェクトの数。

クライアントの Cloud Run サービスを作成する

クライアントの Cloud Run サービスを作成すると、リソースが QPS と構成の合計サイズに関連する Envoy サイドカーが作成されます。ほとんどの場合、CPU 使用率は vCPU の 1% 未満で、メモリ使用量は 50 MB 未満です。

Virtual Private Cloud ネットワークへの下り(外向き)ネットワークアクセス権が必要です。

  • テスト用のクライアント サービスを作成するには、Cloud Run に fortio アプリをデプロイして、HTTP ルートにトラフィックを転送できるようにします。

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    次のように置き換えます。

    • CLIENT_SERVICE_NAME: クライアントの Cloud Run サービスの名前。
    • REGION: リージョンの名前
    • VPC_NETWORK_NAME: VPC ネットワークの名前(例: default)。
    • SUBNET_NAME: サブネットの名前(例: default)。
    • PROJECT_ID: 実際のプロジェクトの ID。
    • MESH_NAME: メッシュ リソースの名前。

メッシュ クライアントからサービスを呼び出す

前述のクライアント サービスを作成するセクションの fortio テストアプリを使用して、リクエストを宛先ルートに転送するには:

  1. 次のコマンドを実行して、作成した Cloud Run クライアント サービスの URL を取得します。

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    次のように置き換えます。

    • CLIENT_SERVICE_NAME: クライアントの Cloud Run サービスの名前。
    • REGION: リージョンの名前
    • PROJECT_ID: 実際のプロジェクトの ID。
  2. curl コマンドを使用して、前の手順の fortio エンドポイントの宛先ルートにリクエストを送信します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    次のように置き換えます。

    • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
    • DOMAIN_NAME: DNS ドメインの名前。

Cloud Run から Compute Engine バックエンドを呼び出す

マネージド インスタンス グループをバックエンドとして使用して Compute Engine と Cloud Service Mesh のサービスルートをデプロイするには、Cloud Service Mesh で Compute Engine ベースの HTTP サーバーを構成します。これにより、Cloud Run クライアントは、このバックエンド サービスルートを使用して、Compute Engine インスタンスにリクエストを直接送信できるようになります。

次のステップ