このページでは、Cloud Run の 2 つの ID についてと、Cloud Run がサービス ID を使用して Cloud Client ライブラリを呼び出す方法について説明します。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 クライアント ライブラリとやり取りする際に、この ID を使用して Cloud Run から Google Cloud APIs にリクエストを送信します。
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 インスタンスがアプリケーション コードまたは組み込み機能(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 はこのサービス アカウントを使用します。
デフォルト サービス アカウントは、Cloud Run インスタンスが権限エラーなしで起動できるようにするためのものです。このプリンシパルには、Google Cloud プロジェクトのすべてのリソースに対する読み取りと書き込みが許可される編集者ロールが付与されます。最小権限の原則に従うため、新しいサービス アカウントを作成して、特定の Google Cloud リソースにアクセスするために必要最小限の権限をサービス アカウントに付与することをおすすめします。
サービス 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 を構成します。これにより、ライブラリはアクセス トークンを自動的に取得し、コードのリクエストの認証を行います。サービス 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 サービスの保護に関するチュートリアルをご覧ください。