IAM によるアクセス制御(第 2 世代)
関数をデプロイするユーザーまたはサービス アカウントは、プロジェクト レベルでロールを使用してアクセス制御を設定できます。プロジェクト メンバーまたはサービス アカウントにロールを付与して、Google Cloud プロジェクトとプロジェクトのリソースへのアクセスレベルを決定します。デフォルトでは、すべての Google Cloud プロジェクトに単一のユーザー(元のプロジェクト作成者)が設定されています。その他のユーザーは、プロジェクト チームのメンバーとして追加されるまでプロジェクトにアクセスすることはできず、関数にもアクセスできません。
ユーザーのアクセス制御
ユーザーをチームメンバーとしてプロジェクトに追加し、Identity and Access Management(IAM)を使用してロールを付与することができます。
Cloud Functions では、基本ロールである編集者、オーナー、閲覧者をサポートしています。それぞれ、以下の権限が付与されます。
- 編集者と所有者: すべての関数に関連するリソースに対する読み取り / 書き込みアクセス権。ユーザーに対して関数のデプロイ、更新、削除が許可されます。プロジェクト内の他のリソースへのアクセスも許可されます。
- 閲覧者: 関数と場所に対する読み取り専用アクセス権。ユーザーは関数を一覧表示し、関数の詳細を参照できますが、ソースコードを表示することはできません。プロジェクト内の他のリソースへのアクセスも許可されます。
また Cloud Functions では、Cloud Functions の事前定義のデベロッパーおよび閲覧者のロールもサポートしています。それぞれ、以下の権限が付与されます。
- デベロッパー: すべての関数関連のリソースに対する読み取り / 書き込みアクセス権。ユーザーに対して関数のデプロイ、更新、削除が許可されます。プロジェクト内の他のリソースへのアクセスは許可されません。
- 閲覧者: 関数と場所に対する読み取り専用アクセス権。ユーザーは関数を一覧表示し、関数の詳細を参照できますが、ソースコードを表示することはできません。プロジェクト内の他のリソースへのアクセスは許可されません。
サービス アカウントのアクセス制御
サービス アカウントは特別なタイプの Google Cloud アカウントであり、データにアクセスしてさまざまなアクションを実行するために認証を受ける必要がある人間以外のユーザーの ID として機能します。これらのアカウントの一部は Google によって作成、管理され、サービス エージェントと呼ばれます。
Cloud Functions では次のサービス アカウントが使用されます。
名前 | メンバー ID | ロール |
---|---|---|
Compute Engine のデフォルトのサービス アカウント | PROJECT_ | 編集者 |
Google Cloud Functions サービス エージェント | service-PROJECT_ | Cloud Functions サービス エージェント |
— | PROJECT_ | Cloud Build サービス アカウント |
Cloud Build サービス アカウント | service-PROJECT_ | Cloud Build サービス エージェント |
Google Container Registry サービス エージェント | service-PROJECT_ | Container Registry サービス エージェント |
Artifact Registry サービス エージェント | service-PROJECT_ | Artifact Registry サービス エージェント |
ランタイム サービス アカウント
デフォルトでは、Cloud Functions はランタイムに Compute Engine のデフォルトのサービス アカウント(PROJECT_NUMBER-compute@developer.gserviceaccount.com
)を使用します。このアカウントには、プロジェクトの編集者のロールが付与されています。これらのサービス アカウントのロールを変更して、実行中の関数に対する権限を制限または拡張できます。また、デフォルト以外の個別のサービス アカウントを指定することで、使用するサービス アカウントを変更することもできます。
サービス アカウントの詳細については、サービス アカウントのドキュメントをご覧ください。
管理者サービス アカウント
関数の作成、更新、または削除中にプロジェクトの管理アクションを実行するには、Cloud Functions のすべてのプロジェクトに Google Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)が必要です。
さらに、すべてのランタイムで、プロジェクト内のコンテナ イメージのビルドと保存が実行されます。これをサポートするには、次のものもプロビジョニングする必要があります。
- 基本的な Cloud Build サービス アカウント(
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/ | リポジトリを管理し、ビルドイメージを Artifact Registry に保存します。 |
roles/ | ユーザー プロジェクトでビルドを実行するために、Cloud Build を使用する必要があります。 |
roles/ | Cloud Build カスタム ワーカーでビルドを作成します。 |
compute. 、compute. 、vpcaccess. | コンシューマー プロジェクトの VPC にアクセスできる関数をプロビジョニングします。 |
roles/ | 関数の Eventarc トリガーを管理します。 |
firebasedatabase. | Firebase Realtime Database でトリガーされる関数を作成します。 |
iam. | ランタイム サービス アカウントの認証情報を取得する機能。 |
iam. | エージェントがユーザー指定の権限で OpenID トークンを取得するために必要です。OpenID トークンは IAM が有効な関数を呼び出すために使用されます。 |
pubsub. | ユーザーのプロジェクトのサブスクリプションを管理します。 |
pubsub. | ユーザーのプロジェクトのトピックを管理します。 |
roles/ | 関数用の Cloud Run サービスを管理します。 |
storage. 、storage. | ソースコードをユーザー プロジェクトに保存するために必要です。 |
IAM 事前定義ロールで、または次のコマンドを実行して権限のセット全体を表示できます。
gcloud iam roles describe roles/cloudfunctions.serviceAgent
このサービス アカウントをデフォルトのロールに戻すには、現在のロールをすべて削除し、Cloud Functions サービス エージェントのロールを追加します。
gcloud projects add-iam-policy-bindingPROJECT_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
)にプロジェクトの 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 Functions のトラブルシューティングもご覧ください。