サービス ID を構成する

Cloud Run サービスまたはリビジョンには、Cloud Run インスタンス コンテナから Google Cloud APIs にアクセスするための認証済みアカウントとして使用されるサービス ID があります。サービス ID の詳細については、サービス ID の概要をご覧ください。

サービス ID の使用方法

Cloud Run では、サービス ID はリソースとプリンシパルの両方の機能を持つサービス アカウントです。

  • リソースとしてのサービス ID: サービス ID としてサービス アカウントを関連付けるには、デプロイ担当者アカウントにサービス ID リソースへのアクセス権が必要です。サービスまたはリビジョンの作成や更新などのオペレーションでは、デプロイ担当者アカウントにサービス ID リソースに対する権限が必要です。
  • プリンシパルとしてのサービス ID: Cloud Run サービスまたはリビジョンから Google Cloud APIs にアクセスするには、サービスまたはリビジョンで実行するオペレーションに必要なロールまたは権限をサービス ID に付与する必要があります。

次のセクションでは、デプロイ担当者アカウントにサービス ID リソースへのアクセス権を付与するために必要なロールと、サービス アカウント プリンシパルへのアクセス権を付与するために必要なロールについて説明します。

必要なロール

デプロイ担当者アカウントとサービス ID に IAM ロールと権限を付与する必要があります。

ここをクリックしてデプロイ担当者のアカウントに必要なロールを表示

サービスまたはリビジョンのサービス ID としてサービス アカウントを関連付けるために必要な権限を取得するには、サービス ID として使用されるサービス アカウントに対するサービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)をデプロイ担当者アカウントに付与する必要があります。

この事前定義ロールには、サービスまたはリビジョンにサービス アカウントを関連付けるために必要な iam.serviceAccounts.actAs 権限が含まれています。カスタムロールを構成するか、他の事前定義ロールを使用して、この権限を取得することもできます。

デプロイ担当者アカウントにサービス ID のこのロールを付与する方法については、デプロイ権限をご覧ください。サービス アカウントが Cloud Run サービスまたはリビジョンとは異なるプロジェクトにある場合は、Cloud Run サービス エージェントの IAM ロールを構成し、組織のポリシーを設定する必要があります。詳細については、他のプロジェクトでサービス アカウントを使用するをご覧ください。

ここをクリックしてサービス ID に必要なロールを表示

サービス ID が Cloud Run から Google Cloud APIs にアクセスできるようにするには、実行するオペレーションで必要な権限またはロールをサービス ID に付与する必要があります。特定の Cloud クライアント ライブラリにアクセスするには、Google Cloud サービスの Google Cloud ドキュメントをご覧ください。

Cloud Run サービスまたはリビジョンが他の Google Cloud サービスにアクセスしない場合、サービス ID にロールや権限を付与する必要はありません。プロジェクトに割り当てられたデフォルトのサービス アカウントを使用できます。

専用のサービス アカウントを作成するための推奨事項を取得する

Google Cloud コンソールから新しいサービス アカウントを作成する場合は、オプションの「このサービス アカウントにプロジェクトへのアクセス権を付与する」追加の手順が必要です。たとえば、ある Cloud Run サービスから別のプライベート Cloud Run サービスを呼び出す場合や、Cloud SQL データベースにアクセスする場合は、どちらにも特定の IAM ロールが必要です。詳細については、アクセスの管理に関するドキュメントをご覧ください。

Recommender サービスは、必要最小限の権限セットで専用のサービス アカウントを作成するための推奨事項を自動的に提供します。

サービス ID を構成する

サービス アカウントをまだ作成していない場合は、IAM または Cloud Run でユーザー管理のサービス アカウントを作成します。

サービス ID を構成するには、新しいサービスを作成する新しいリビジョンをデプロイするときに Google Cloud コンソール、gcloud CLI、API(YAML)のいずれかを使用します。あるいは Terraform を使用します。

コンソール

  1. Google Cloud コンソールで、[Cloud Run] に移動します。

    Cloud Run に移動

  2. デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成する場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。

  3. 新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。

  4. [セキュリティ] タブをクリックします。

    イメージ

    • [サービス アカウント] プルダウンをクリックして既存のサービス アカウントを選択するか、[サービス アカウントを新規作成] をクリックします。
  5. [作成] または [デプロイ] をクリックします。

gcloud

サービス アカウントをまだ作成していない場合は、IAM でユーザー管理のサービス アカウントを作成します。

次のコマンドを使用して、新しいサービス アカウントを使用するように既存サービスを更新できます。

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

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

  • SERVICE は、実際のサービスの名前に置き換えます。
  • SERVICE_ACCOUNT は、新しい ID に関連付けられたサービス アカウントに置き換えます。この値は、サービス アカウントのメールアドレス(example@myproject.iam.gserviceaccount.com など)です。

また、デプロイ中に次のコマンドを使用してサービス アカウントを設定することもできます。

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

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

  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
  • SERVICE_ACCOUNT は、新しい ID に関連付けられたサービス アカウントに置き換えます。この値は、サービス アカウントのメールアドレス(example@myservice.iam.gserviceaccount.com など)です。

YAML

サービス アカウントをまだ作成していない場合は、IAM でユーザー管理のサービス アカウントを作成します。

  1. 新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. serviceAccountName: 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT
    

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

    • SERVICE は、Cloud Run サービスの名前に置き換えます。
    • SERVICE_ACCOUNT は、新しい ID に関連付けられたサービス アカウントに置き換えます。この値は、サービス アカウントのメールアドレス(SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com など)です。
  3. 次のコマンドを使用して、サービスを作成または更新します。

    gcloud run services replace service.yaml

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

サービス アカウントを作成するには、次のリソースを既存の main.tf ファイルに追加します。

resource "google_service_account" "cloudrun_service_identity" {
  account_id = "my-service-account"
}

Cloud Run サービスを作成または更新し、サービス アカウントを追加します。

resource "google_cloud_run_v2_service" "default" {
  name     = "cloud-run-srv"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.cloudrun_service_identity.email
  }
}

他のプロジェクトでサービス アカウントを使用する

Cloud Run リソースとは異なる Google Cloud プロジェクトからサービス アカウントを構成する場合は、次の操作を行います。

  1. サービス ID として使用するサービス アカウントに、サービス アカウント ユーザーのロール(roles/iam.serviceAccountUser)を付与する必要があります。

    コンソール

    1. Google Cloud コンソールの [サービス アカウント] ページに移動します。

      [サービス アカウント] に移動

    2. サービス ID として使用しているサービス アカウントのメールアドレスを選択します。

    3. [権限] タブをクリックします。

    4. アクセス権を付与 ボタンをクリックします。

    5. 管理者またはデベロッパーのロールを付与するプリンシパルに対応するデプロイ担当者のアカウントのメールアドレスを入力します。

    6. [ロールを選択] プルダウンで、[サービス アカウント] > [サービス アカウント ユーザー] ロールを選択します。

    7. [保存] をクリックします。

    gcloud

    gcloud iam service-accounts add-iam-policy-binding コマンドを使用し、ハイライト表示された変数を適切な値に置き換えます。

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="PRINCIPAL" \
        --role="roles/iam.serviceAccountUser"
    

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

    • SERVICE_ACCOUNT_NAME: Cloud Run リソースを接続するサービス アカウントの名前。
    • SERVICE_ACCOUNT_PROJECT_ID: サービス アカウントが配置されているプロジェクト ID。
    • PRINCIPAL は、バインドを追加するデプロイ担当者のアカウントに置き換えます。形式は user|group|serviceAccount:email または domain:domain です。次に例を示します。

      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com
  2. ユーザーまたは管理者は、サービス ID として使用するサービス アカウントに対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を Cloud Run リソースのサービス エージェントに付与する必要があります。サービス エージェントは service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com の形式です。

    コンソール

    1. Google Cloud コンソールの [サービス アカウント] ページに移動します。

      [サービス アカウント] に移動

    2. サービス ID として使用しているサービス アカウントのメールアドレスを選択します。

    3. [権限] タブをクリックします。

    4. アクセス権を付与 ボタンをクリックします。

    5. サービス エージェントのメールアドレスを入力します。例: service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    6. [ロールを選択] プルダウンで、[サービス アカウント] > [サービス アカウント トークン作成者] ロールを選択します。

    7. [保存] をクリックします。

    gcloud

    gcloud iam service-accounts add-iam-policy-binding コマンドを使用します。

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:service-CLOUD_RUN_RESOURCE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountTokenCreator"
    

    次の値を置き換えます。

    • SERVICE_ACCOUNT_NAME: Cloud Run リソースを接続するサービス アカウントの名前。
    • SERVICE_ACCOUNT_PROJECT_ID: サービス アカウントが配置されているプロジェクト ID。
    • CLOUD_RUN_RESOURCE_PROJECT_NUMBER: Cloud Run が配置されているプロジェクト番号。

    このコマンドでは、ユーザー管理のサービス アカウントの更新済みの許可ポリシーが出力されます。

  3. このサービス アカウントを含むプロジェクトでは、組織ポリシー iam.disableCrossProjectServiceAccountUsage をフォルダレベルで false または unenforced に設定するか、プロジェクト レベルの設定から継承する必要があります。デフォルトは true です。

    コンソール

    1. Google Cloud コンソールの [組織のポリシー] ページに移動します。

      [組織のポリシー] に移動

    2. プロジェクト選択ツールで、プロジェクト間のサービス アカウントの使用を無効にする組織とプロジェクトを選択します。

    3. プロジェクト間サービス アカウントの使用の無効化ポリシーを選択します。

    4. [ポリシーを管理] をクリックします。

    5. [ポリシーのソース] で、[親のポリシーをオーバーライドする] を選択します。

    6. [ルールの追加] をクリックします。

    7. [適用] で [オフ] を選択します。

    8. ポリシーを適用するには、[ポリシーを設定] をクリックします。

    gcloud

    サービス アカウントがあるプロジェクトで、iam.disableCrossProjectServiceAccountUsage 組織のポリシー制約が適用されていないことを確認します。この制約はデフォルトで適用されます。

    この組織のポリシーの制約を無効にするには、次のコマンドを実行します。

    gcloud resource-manager org-policies disable-enforce iam.disableCrossProjectServiceAccountUsage
        --project=SERVICE_ACCOUNT_PROJECT_ID
    

    SERVICE_ACCOUNT_PROJECT_ID は、サービス アカウントを含むプロジェクト ID に置き換えます。

ロール・メンバーシップをサービス アカウント リソースに直接適用することも、リソース階層の上位レベルから継承することもできます。

次のステップ