このページでは、Cloud Run の 2 つの ID についてと、Cloud クライアント ライブラリがサービス ID を使用して Google Cloud APIs を呼び出す方法について説明します。Cloud クライアント ライブラリが組み込まれている Google Cloud プロダクトの例としては、Cloud Storage、Firestore、Cloud SQL、Pub/Sub、Cloud Tasks などがあります。このページは、組織のポリシーとユーザー アクセスを管理する管理者、オペレーター、デベロッパー、またはそのようなトピックについて学習したいユーザーを対象としています。
Cloud Run の ID
Cloud Run を使用するには、Google Cloud で Cloud Run ユーザーと Cloud Run インスタンスの ID が必要です。
- Cloud Run ユーザーの ID は、Cloud Run デプロイ担当者アカウントと呼ばれます。リビジョンまたはジョブを管理する際に、この ID を使用して Cloud Run Admin API にリクエストを送信します。
- Cloud Run インスタンスの ID は、Cloud Run サービス ID と呼ばれます。作成した Cloud Run コードが Cloud クライアント ライブラリと通信する場合、またはサービス間の通信のために別の Cloud Run サービスを呼び出す場合は、この ID を使用して Cloud Run から Google Cloud APIs またはその他の Cloud Run サービスにリクエストを送信します。
Google Cloud APIs にアクセスしてリクエストを送信したり、サービス間で通信したりするには、それぞれの ID に Identity and Access Management(IAM)で適切な権限が付与されている必要があります。
デプロイ担当者アカウントを使用して Cloud Run Admin API を呼び出す
Cloud Run から Cloud Run Admin API を呼び出す際に Cloud Run デプロイ担当者アカウントを使用できます。デプロイ担当者アカウントはユーザー アカウントまたはサービス アカウントのいずれかで、Google Cloud 環境にログインしたアカウントになります。
デプロイ担当者アカウントが Cloud Run を使用する前に、IAM はデプロイ担当者アカウントに Cloud Run オペレーションの実行に必要な権限があるかどうかを確認します。次の図は、ユーザー アカウントが Cloud Run Admin API を呼び出して、Google Cloud コンソールから新しいリビジョンをデプロイする方法を示しています。
サービス ID を使用して Google Cloud APIs を呼び出す
Cloud Run インスタンスが他の IAM 認証済み Cloud Run サービスと通信する場合、またはアプリケーション コードまたは組み込み機能(Cloud Run インテグレーションや Cloud Storage ボリューム マウントなど)を介して Cloud Client ライブラリを呼び出す場合、Google Cloud 環境はアプリケーションのデフォルト認証情報(ADC)を使用して Cloud Run のサービス ID の認証を行い、API オペレーションの実行が許可されているかどうかを自動的に確認します。Cloud Run のサービス ID は、リビジョンのデプロイまたはジョブの実行時に Cloud Run インスタンスの ID として割り当てられたサービス アカウントです。
デプロイ担当者アカウントとして使用されるサービス アカウントは、Cloud Run 構成で同じサービス アカウントが構成されている場合にのみ、サービス ID としても使用されます。
このガイドの残りの部分では、Cloud Run サービスまたはジョブがサービス ID を使用して Google サービスと API を呼び出し、アクセスする方法について説明します。サービス ID の構成の詳細については、サービスとジョブのサービス ID の構成ページをご覧ください。
サービス ID のサービス アカウントの種類
Cloud Run インスタンスが Google Cloud APIs を呼び出して必要なオペレーションを実行する際に、Cloud Run はサービス ID としてサービス アカウントを自動的に使用します。サービス ID として使用できるサービス アカウントには次の 2 種類があります。
- ユーザー管理のサービス アカウント(推奨): このサービス アカウントは手動で作成します。特定の Google Cloud リソースにアクセスするためにサービス アカウントが必要とする最小限の権限を付与します。ユーザー管理のサービス アカウントの形式は
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
です。 - Compute Engine のデフォルト サービス アカウント: Cloud Run は、デフォルトのサービス ID として Compute Engine のデフォルト サービス アカウントを自動的に提供します。Compute Engine のデフォルト サービス アカウントの形式は
PROJECT_NUMBER-compute@developer.gserviceaccount.com
です。
サービス ID の構成時にデフォルト サービス アカウントを使用しない
デフォルトでは、Compute Engine のデフォルトのサービス アカウントが自動的に作成されます。Cloud Run サービスまたはジョブの作成時にサービス アカウントを指定しないと、Cloud Run はこのサービス アカウントを使用します。
組織のポリシーの構成によっては、デフォルトのサービス アカウントにプロジェクトの編集者のロールが自動的に付与される場合があります。iam.automaticIamGrantsForDefaultServiceAccounts
組織ポリシー制約を適用して、自動的なロール付与を無効にすることを強くおすすめします。2024 年 5 月 3 日以降に組織を作成した場合、この制約はデフォルトで適用されます。
自動ロール付与を無効にする場合、デフォルトのサービス アカウントに付与するロールを決定し、これらのロールを付与する必要があります。
デフォルトのサービス アカウントにすでに編集者ロールが設定されている場合は、編集者ロールを権限の低いロールに置き換えることをおすすめします。サービス アカウントのロールを安全に変更するには、Policy Simulator を使用して変更の影響を確認してから、適切なロールを付与または取り消す操作を行います。
サービス ID の機能
コードから Cloud Client ライブラリを呼び出したり、リクエストを送信したりすると、次の処理が行われます。
- クライアント ライブラリが、Google Cloud APIs または Cloud クライアント ライブラリに対するリクエストを検出し、インスタンス メタデータ サーバーにサービス ID の OAuth 2.0 アクセス トークンをリクエストします。
- インスタンス メタデータ サーバーが、サービス ID として構成されたサービス アカウントの IAM アクセス トークンを返します。
- Google Cloud APIs に対するリクエストは、OAuth 2.0 アクセス トークンとともに送信されます。
- IAM が、アクセス トークンで参照されているサービス ID に必要な権限があるかどうかを検証し、API エンドポイントに呼び出しを転送する前にポリシー バインディングを確認します。
- Google Cloud APIs がオペレーションを実行します。
Google Cloud APIs を呼び出す Cloud Run リクエストにアクセス トークンを生成する
Cloud Run コードで Cloud クライアント ライブラリを使用する場合は、デプロイ時または実行時にサービス アカウントを割り当て、Cloud Run でサービス ID を構成します。これにより、ライブラリはアクセス トークンを自動的に取得し、コードのリクエストの認証を行います。Cloud Run コードが他の認証済み Cloud Run サービスと通信する場合は、リクエストにアクセス トークンを追加する必要があります。
サービス ID としてサービス アカウントを割り当てる場合は、次のガイドをご覧ください。
ただし、独自のカスタムコードを使用する場合や、プログラムでリクエストを行う必要がある場合は、直接メタデータ サーバーを使用して、次のセクションで説明する ID トークンとアクセス トークンを手動で取得できます。メタデータ サーバーは、Google Cloud 上で実行されるワークロードでのみ使用できます。ローカルマシンから直接このサーバーにクエリを実行することはできません。
メタデータ サーバーから ID トークンとアクセス トークンを取得する
メタデータ サーバーから取得できるトークンには、次の 2 種類があります。
- OAuth 2.0 アクセス トークン。ほとんどの Google API クライアント ライブラリの呼び出しに使用されます。
- ID トークン。他の Cloud Run サービスや Cloud Functions の関数の呼び出し、ID トークンを検証するサービスの呼び出しに使用されます。
使用しているトークンの種類のタブを開いて、トークンの取得手順を確認してください。
アクセス トークン
たとえば、Pub/Sub トピックを作成する場合は、projects.topics.create
メソッドを使用します。
アクセス トークンを取得するには、Compute Metadata Server を使用します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \ --header "Metadata-Flavor: Google"
このエンドポイントは、
access_token
属性を含む JSON レスポンスを返します。HTTP プロトコルのリクエストでは、
Authorization
ヘッダーに含まれるアクセス トークンでリクエストの認証を受ける必要があります。PUT https://pubsub.googleapis.com/v1/projects/
PROJECT_ID
/topics/TOPIC_ID
Authorization: BearerACCESS_TOKEN
ここで
PROJECT_ID
はプロジェクト ID です。TOPIC_ID
はトピック ID です。ACCESS_TOKEN
は、前の手順で取得したアクセス トークンです。
レスポンス:
{ "name": "projects/
PROJECT_ID
/topics/TOPIC_ID
" }
ID トークン
特定のユーザーの ID トークンを取得するには、Compute Metadata Server を使用します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
--header "Metadata-Flavor: Google"
ここで、AUDIENCE
は、リクエストされた JWT オーディエンスです。
Cloud Run サービスの場合、オーディエンスは、呼び出すサービスの URL かカスタム オーディエンス(サービス用に構成されたカスタム ドメインなど)である必要があります。
https://service.domain.com
他のリソースでは、IAP で保護されたリソースの OAuth クライアント ID の場合もあります。
1234567890.apps.googleusercontent.com
次のステップ
- サービスまたはジョブのサービス ID を構成する。
- サービスへのアクセスを管理する方法またはデベロッパー、サービス、エンドユーザーの認証を安全に行う方法を学習する。
- セキュリティ リスクを最小限に抑えるためにサービス ID を使用するアプリケーションのエンドツーエンドのチュートリアルについては、Cloud Run サービスの保護に関するチュートリアルをご覧ください。