IAM によるアクセス制御
このページでは、Identity and Access Management(IAM)ロールを使用してプロジェクト レベルでアクセス制御を設定し、gcloud functions
コマンドまたは Cloud Functions v2 API を使用して作成された Google Cloud プロジェクトと関数へのアクセスレベルを決定する方法について補足情報を提供します。
Cloud Run を使用して関数を作成またはデプロイした場合は、IAM によるアクセス制御と Cloud Run のロールで、Cloud Run の事前定義ロール、個々のサービスへのアクセス制御、サービスの公開、Cloud Run 呼び出し元 IAM の組織のポリシーの構成について詳しく説明しています。
ユーザーのアクセス制御
ユーザーをチームメンバーとしてプロジェクトに追加し、IAM を使用してロールを付与します。
Cloud Run functions は、次のロールをサポートしています。
- Cloud Run の事前定義ロール(推奨)
- Cloud Functions の事前定義ロール
- 編集者、オーナー、閲覧者の基本ロール。
サービス アカウントのアクセス制御
サービス アカウントは特別なタイプのGoogle Cloud アカウントであり、データにアクセスしてさまざまなアクションを実行するために認証を受ける必要がある人間以外のユーザーの ID として機能します。これらのアカウントの一部は Google によって作成、管理され、サービス エージェントと呼ばれます。
Cloud Run functions では次のサービス アカウントが使用されます。
名前 | メンバー ID | ロール |
---|---|---|
Compute Engine のデフォルトのサービス アカウント | PROJECT_NUMBER-compute@developer.gserviceaccount.com |
編集者 |
Google Cloud Functions サービス エージェント | service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com |
Google Cloud Functions サービス エージェント |
以前の Cloud Build サービス アカウント1 | PROJECT_NUMBER@cloudbuild.gserviceaccount.com |
Cloud Build サービス アカウント |
Cloud Build サービス アカウント | service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com |
Cloud Build サービス エージェント |
Google Container Registry サービス エージェント | service-PROJECT_NUMBER@containerregistry.iam.gserviceaccount.com |
Container Registry サービス エージェント |
Artifact Registry サービス エージェント | service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com |
Artifact Registry サービス エージェント |
ランタイム サービス アカウント
デフォルトでは、Cloud Run functions はランタイムに Compute Engine のデフォルトのサービス アカウント(PROJECT_NUMBER-compute@developer.gserviceaccount.com
)を使用します。このアカウントには、プロジェクトの編集者のロールが付与されています。これらのサービス アカウントのロールを変更して、実行中の関数に対する権限を制限または拡張できます。また、サービス ID の構成時にデフォルト サービス アカウントの使用を避けることで、使用するサービス アカウントを変更することもできます。
サービス アカウントの詳細については、サービス アカウントのドキュメントをご覧ください。
管理者サービス アカウント
関数の作成、更新、または削除中にプロジェクトの管理アクションを実行するには、Cloud Run functions のすべてのプロジェクトに Google Cloud Functions サービス エージェントのサービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)が必要です。
さらに、すべてのランタイムで、プロジェクト内のコンテナ イメージのビルドと保存が実行されます。これをサポートするには、次のものもプロビジョニングする必要があります。
- 以前の Cloud Build サービス アカウント1(
PROJECT_NUMBER@cloudbuild.gserviceaccount.com
) - Cloud Build サービス エージェント サービス アカウント(
service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com
) - Google Container Registry サービス エージェント サービス アカウント(
service-PROJECT_NUMBER@containerregistry.iam.gserviceaccount.com
)
これらのサービス アカウントには、前の表にリストされているロールが必要です。
Google Cloud Functions サービス エージェント サービス アカウント
デフォルトでは、Google Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)にはプロジェクトの cloudfunctions.serviceAgent ロールが付与されています。
cloudfunctions.serviceAgent
が使用する主な権限のいくつかを以下に示します。
権限 | 説明 |
---|---|
roles/artifactregistry.admin |
リポジトリを管理し、ビルドイメージを Artifact Registry に保存します。 |
roles/cloudbuild.builds.editor |
ユーザー プロジェクトでビルドを実行するために、Cloud Build を使用する必要があります。 |
roles/cloudbuild.customworkers.builder |
Cloud Build カスタム ワーカーでビルドを作成します。 |
compute.globalOperations.get 、compute.networks.access 、vpcaccess.connectors.{get, use} |
コンシューマー プロジェクトの VPC にアクセスできる関数をプロビジョニングします。 |
roles/eventarc.developer |
関数の Eventarc トリガーを管理します。 |
firebasedatabase.instances.{get, update} |
Firebase Realtime Database でトリガーされる関数を作成します。 |
iam.serviceAccounts.{actAs, getAccessToken, signBlob} |
ランタイム サービス アカウントの認証情報を取得する機能。 |
iam.serviceAccounts.getOpenIdToken |
エージェントがユーザー指定の権限で OpenID トークンを取得するために必要です。OpenID トークンは IAM が有効な関数を呼び出すために使用されます。 |
pubsub.subscriptions |
ユーザーのプロジェクトのサブスクリプションを管理します。 |
pubsub.topics |
ユーザーのプロジェクトのトピックを管理します。 |
roles/run.developer |
関数用の Cloud Run サービスを管理します。 |
storage.buckets.create 、storage.objects.{delete, get, create, list} |
ソースコードをユーザー プロジェクトに保存するために必要です。 |
IAM 事前定義ロールで、または次のコマンドを実行して、権限のセット全体を確認できます。
gcloud iam roles describe roles/cloudfunctions.serviceAgent
このサービス アカウントをデフォルトのロールに戻すには、ロールをすべて削除し、Cloud Functions サービス エージェントのロールを追加します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \ --role roles/cloudfunctions.serviceAgent
権限エラーのトラブルシューティング
プロジェクトで関数をデプロイ、更新、削除、または実行する際に権限エラーが発生した場合は、次の手順に沿って操作してください。
プロジェクトで編集者またはオーナーのロールを付与されていること、または Cloud Functions デベロッパーのロールを使用していることを確認します。
プロジェクト レベルで Cloud Functions デベロッパーのロールを使用している場合は、ユーザーに IAM サービス アカウント ユーザーのロールを付与していることも確認します。
現時点では、実行権限は関数ごとのレベルでのみ許可されます。
Cloud Functions サービス エージェントのサービス アカウント(
service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)に、プロジェクトの Cloud Functions サービス エージェント(cloudfunctions.serviceAgent
)のロールがあることを確認します。このアカウントを確認するには、Console IAM ページの [権限] タブで [Google 提供のロール付与を含みます] チェックボックスがオンになっていることを確認します。また、
gcloud projects add-iam-policy-binding PROJECT_ID
を使用することもできます。自身に Pub/Sub や Cloud Storage などのトリガーのソースの権限があることを確認します。
関数の実行時に「十分な権限がありません」というエラーが表示された場合、または他の認証問題が発生した場合は、関数が必要とするリソースにアクセスするための適切な権限がランタイム サービス アカウントに付与されていることを確認して、ステップ 2 と 3 をもう一度行ってください。
デプロイ中に「サービス利用不可」エラーが発生した場合は、プロジェクトにランタイム サービス アカウント PROJECT_ID@appspot.gserviceaccount.com
が存在することを確認してください。削除されたサービス アカウントを再作成するには、サービス アカウントの削除の取り消しをご覧ください。
Cloud Run functions のトラブルシューティングもご覧ください。
1 Cloud Run functions は、2024 年 7 月より前に作成されたプロジェクトでのみ、以前の Cloud Build サービス アカウントを使用します。