サービス ID の概要

このページでは、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 コンソールから新しいリビジョンをデプロイする方法を示しています。

Google Cloud コンソールから Cloud Run Admin API を呼び出す。
図 1. ユーザーが新しいリビジョンをデプロイするために、Google Cloud コンソールを使用して、アクセス トークンを含むリクエストを Cloud Run Admin API に送信します。オペレーションを実行する前に、IAM はそのアクセス トークンを使用してユーザー アカウントの認証を行い、Cloud Run Admin API へのアクセスが許可されているかどうか確認します。

サービス 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 ライブラリを呼び出したり、リクエストを送信したりすると、次の処理が行われます。

  1. クライアント ライブラリが、Google Cloud APIs または Cloud クライアント ライブラリに対するリクエストを検出し、インスタンス メタデータ サーバーにサービス ID の OAuth 2.0 アクセス トークンをリクエストします。
  2. インスタンス メタデータ サーバーが、サービス ID として構成されたサービス アカウントの IAM アクセス トークンを返します。
  3. Google Cloud APIs に対するリクエストは、OAuth 2.0 アクセス トークンとともに送信されます。
  4. IAM が、アクセス トークンで参照されているサービス ID に必要な権限があるかどうかを検証し、API エンドポイントに呼び出しを転送する前にポリシー バインディングを確認します。
  5. Google Cloud APIs がオペレーションを実行します。
Cloud Run から Google Cloud API を呼び出す。
図 1. IAM は、Cloud Run がメタデータ サーバーから生成したアクセス トークンを使用して、割り当てられた Cloud Run サービス ID の認証を行い、Google Cloud APIs へのアクセスが許可されているかどうか確認します。

Google Cloud APIs を呼び出す Cloud Run リクエストにアクセス トークンを生成する

Cloud Run コードで Cloud クライアント ライブラリを使用する場合は、デプロイ時または実行時にサービス アカウントを割り当て、Cloud Run でサービス ID を構成します。これにより、ライブラリはアクセス トークンを自動的に取得し、コードのリクエストの認証を行います。サービス ID としてサービス アカウントを割り当てる場合は、次のガイドをご覧ください。

ただし、独自のカスタムコードを使用する場合や、プログラムでリクエストを行う必要がある場合は、直接メタデータ サーバーを使用して、次のセクションで説明する ID トークンとアクセス トークンを手動で取得できます。メタデータ サーバーは、Google Cloud 上で実行されるワークロードでのみ使用できます。ローカルマシンから直接このサーバーにクエリを実行することはできません。

メタデータ サーバーから ID トークンとアクセス トークンを取得する

メタデータ サーバーから取得できるトークンには、次の 2 種類があります。

使用しているトークンの種類のタブを開いて、トークンの取得手順を確認してください。

アクセス トークン

たとえば、Pub/Sub トピックを作成する場合は、projects.topics.create メソッドを使用します。

  1. アクセス トークンを取得するには、Compute Metadata Server を使用します。

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        --header "Metadata-Flavor: Google"
    

    このエンドポイントは、access_token 属性を含む JSON レスポンスを返します。

  2. HTTP プロトコルのリクエストでは、Authorization ヘッダーに含まれるアクセス トークンでリクエストの認証を受ける必要があります。

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_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

次のステップ