Cloud Run functions のトラブルシューティング
このドキュメントでは、Cloud Run functions の使用時に発生するエラー メッセージのトラブルシューティングと問題解決の方法について説明します。Cloud Run を使用して関数を作成またはデプロイした場合は、Cloud Run の問題のトラブルシューティングをご覧ください。
デプロイ
このセクションでは、デプロイ中に発生する可能性がある問題と、その修正方法について説明します。こうした問題の多くは、ロールと権限または構成の誤りに関連しています。
Cloud Functions v2 API を使用して作成された関数に対して gcloud functions、REST API、Terraform などで管理アクションを実行する ID は、Identity and Access Management を使用して認可します。この管理アクションには、関数の作成、更新、削除が含まれます。詳細については、IAM でアクセスを承認するをご覧ください。
関数のデプロイ中にランタイム サービス アカウントの権限がユーザーにない
すべての関数は、その関数が他のリソースにアクセスするときに ID として機能するサービス アカウントに関連付けられます。このランタイム サービス アカウントには、デフォルトのサービス アカウントまたはユーザー管理サービス アカウントのいずれかを使用できます。複数の関数が異なるリソースにアクセスする環境では、通常、関数ごとの ID を使用し、デフォルトのランタイム サービス アカウントではなく名前付きランタイム サービス アカウント(PROJECT_NUMBER-compute@developer.gserviceaccount.com)を使用することをおすすめします。
ランタイム サービス アカウントを使用するには、デプロイ担当者がそのサービス アカウントに対する iam.serviceAccounts.actAs 権限を持っている必要があります。デフォルト以外のランタイム サービス アカウントを作成するユーザーにはこの権限が自動的に付与されますが、他のデプロイ担当者にはユーザーがこの権限を付与する必要があります。
プロジェクト閲覧者、Cloud Functions デベロッパーまたは Cloud Functions 管理者のロールを持つユーザーに、ランタイム サービス アカウントに対する iam.serviceAccounts.actAs 権限を割り当てます。
エラー メッセージ
コンソール
You must have the iam.serviceAccounts.actAs permission on the selected service account. To obtain this permission, you can grant a role that includes it like the Service Account User role, on the project.
gcloud
デフォルト サービス アカウント:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
デフォルト以外のサービス アカウント:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
解決策
デフォルトまたはデフォルト以外のランタイム サービス アカウントで、サービス アカウント ユーザー ロール(roles/iam.serviceAccountUser)をユーザーに割り当てます。このロールには権限 iam.serviceAccounts.actAs が含まれています。
イベント ドリブンな関数をデプロイする際にデプロイ サービス アカウントに Pub/Sub の権限がない
Cloud Functions サービスでは、管理アクションを実行するときに、Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)を使用します。デフォルトでは、このアカウントには Cloud Functions cloudfunctions.serviceAgent ロールが割り当てられます。イベント ドリブン関数をデプロイするには、Cloud Functions サービスで Pub/Sub にアクセスして、トピックとサブスクリプションを構成する必要があります。適切な権限を付与せずにサービス アカウントに割り当てられたロールを変更すると、Cloud Functions サービスは Pub/Sub にアクセスできず、デプロイに失敗します。
エラー メッセージ
コンソール
Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/test-project-356312/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
解決策
デフォルトの cloudfunctions.serviceAgent ロールにサービス アカウントをリセットできます。
デフォルトのランタイム サービス アカウントが存在しない
ユーザー管理ランタイム サービス アカウントを指定しない場合、Cloud Functions はデフォルトのコンピューティング サービス アカウントをランタイム サービス アカウントとして使用します。ユーザー管理アカウントを指定せずにデフォルト アカウントを削除すると、デプロイは失敗します。
エラー メッセージ
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[404], code=[Ok], message=[Service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com was not found.]
解決策
この問題を解決するには、次のいずれかの方法を試してください。
関数をデプロイする前に、ユーザー管理のランタイム サービス アカウントを指定します。
デフォルト サービス アカウントの数値 ID でサービス アカウントの削除を取り消します。
関数をデプロイするときに Cloud Functions サービス エージェント サービス アカウントにプロジェクト バケットの権限がない
Cloud Run functions をトリガーできるのは、同じ Google Cloud Platform プロジェクトの Cloud Storage バケットからのイベントによるトリガーのみです。また、Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)には、プロジェクトに対する cloudfunctions.serviceAgent のロールが必要です。
エラー メッセージ
コンソール
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/<project-id>/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
解決策
この問題を解決するには、デフォルトのロールにこのサービス アカウントをリセットします。
プロジェクト編集者のロールを持つユーザーは、関数を公開できません
プロジェクト編集者のロールには、プロジェクト内のリソースを管理するための幅広い権限が付与されていますが、Cloud Functions を公開する権限は本来付与されていません。関数をデプロイするユーザーまたはサービスには run.services.setIamPolicy 権限が必要です。
エラー メッセージ
gcloud
ERROR: (gcloud.run.services.add-iam-policy-binding) PERMISSION_DENIED: Permission 'run.services.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME' (or resource may not exist).
解決策
次のことができます。
デプロイ担当者に、プロジェクト オーナーのロールまたは Cloud Functions 管理者のロールを割り当てます。
カスタムロールを作成して、権限を手動で付与します。
プロジェクトに、ドメインで制限された共有が適用されているかどうかを確認します。
リソース ロケーションの制限を含む組織のポリシーを使用している場合、関数のデプロイが失敗する
組織でリソース ロケーションの制約ポリシーを使用している場合、ポリシーで制限されているリージョンでは関数のデプロイが制限されます。 Google Cloud コンソールでは、関数のデプロイ中に、制限されているリージョンをリージョン プルダウンから選択することはできません。
エラー メッセージ
gcloud
ResponseError: status=[400], code=[Ok], message=["LOCATION" violates constraint "constraints/gcp.resourceLocations" on the resource "projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME".]
解決策
デプロイの成功に合わせて、リソース ロケーション制約の allowed_values リストまたは denied_values リストにロケーションを追加または削除できます。
関数のグローバル スコープの実行中に関数のデプロイが失敗する
このエラーは、コードに問題があったことを示します。デプロイ パイプラインで関数のデプロイは完了しましたが、最後のステップで関数へのヘルスチェックが失敗しました。このヘルスチェックは、関数のグローバル スコープを実行することになっており、そこで、例外のスロー、クラッシュ、タイムアウトが発生しました。通常、グローバル スコープは、ライブラリを読み込んでクライアントを初期化する部分です。
エラー メッセージ
Cloud Logging のログ:
Could not create or update Cloud Run service FUNCTION_NAME, Container Healthcheck failed. Revision REVISION_NAMEE is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.
解決策
この問題を解決するには、次のいずれかを行います。
エラー メッセージの詳細については、関数のビルドログをご覧ください。
関数がグローバル スコープを実行できなかった理由が明確でない場合は、グローバル変数の遅延初期化を使用して、コードを一時的にリクエスト呼び出しに移動することを検討してください。これにより、クライアント ライブラリに関するほかのログ ステートメントを追加でき、インスタンス化の際のタイムアウト(特に、他のサービスを呼び出す場合)や、クラッシュ / 例外のスローをまとめられます。
そうでない場合は、時間範囲を広げてみてください。Cloud Run functions のタイムアウトの上限を長くすると、初期化の余裕が生まれ、Cloud Run 環境でリソースをよりスケーラブルに割り当てることができるため、リソース不足が原因でこの問題が発生した場合に緩和できる可能性があります。
ソースコードには、コンソールまたは gcloud を介して、デプロイで正しく指定されているエントリ ポイント関数が含まれている必要があります。
閲覧者のロールを持つユーザーが関数をデプロイできない
プロジェクト閲覧者または Cloud Functions 閲覧者のロールを持つユーザーには、関数と関数の詳細の読み取り専用アクセス権が付与され、新しい関数をデプロイすることはできません。Google Cloud コンソールの [関数を作成] 機能がグレー表示になり、次のエラーが表示されます。
エラー メッセージ
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.generateUploadUrl' denied on 'projects/PROJECT_ID/locations/LOCATION/functions']
解決策
ユーザーに Cloud Functions デベロッパー ロールを割り当てます。
ビルド サービス アカウントに権限がない
エラー メッセージ
関数のデプロイエラーまたはビルドログに、次のいずれかのエラーが表示されることがあります。
The service account running this build does not have permission to write logs. To fix this, grant the Logs Writer (roles/logging.logWriter) role to the service account.
Step #0 - "fetch": failed to Fetch: failed to download archive gs://gcf-v2-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-v2-sources-PROJECT_NUMBER-LOCATION denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
Step #2 - "build": ERROR: failed to create image cache: accessing cache image "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": connect to repo store "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": GET https://LOCATION-docker.pkg.dev/v2/token?scope=repository%3APROJECT%2Fgcf-artifacts%2FFUNCTION_NAME%2Fcache%3Apull&service=: DENIED: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/PROJECT/locations/LOCATION/repositories/gcf-artifacts" (or it may not exist)
Could not build the function due to a missing permission on the build service account. If you didn't revoke that permission explicitly, this could be caused by a change in the organization policies.
解決策
ビルド サービス アカウントには、ソースバケットからの読み取り権限と、Artifact Deployment リポジトリの読み取り / 書き込み権限が必要です。このエラーは、Cloud Build がサービス アカウントを使用するデフォルトの動作が変更されたために発生する可能性があります。詳細については、Cloud Build サービス アカウントの変更をご覧ください。
この問題を解決するには、次のいずれかを行います。
- 関数のデプロイ用にカスタムビルド サービス アカウントを作成する。
- デフォルトの Compute サービス アカウントに Cloud Build サービス アカウントのロール(
roles/cloudbuild.builds.builder)を追加します。 - デフォルトのサービス アカウントの変更に関する Cloud Build のガイダンスを確認し、これらの変更を無効にする。
ビルド サービス アカウントが無効
エラー メッセージ
Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.
解決策
関数をデプロイするには、ビルド サービス アカウントを有効にする必要があります。このエラーは、Cloud Build がサービス アカウントを使用するデフォルトの動作が変更されたために発生する可能性があります。詳細については、Cloud Build サービス アカウントの変更をご覧ください。
この問題を解決するには、次のいずれかの解決策を試してください。
- 関数のデプロイ用にカスタムビルド サービス アカウントを作成する。
- デフォルトの Compute サービス アカウントを有効にする。
- デフォルトのサービス アカウントの変更に関する Cloud Build のガイダンスを確認し、これらの変更を無効にする。
サービング
このセクションでは、発生する可能性があるサービングに関する問題と、各問題の修正方法のヒントを示します。
認証を必要とする関数によるサービング権限エラー
[未認証の呼び出しを許可する] が有効になっていない HTTP 関数は、適切な権限のないエンドユーザーとサービス アカウントへのアクセスを制限します。このエラー メッセージは、呼び出し元には関数を呼び出す権限がないことを示します。