アンビエント ネットワーキングのエクスプレス リンクを使用すると、アプリケーションに認証コードを記述したり、サービス メッシュを構成したりすることなく、同じプロジェクトとリージョン内の宛先 Cloud Run サービスにソース Cloud Run サービスを接続できます。
Cloud Run サービスが別の Identity and Access Management(IAM)で保護された Cloud Run サービスを呼び出す場合、リクエストには OpenID Connect(OIDC)ID トークンが含まれている必要があります。これにより、宛先は呼び出し元の ID と権限を確認できます。エクスプレス リンクがない場合は、アプリケーションにサービス間認証コードを記述してメタデータ サーバーからトークンを取得してアタッチするか、Virtual Private Cloud(VPC)ネットワーク、バックエンド サービス、ルーティング ルールなどの Cloud Service Mesh リソースを構成する必要があります。エクスプレス リンクは、この認証とルーティングの作業をフルマネージドのアンビエント サイドカー コンテナにオフロードします。これにより、アプリケーション コードのポータビリティを維持し、ビジネス ロジックに集中できます。
ユースケース
エクスプレス リンクは、次のような場合に使用できます。
- アプリケーション コードからサービス間認証をオフロードする: 呼び出し元の Cloud Run サービスを、IAM で保護された宛先の Cloud Run サービスに、プレーン HTTP 経由で接続します。アンビエント サイドカーは、ソースサービスの OIDC ID トークンを自動的に取得して挿入し、HTTPS 経由でリクエストを暗号化します。
- カスタム ホスト名を使用してリンク先 URL を抽象化する:
--matches-hostnameフラグを使用してエクスプレス リンクにカスタム ホスト名を構成します。これにより、ソース アプリケーションは、リンク先の決定論的 URL をハードコードするのではなく、http://my-backendなどの論理アドレスにリクエストを送信します。宛先サービスが変更された場合は、ソース アプリケーション コードを変更または再デプロイすることなく、新しい宛先を指すようにエクスプレス リンクを再作成できます。 - サービス メッシュを使用せずにポイントツーポイント サービス呼び出しを簡素化する: Cloud Service Mesh に必要な VPC ネットワーク、ネットワーク エンドポイント グループ、バックエンド サービス、Cloud DNS レコードをプロビジョニングすることなく、Cloud Run サービス間で認証情報を自動的に挿入します。
次の表は、エクスプレス リンクを使用する場合と使用しない場合の、認証されたサービス間通信を設定する手順を比較したものです。
| ステップ | エクスプレス リンクなし | エクスプレス リンクを使用する |
|---|---|---|
| 1. 宛先サービスをデプロイする | IAM 認証が必要な宛先 Cloud Run サービスをデプロイします(--no-allow-unauthenticated)。 |
同じです。 |
| 2. 起動元権限を付与する | 宛先サービスに対する Cloud Run 起動元(roles/run.invoker)ロールを、ソースサービスのサービス アカウントに付与します。 |
同じです。 |
| 3. アウトバウンド リクエストを構成する | ソース アプリケーションで、リンク先 URL の OIDC ID トークンを取得し、HTTPS 経由で Authorization: Bearer ヘッダーに添付するコードを記述します。 |
ソース アプリケーションで認証コードを使用せずに、リンク先 URL またはカスタム ホスト名にプレーンな http:// リクエストを送信します。 |
| 4. ソースサービスをデプロイする | ソース Cloud Run サービスをデプロイします。 | アンビエント ネットワーキングを有効にしてソース Cloud Run サービスをデプロイし、デプロイされたソースサービスと宛先サービスの間にエクスプレス リンクを作成します。 |
アーキテクチャ
ソース Cloud Run サービスでアンビエント ネットワーキングを有効にしてエクスプレス リンクを作成すると、Cloud Run は、各コンテナ インスタンスでアプリケーション コンテナとともに実行されるフルマネージド Envoy サイドカー コンテナを構成します。
アプリケーションが宛先サービスの決定論的 URL またはエクスプレス リンクで構成したカスタム ホスト名にプレーンな HTTP リクエストを送信すると、アンビエント サイドカー コンテナは自動的に次の処理を行います。
- ターゲット サービス宛てのアウトバウンド HTTP リクエストをインターセプトします。
- ソースサービスのサービス アカウントの OIDC ID トークンを取得し、
Authorizationヘッダーに挿入します。 - リクエストを暗号化し、HTTPS(一方向 TLS)経由で宛先の Cloud Run サービスに転送します。このサービスは、呼び出し元の IAM 権限を検証します。
ネットワーク接続とデータプレーン
エクスプレス リンクは、アンビエント サイドカーでアウトバウンド リクエストのインターセプトと認証情報の挿入を構成しますが、サービス間の基盤となるネットワーク パスを置き換えるものではありません。ソースサービスが宛先サービスの Ingress パスに到達できることを確認する必要があります。
- 宛先の上り(内向き)が [すべて] に設定されている場合: ソースサービスで VPC ネットワークまたはアウトバウンドの下り(外向き)構成は必要ありません。
- 宛先の上り(内向き)が [内部] または [内部ロードバランサと Cloud Load Balancer] に設定されている場合: ダイレクト VPC 下り(外向き)またはサーバーレス VPC アクセス コネクタを使用して、プライベート Google アクセスが有効になっている承認済みの VPC ネットワーク経由で、ソースサービスからのアウトバウンド トラフィックを転送する必要があります。詳細については、他の Cloud Run サービスからリクエストを受信するをご覧ください。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Cloud Run、Network Services、Traffic Director の各 API がまだ有効になっていない場合は、有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する。- 同じプロジェクトとリージョンに、既存のソース Cloud Run サービスと既存の宛先 Cloud Run サービスがあることを確認します。
- ソース Cloud Run サービスで
globalスコープを使用してアンビエント ネットワーキングが有効になっていることを確認します。たとえば、gcloud beta run services update SOURCE_SERVICE --ambient-networking --ambient-scope=global --region=REGIONを実行します。最初にサービスの CPU とメモリの上限を増やす必要があります。 -
アンビエント ネットワーキング サイドカーの使用量については、Cloud Run の料金ページをご覧ください。プレビュー期間中は、アンビエント機能の課金は適用されません。
必要なロール
エクスプレス リンクの構成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
-
エクスプレス リンクを構成する: プロジェクトに対する Cloud Run デベロッパー(
roles/run.developer)とサービス アカウント ユーザー(roles/iam.serviceAccountUser) -
エクスプレス リンク リソースを管理する: プロジェクトに対するネットワーク サービス管理者(
roles/networkservices.admin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
ソース Cloud Run サービスのサービス ID には、プロジェクトに対する次のロールも付与されている必要があります。
- Traffic Director クライアント(
roles/trafficdirector.client) - Cloud Trace エージェント(
roles/cloudtrace.agent)
これらのロールをサービス ID に付与するには、gcloud を使用します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:RUN_CLIENT_SA@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/trafficdirector.client" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:RUN_CLIENT_SA@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/cloudtrace.agent"
次のように置き換えます。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- RUN_CLIENT_SA: ソース Cloud Run サービスに接続されているサービス アカウントの名前。
Cloud Run サービス ID にこれらのロールがない場合でも、Cloud Run サービスはデプロイされますが、アンビエント ネットワーキングに依存する機能は動作しません。この動作は Cloud Service Mesh とは異なります。Cloud Service Mesh では、必要なロールがないと Cloud Run サービスのデプロイに失敗します。
制限事項
エクスプレス リンクには次の制限が適用されます。
- ソースリソースと宛先リソースとしてサポートされているのは、Cloud Run サービスのみです。Cloud Run ジョブ、ワーカープール、インスタンスはサポートされていません。
- プロジェクト間およびリージョン間の構成はサポートされていません。ソース Cloud Run サービスと宛先 Cloud Run サービスは、同じプロジェクトとリージョンに存在する必要があります。
- エクスプレス リンクには、ソースサービスに
globalスコープを持つアンビエント ネットワーキングが必要です。ソースサービスがregionalスコープを使用している場合、エクスプレス リンクの作成は成功しますが、トラフィックはルーティングされません。 - エクスプレス リンクを作成する前に、ソースと宛先の Cloud Run サービスを作成する必要があります。順序外の作成はサポートされていません。宛先サービスを削除すると、エクスプレス リンクを削除または再作成するまで、エクスプレス リンクは古い構成を表示して提供し続ける可能性があります。
- 既存のエクスプレス リンクのソースサービス、宛先サービス、カスタム ホスト名をインプレースで更新することはできません。
gcloud beta network-services express-links updateコマンドは、エクスプレス リンクの説明のみを更新します。ルーティング構成を変更するには、エクスプレス リンクを削除して再作成します。 - カスタム URL、カスタム ドメイン、または
--matches-hostnameフラグを使用してカスタム ホスト名を構成する場合でも、宛先の Cloud Run サービスでデフォルトのrun.appURL を有効にする必要があります。 - 宛先の非決定論的 URL に送信されたリクエストはインターセプトされず、
403 Forbiddenエラーで失敗します。サービス名とプロジェクト番号の組み合わせが 63 文字を超えているため、宛先サービスに決定的 URL がない場合は、--matches-hostnameを指定する必要があります。指定しないと、エクスプレス リンクの作成がCloud Run Service name is too longエラーで失敗します。 - エクスプレス リンクの完全なステータスを表示すると、宛先サービスの情報のみが返されます。ソースの Cloud Run リビジョンとネゴシエートされた認証の詳細が欠落しているか、古いデータが表示されている可能性があります。これは、エクスプレス リンクがトラフィックをルーティングまたは認証する方法には影響しません。
- エージェント ID と mTLS バインド トークンで構成されたソース Cloud Run サービスはサポートされていません。
- Cloud Run の Agent Gateway と Secure Web Proxy を介してアウトバウンド トラフィックをルーティングするように構成されたソース Cloud Run サービスはサポートされていません。エクスプレス リンクにはグローバル アンビエント ネットワーキング スコープが必要ですが、Agent Gateway にはリージョン スコープが必要です。
- ソースサービスからのアウトバウンド リクエストにすでに
Authorizationヘッダーが含まれている場合、エクスプレス リンクはそのヘッダーを変更せずにリクエストを転送し、トークンを挿入しません。X-Serverless-Authorizationヘッダーへのトークンの自動挿入はサポートされていません。 - Cloud Run サンドボックス コンテナから生成されたトラフィックはサポートされていません。
- エクスプレス リンクを使用して、Identity-Aware Proxy で保護されている宛先の Cloud Run サービスにトラフィックを転送することはできません。
- 各エクスプレス リンクは 1 つの宛先 Cloud Run サービスをサポートし、プロジェクトごとに最大 5,000 個のエクスプレス リンクを作成できます。
エクスプレス リンクを構成する
Cloud Run サービスを接続するには、ソースサービスと宛先サービスを指定するエクスプレス リンクを作成し、宛先サービスに Cloud Run 起動元のロールを付与します。
別の Cloud Run サービスに接続する
ソース Cloud Run サービスを宛先 Cloud Run サービスに接続するには、gcloud または YAML を使用してエクスプレス リンクを作成します。
gcloud
gcloud beta network-services express-links create コマンドを使用して、エクスプレス リンクを作成します。
gcloud beta network-services express-links create EXPRESS_LINK_NAME \ --location=global \ --source-services=//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/SOURCE_SERVICE \ --destination-services=//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/DESTINATION_SERVICE
次のように置き換えます。
- EXPRESS_LINK_NAME: エクスプレス リンクの名前。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REGION: Cloud Run サービスがデプロイされているリージョン。
- SOURCE_SERVICE: ソース Cloud Run サービスの名前。
- DESTINATION_SERVICE: 宛先の Cloud Run サービスの名前。
コマンドが完了してから、ルーティング構成が実行中のソース サービス インスタンスに反映されるまでに最大 2 分かかることがあります。
デフォルトでは、エクスプレス リンクは、宛先サービスの非決定論的 URL ではなく、決定論的 URL に送信されたリクエストのみをインターセプトします。カスタムホスト名を使用するには、--matches-hostname="HOSTNAME" フラグでスキームなしのホスト名(--matches-hostname="DESTINATION_SERVICE" など)を渡し、ソース アプリケーションから http://HOSTNAME にリクエストを送信します。--matches-hostname を指定すると、決定論的 URL が追加されるのではなく、置き換えられます。
YAML
構成ファイル(
express-link.yamlなど)を作成します。name: "projects/PROJECT_ID/locations/global/expressLinks/EXPRESS_LINK_NAME" source: services: - "//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/SOURCE_SERVICE" destination: services: - "//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/DESTINATION_SERVICE"
次のように置き換えます。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REGION: サービスがデプロイされているリージョン。
- EXPRESS_LINK_NAME: エクスプレス リンクの名前。
- SOURCE_SERVICE: ソース Cloud Run サービスの名前。
- DESTINATION_SERVICE: 宛先の Cloud Run サービスの名前。
gcloud beta network-services express-links importコマンドを使用して YAML ファイルをインポートします。gcloud beta network-services express-links import EXPRESS_LINK_NAME \ --location=global \ --source=YAML_FILENAME.yaml
次のように置き換えます。
- EXPRESS_LINK_NAME: エクスプレス リンクの名前。
- YAML_FILENAME: YAML ファイルの名前。
宛先サービスに対する起動元の権限を付与する
ソースサービスが IAM で保護された宛先サービスを呼び出せるようにするには、宛先の Cloud Run サービスでソースサービスのサービス アカウントに Cloud Run 起動元(roles/run.invoker)ロールを付与します。これは、データプレーンで認証が機能するために必要です。
gcloud run services add-iam-policy-binding DESTINATION_SERVICE \ --member="serviceAccount:SOURCE_SA@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.invoker" \ --region=REGION
次のように置き換えます。
- DESTINATION_SERVICE: 宛先の Cloud Run サービスの名前。
- SOURCE_SA: ソース Cloud Run サービスに接続されているサービス アカウントの名前。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REGION: 宛先サービスがデプロイされているリージョン。
エクスプレス リンクのステータスを確認する
エクスプレス リンクの基本構成を表示するには、gcloud beta network-services express-links describe コマンドを使用します。
gcloud beta network-services express-links describe EXPRESS_LINK_NAME \ --location=global
connectionStatus(アクティブなルートタイプ、一致したホスト名、ソース リビジョン URI)と cloudRunSourceInfo(構成された認証方法と VPC ネットワーク)を含むエクスプレス リンクの完全なステータスを表示するには、リソース名に ?view=EXPRESS_LINK_VIEW_FULL# を含めます。
gcloud beta network-services express-links describe 'EXPRESS_LINK_NAME?view=EXPRESS_LINK_VIEW_FULL#' \ --location=global
EXPRESS_LINK_NAME は、エクスプレス リンクの名前に置き換えます。完全なビューをクエリする場合は、一重引用符と末尾の # 文字を保持します。
エクスプレス リンクを削除または再作成する
エクスプレス リンクを削除し、ソースサービスからの認証情報の自動挿入とトラフィックのインターセプトを停止するには、gcloud beta network-services express-links delete コマンドを使用します。
gcloud beta network-services express-links delete EXPRESS_LINK_NAME \ --location=global
EXPRESS_LINK_NAME は、エクスプレス リンクの名前に置き換えます。
既存のエクスプレス リンクを別の宛先サービスに転送する場合、または --matches-hostname 設定を変更する場合は、上記のコマンドでエクスプレス リンクを削除してから、更新された構成で新しいエクスプレス リンクを作成します。
次のステップ
- Cloud Run サービスにアンビエント ネットワーキングを構成する方法を確認する。
- Cloud Run の Agent Gateway について確認する。
- Cloud Run のサービス間認証について学習する。
- Cloud Run サービスのネットワーク エンドポイントの上り(内向き)を制限する方法を確認する。