このドキュメントでは、Eventarc を使用して Google Cloud やその他のソースから Cloud Run サービスにイベントを転送する際に必要な Identity and Access Management(IAM)のロールと権限を付与する方法について説明します。
Eventarc API を呼び出すプリンシパルにプロジェクト全体の権限を付与します(Eventarc トリガー作成者など)。
- Eventarc 管理者ロールを使用すると、トリガーの作成時にサービス アカウントを指定するなど、すべての Eventarc リソースを完全に制御できます。
- サービス アカウント ユーザーのロールを使用すると、プリンシパルがサービス アカウントの権限を借用してサービス アカウントを使用できます。サービス アカウントは Eventarc トリガーに関連付けられ、トリガーの ID を表します。
トリガー サービス アカウントに Eventarc トリガー権限を付与する: Eventarc イベント受信者ロールを使用すると、Eventarc トリガーはイベント プロバイダからイベントを受信できます。Cloud Pub/Sub から直接イベントを転送する場合は、このロールを付与する必要はありません。
トリガー サービス アカウントに Cloud Run サービス権限を付与する: Cloud Run 起動元ロールを使用すると、Eventarc トリガーによってターゲットの Cloud Run サービスを呼び出すことができます。これは、認証された Cloud Run サービスにイベントを転送する場合に適用されます。
-
- Cloud Storage からの直接イベントのトリガーを作成する場合は、Pub/Sub パブリッシャーのロールを付与します。
- 2021 年 4 月 8 日以前に Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロールを付与します。
IAM ロールの付与の詳細については、アクセスの管理をご覧ください。必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
プロジェクト全体の権限を付与する
プロジェクト作成者にはオーナーロール(roles/owner
)が付与されます。デフォルトでは、このロールには、ほとんどの Google Cloud リソースに対する完全アクセスに必要な権限が含まれています。それ以外の場合は、適切なリソースの管理者が適切なプリンシパル(メンバー)に必要なロールを付与する必要があります。
プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。各プリンシパルには、一意の識別子(通常はメールアドレス)があります。
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
値の一覧については、ポリシー バインディングのリファレンスをご覧ください。
サービス アカウント ユーザーのロール(
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 のデフォルトのサービス アカウントが使用されます。
トリガーを柔軟に管理できるように、独自のユーザー管理サービス アカウントを作成することをおすすめします。
サービス アカウントを作成し、その名前をメモします。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --description="DESCRIPTION" \ --display-name="DISPLAY_NAME"
次のように置き換えます。
SERVICE_ACCOUNT_NAME
: サービス アカウントの名前。この名前は、サービス アカウントを識別するメールアドレスに表示されます。DESCRIPTION
: サービス アカウントの説明(省略可)DISPLAY_NAME
: Google Cloud コンソールに表示するサービス アカウント名
トリガーがイベントを受信できるように、プロジェクトの 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 起動元のみです。
承認済みの 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 サービスの名前に置き換えます。必要に応じて、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 を有効にして使用した後、サービス エージェントが作成されます。
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)'
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
次のステップ
Eventarc のアクセス制御オプションについて学習する。