Cloud Run ターゲットのロールと権限

このドキュメントでは、Eventarc を使用して Google Cloud やその他のソースから Cloud Run サービスにイベントを転送する際に必要な Identity and Access Management(IAM)のロールと権限を付与する方法について説明します。

  1. Eventarc API を呼び出すプリンシパルにプロジェクト全体の権限を付与します(Eventarc トリガー作成者など)。

    1. Eventarc 管理者ロールを使用すると、トリガーの作成時にサービス アカウントを指定するなど、すべての Eventarc リソースを完全に制御できます。
    2. サービス アカウント ユーザーのロールを使用すると、プリンシパルがサービス アカウントの権限を借用してサービス アカウントを使用できます。サービス アカウントは Eventarc トリガーに関連付けられ、トリガーの ID を表します。
  2. トリガー サービス アカウントに Eventarc トリガー権限を付与する: Eventarc イベント受信者ロールを使用すると、Eventarc トリガーはイベント プロバイダからイベントを受信できます。Cloud Pub/Sub から直接イベントを転送する場合は、このロールを付与する必要はありません。

  3. トリガー サービス アカウントに Cloud Run サービス権限を付与する: Cloud Run 起動元ロールを使用すると、Eventarc トリガーによってターゲットの Cloud Run サービスを呼び出すことができます。これは、認証された Cloud Run サービスにイベントを転送する場合に適用されます。

  4. Google サービス エージェントに権限を付与する:

    1. Cloud Storage からの直接イベントのトリガーを作成する場合は、Pub/Sub パブリッシャーのロールを付与します。
    2. 2021 年 4 月 8 日以前に Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロールを付与します。

IAM ロールの付与の詳細については、アクセスの管理をご覧ください。必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

プロジェクト全体の権限を付与する

プロジェクト作成者にはオーナーロールroles/owner)が付与されます。デフォルトでは、このロールには、ほとんどの Google Cloud リソースに対する完全アクセスに必要な権限が含まれています。それ以外の場合は、適切なリソースの管理者が適切なプリンシパル(メンバー)に必要なロールを付与する必要があります。

プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。各プリンシパルには、一意の識別子(通常はメールアドレス)があります。

  1. Eventarc 管理者ロールroles/eventarc.admin)を使用すると、すべての Eventarc リソースを完全に制御できます。

    プロジェクトに対するロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=PRINCIPAL \
        --role=roles/eventarc.admin

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

    • PROJECT_ID: Google Cloud プロジェクト ID。
    • PRINCIPAL: トリガー作成者の識別子。通常、PRINCIPAL_TYPE:ID の形式で指定します。例: user:my-user@example.com。有効な PRINCIPAL_TYPE 値の一覧については、ポリシー バインディングのリファレンスをご覧ください。
  2. サービス アカウント ユーザーのロールroles/iam.serviceAccountUser)を使用すると、プリンシパルはサービス アカウントとして操作を実行できます。

    たとえば、ユーザー管理のサービス アカウントを Eventarc トリガーに関連付けるには、このロールが必要です。また、Cloud Run サービスをデプロイするときに、ランタイム サービス アカウントとして機能させる場合にも必要です。詳細については、サービス アカウントの認証に必要なロールをご覧ください。

    プロジェクトに対するロールを付与して、プリンシパルに複数のサービス アカウントの権限借用を許可します。あるいは、サービス アカウントにロールを付与して、プリンシパルに特定のサービス アカウントの権限借用を許可します。

    プロジェクトに対するロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=PRINCIPAL \
        --role=roles/iam.serviceAccountUser

    または、サービス アカウントにロールを付与します。

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

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

    • SERVICE_ACCOUNT_PROJECT_ID: サービス アカウントを含む Google Cloud プロジェクト ID。
    • SERVICE_ACCOUNT_NAME: サービス アカウントの名前。

Eventarc トリガーの権限を付与する

すべての Eventarc トリガーは、トリガーの作成時に IAM サービス アカウントに関連付けられます。トリガーがデフォルトの ID として使用するユーザー管理のサービス アカウントを指定できます。トリガーの作成時にサービス アカウントを指定しない場合、トリガーの ID に Compute Engine のデフォルトのサービス アカウントが使用されます。

トリガーを柔軟に管理できるように、独自のユーザー管理サービス アカウントを作成することをおすすめします。

  1. サービス アカウントを作成し、その名前をメモします。

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"

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

    • SERVICE_ACCOUNT_NAME: サービス アカウントの名前。この名前は、サービス アカウントを識別するメールアドレスに表示されます。
    • DESCRIPTION: サービス アカウントの説明(省略可)
    • DISPLAY_NAME: Google Cloud コンソールに表示するサービス アカウント名
  2. トリガーがイベントを受信できるように、プロジェクトの Eventarc イベント受信者のロールroles/eventarc.eventReceiver)を Eventarc トリガーに関連付けられたサービス アカウントに付与します。

    Cloud Pub/Sub から直接イベントを転送する場合は、Eventarc イベント受信者のロールを付与する必要はありません。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/eventarc.eventReceiver

    SERVICE_ACCOUNT_NAME は、前の手順でメモしたサービス アカウントの名前に置き換えます。

Cloud Run サービスの権限を付与する

すべての Cloud Run サービスは、デフォルトで非公開にデプロイされます。リクエストで認証情報を提供しないと、サービスにアクセスできません。ドメインで制限された共有の組織のポリシーがあるプロジェクトの場合は、公開(未認証)アクセスではなく、認証済みの Cloud Run ターゲット サービスを使用します。

デフォルトでは、Cloud Run サービスを呼び出すことができるのは、プロジェクト オーナー、プロジェクト編集者、Cloud Run 管理者、Cloud Run 起動元のみです。

  1. 承認済みの Cloud Run ターゲット サービスにイベントを転送する場合、Cloud Run 起動元ロールrun.invoker)が、Eventarc トリガーに関連付けられたユーザー管理サービス アカウントに送信さます。

    gcloud run services add-iam-policy-binding SERVICE_NAME \
        --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/run.invoker

    SERVICE_NAME は、Cloud Run サービスの名前に置き換えます。

  2. 必要に応じて、Google Cloud プロジェクト内のすべての Cloud Run サービスとジョブにロールを付与できます。詳細については、プロジェクト内のすべてのサービスとジョブへのアクセスを制御するをご覧ください。

Cloud Run 起動元ロールを付与せずに承認済みの Cloud Run サービスのトリガーを作成すると、トリガーは正常に作成され、アクティブになります。ただし、トリガーは期待どおりに機能せず、次のようなメッセージがログに記録されます。

The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.

サービス エージェントに権限を付与する

一部の Google Cloud サービスでは、ユーザーのリソースにアクセスするために、サービス エージェントを使用します。API にサービス エージェントが必要な場合は、API を有効にして使用した後、サービス エージェントが作成されます。

  1. Cloud Storage からの直接イベントのトリガーを作成する場合、トピックへのメッセージのパブリッシュをサポートするには、Pub/Sub パブリッシャーのロールroles/pubsub.publisher)をプロジェクトの Cloud Storage サービス エージェントに送信します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com \
        --role=roles/pubsub.publisher

    PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  2. 2021 年 4 月 8 日以前に Cloud Pub/Sub サービス エージェントを有効にしていて、承認済みの Pub/Sub push リクエストをサポートするには、Pub/Sub サービス エージェントのプロジェクトにサービス アカウント トークン作成者のロールroles/iam.serviceAccountTokenCreator)を付与します。それ以外の場合、このロールはデフォルトで付与されます。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

次のステップ