アクセス制御

アクセス制御は、役割を使ってプロジェクト レベルで設定できます。役割をプロジェクト メンバーやサービス アカウントに割り当てることで、Google Cloud Platform プロジェクトやそのリソースへのアクセスレベルが決まります。デフォルトでは、すべての Google Cloud Platform プロジェクトに、単一のユーザー(元のプロジェクト作成者)が設定されています。 その他のユーザーは、プロジェクト メンバーとして追加されるまでプロジェクトにアクセスすることはできないため、関数にアクセスできません。

ユーザーのアクセス制御

ユーザーをチームメンバーとしてプロジェクトに追加し、Identity and Access Management(IAM)を使用してロールを割り当てることができます。

Cloud Functions では、基本ロールである編集者オーナー閲覧者をサポートしています。それぞれ、次の権限が必要です。

  • 編集者所有者: すべての関数に関連するリソースに対する読み取り / 書き込みアクセス権。ユーザーに関数のデプロイ、更新、削除が許可されます。プロジェクト内の他のリソースへのアクセスも許可されます。
  • 閲覧者: 関数や場所に対する読み取り専用アクセス権。ユーザーは関数を一覧表示し、その詳細を参照できますが、ソースコードを表示することはできません。プロジェクト内の他のリソースへのアクセスも許可されます。

また Cloud Functions では、Cloud Functions のキュレートされたロールデベロッパー閲覧者)もサポートしています。それぞれ、以下の権限が付与されます。

  • デベロッパー: すべての関数関連のリソースに対する読み取り / 書き込みアクセス権。ユーザーに関数のデプロイ、更新、削除が許可されます。プロジェクト内の他のリソースへのアクセスは許可されません。
  • 閲覧者: 関数や場所に対する読み取り専用アクセス権。ユーザーは関数を一覧表示し、その詳細を参照できますが、ソースコードを表示することはできません。プロジェクト内の他のリソースへのアクセスは許可されません。

サービス アカウントのアクセス制御

サービス アカウントは特別なタイプの Google アカウントで、データにアクセスしてさまざまなアクションを実行するために認証を受ける必要がある人間以外のユーザーの ID として機能します。

次のサービス アカウントは、すべての Cloud Functions ランタイムで使用されます。

名前 メンバー ID ロール
App Engine デフォルト サービス アカウント PROJECT_ID@appspot.gserviceaccount.com 編集者
Google Cloud Functions サービス エージェント service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com Cloud Functions サービス エージェント

さらに、Node.js 8 と Go 1.11 を除くすべてのランタイムで、次のサービス アカウントが必要です。

名前 メンバー ID ロール
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 サービス エージェント

ランタイム サービス アカウント

デフォルトでは、Cloud Functions はランタイムに App Engine のデフォルトのサービス アカウント(PROJECT_ID@appspot.gserviceaccount.com)を使用します。このアカウントには、プロジェクトの編集者のロールが付与されています。このサービス アカウントの役割を変更して、実行中の関数に対する権限を制限または拡張できます。また、関数ごとにデフォルト以外のサービス アカウントを指定することで、使用するサービス アカウントを変更することもできます。

サービス アカウントの詳細については、サービス アカウントのドキュメントをご覧ください。

管理者サービス アカウント

関数の作成、更新または削除中にプロジェクトの管理アクションを実行するには、Cloud Functions のすべてのプロジェクトで Google Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)が必要になります。

さらに、Node.js 8 と Go 1.11 を除くすべてのランタイムで、プロジェクト内のコンテナ イメージのビルドと保存が実行されます。この場合は、以下をプロビジョニングする必要があります。

これらのサービス アカウントには、上記のにあるロールが必要です。

Google Cloud Functions サービス エージェント サービス アカウント

デフォルトでは、Google Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)にはプロジェクトの cloudfunctions.serviceAgent ロールがあります。このアカウントの権限を変更すると、関数の作成、更新、削除が失敗することがあります。

cloudfunctions.serviceAgent ロールには次の権限が付与されています。

権限 説明
pubsub.subscriptions.* ユーザーのプロジェクトのサブスクリプションを管理します。
pubsub.topics.create 関数がデプロイされると新しいトピックを作成します。
pubsub.topics.attachSubscription 既存のトピックにサブスクリプションを関連付けます。
pubsub.topics.get 関数がトリガーされる既存のトピックを取得します。
pubsub.subscriptions.get 関数をトリガーするサブスクリプションを取得します。
pubsub.topics.list Pub / Sub トピックの存在を確認するために必要です。
iam.serviceAccounts.{getAccessToken, signBlob} ランタイム サービス アカウントの認証情報を取得する機能。
iam.serviceAccounts.getOpenIdToken エージェントがユーザー指定の権限で OpenID トークンを取得するために必要です。OpenID トークンは IAM が有効な関数を呼び出すために使用されます。
resourcemanager.projects.get プロジェクトの詳細を取得します。
resourcemanager.projects.getIamPolicy 関数の起点を特定します。
firebasedatabase.instances.{get, update} Firebase Realtime Database でトリガーされる関数を作成します。
storage.buckets.{get, update} 関数をトリガーする GCS バケットに通知を構成します。
storage.buckets.create
storage.objects.{delete, get, create, list}
ソースコードをユーザー プロジェクトに保存するために必要です。
clientauthconfig.clients.list IAM で保護された HTTP 関数のプロジェクトの OAuth クライアントを一覧表示します。
cloudfunctions.functions.invoke IAM で保護された HTTP 関数を呼び出します。
compute.globalOperations.get
compute.networks.access
vpcaccess.connectors.{get, use}
コンシューマー プロジェクトの VPC にアクセスできる関数をプロビジョニングします。
cloudbuild.customworkers.builder Cloud Build カスタム ワーカーでビルドを作成します。
cloudbuild.builds.editor
serviceusage.services.use
ユーザー プロジェクトでビルドを実行するために、Cloud Build を使用する必要があります。

このサービス アカウントをデフォルトの役割に戻すには、現在の役割をすべて削除し、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

権限エラーのトラブルシューティング

プロジェクトで関数をデプロイ、更新、削除、または実行する際に権限エラーが発生した場合は、次の手順に沿って操作してください。

  1. プロジェクトで編集者またはオーナーのロールを持っていること、またはCloud Functions デベロッパーのロールを使用していることを確認します。
    Cloud Functions デベロッパーのロールを使用している場合は、ユーザーにIAM サービス アカウント ユーザーのロールを付与していることも確認します。
  2. Cloud Functions サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)がプロジェクトの cloudfunctions.serviceAgent ロールを持っていることを確認します。
  3. 自身に Pub/SubCloud Storage などのトリガーのソースの権限があることを確認します。

関数の実行時に「十分な権限がありません」というエラーが表示された場合や、他の認証問題が発生した場合は、関数がリソースにアクセスするために必要な権限がランタイム サービス アカウントに付与されていることを確認して、上の手順 2 と 3 を行ってください。

デプロイ中に「サービス利用不可」エラーが発生した場合は、プロジェクトにランタイム サービス アカウント PROJECT_ID@appspot.gserviceaccount.com が存在することを確認してください。 このサービス アカウントが削除された場合に再作成する方法については、サービス アカウントの削除の取り消しをご覧ください。

Cloud Functions のトラブルシューティングもご覧ください。