Cloud Functions のトラブルシューティング

このドキュメントでは、発生する可能性のある一般的な問題とその対処方法について説明します。

デプロイ

デプロイ フェーズでは問題がよく発生します。デプロイ中に発生する可能性のある問題の多くは、ロールと権限に関連しています。その他の問題は、正しくない構成に関連しています。

閲覧者のロールを持つユーザーが関数をデプロイできない

プロジェクト閲覧者または Cloud Functions 閲覧者のロールが割り当てられているユーザーには、関数と関数の詳細への読み取り専用権限が付与されます。これらのロールは新しい関数をデプロイできません。

エラー メッセージ

Cloud コンソール

You need permissions for this action. Required permission(s): cloudfunctions.functions.create

Cloud SDK

ERROR: (gcloud.functions.deploy) PERMISSION_DENIED: Permission
'cloudfunctions.functions.sourceCodeSet' denied on resource
'projects/<PROJECT_ID>/locations/<LOCATION>` (or resource may not exist)

解決策

適切なアクセス権を持つロールをユーザーに割り当てます

プロジェクト閲覧者または Cloud Functions の関数のロールを持つユーザーが、関数をデプロイできない

関数をデプロイするには、プロジェクト閲覧者、Cloud Functions の関数デベロッパー、または Cloud Functions の関数管理者のロールが割り当てられているユーザーに、追加のロールが割り当てられている必要があります。

エラー メッセージ

Cloud コンソール

User does not have the iam.serviceAccounts.actAs permission on
<PROJECT_ID>@appspot.gserviceaccount.com required to create function.
You can fix this by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=user: --role=roles/iam.serviceAccountUser'

Cloud SDK

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Forbidden],
message=[Missing necessary permission iam.serviceAccounts.actAs for <USER>
on the service account <PROJECT_ID>@appspot.gserviceaccount.com. Ensure that
service account <PROJECT_ID>@appspot.gserviceaccount.com is a member of the
project <PROJECT_ID>, and then grant <USER> the role 'roles/iam.serviceAccountUser'.
You can do that by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=<USER> --role=roles/iam.serviceAccountUser'
In case the member is a service account please use the prefix 'serviceAccount:' instead of 'user:'.]

解決策

Cloud Functions ランタイム サービス アカウントをスコープとしてユーザーに追加のロール割り当てます(サービス アカウント ユーザーの IAM ロール(roles/iam.serviceAccountUser)を割り当てます)。

関数をデプロイする際にデプロイ サービス アカウントにサービス エージェントのロールがない

Cloud Functions サービスでは、プロジェクトに対して管理アクションを実行するときに、Cloud Functions サービス エージェント サービス アカウント(service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com)を使用します。デフォルトでは、このアカウントには Cloud Functions cloudfunctions.serviceAgent ロールが割り当てられます。このロールは、Cloud Pub/Sub、IAM、Cloud Storage、Firebase との統合に必要です。このサービス アカウントのロールを変更すると、デプロイに失敗します。

エラー メッセージ

Cloud コンソール

Missing necessary permission resourcemanager.projects.getIamPolicy for
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com on project <PROJECT_ID>.
Please grant serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=7,
message=Missing necessary permission resourcemanager.projects.getIamPolicy
for serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
on project <PROJECT_ID>. Please grant
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

解決策

デフォルトのロールにこのサービス アカウントをリセットします。

イベント ドリブンな関数をデプロイする際にデプロイ サービス アカウントに Pub/Sub の権限がない

Cloud Functions サービスでは、管理アクションを実行するときに、Cloud Functions サービス エージェント サービス アカウント(service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com)を使用します。デフォルトでは、このアカウントには Cloud Functions cloudfunctions.serviceAgent ロールが割り当てられます。イベント ドリブン関数をデプロイするには、Cloud Functions サービスで Cloud Pub/Sub にアクセスして、トピックとサブスクリプションを構成する必要があります。サービス アカウントに割り当てられたロールが変更されているものの、適切な権限が別途付与されていない場合、Cloud Functions サービスは Cloud Pub/Sub にアクセスできず、デプロイに失敗します。

エラー メッセージ

Cloud コンソール

Failed to configure trigger PubSub projects/<PROJECT_ID>/topics/<FUNCTION_NAME>

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=13,
message=Failed to configure trigger PubSub projects/<PROJECT_ID>/topics/<FUNCTION_NAME>

解決策

次のことが可能です。

デフォルトのランタイム サービス アカウントが存在しません

ユーザー管理のランタイム サービス アカウントが指定されていない場合、第 1 世代の関数は、デフォルトで App Engine のサービス アカウントをランタイム サービス アカウントとして使用します。このデフォルトのアカウントが削除されており、ユーザー管理のアカウントが指定されていない場合、デプロイは失敗します。

エラー メッセージ

Cloud コンソール

Default service account '<PROJECT_ID>@appspot.gserviceaccount.com' doesn't exist. Please recreate this account or specify a different account. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.

Cloud SDK

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account '<PROJECT_ID>@appspot.gserviceaccount.com' doesn't exist. Please recreate this account or specify a different account. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.]

解決策

関数のデプロイ中にランタイム サービス アカウントの権限がユーザーにない

複数の関数が異なるリソースにアクセスする環境では、通常、関数ごとの ID を使用し、デフォルトのランタイム サービス アカウントではなく名前付きランタイム サービス アカウント(PROJECT_ID@appspot.gserviceaccount.com)を使用することをおすすめします。

ただし、デフォルト以外のランタイム サービス アカウントを使用するには、デプロイ担当者はそのデフォルト以外のアカウントに対する iam.serviceAccounts.actAs 権限を持っている必要があります。デフォルト以外のランタイム サービス アカウントを作成するユーザーにはこの権限が自動的に付与されますが、他のデプロイ担当者には適切な権限を持つユーザーによりこの権限が付与される必要があります。

エラー メッセージ

Cloud SDK

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Bad Request],
message=[Invalid function service account requested: <SERVICE_ACCOUNT_NAME@<PROJECT_ID>.iam.gserviceaccount.com]

解決策

デフォルト以外の <SERVICE_ACCOUNT_NAME> ランタイム サービス アカウントに対する roles/iam.serviceAccountUser ロールをユーザーに割り当てます。このロールには権限 iam.serviceAccounts.actAs が含まれています。

関数のデプロイ中に Cloud Functions サービス エージェント サービス アカウントにプロジェクト バケットの権限がない

Cloud Functions をトリガーできるのは、同じ Google Cloud Platform プロジェクトの Cloud Storage バケットからのイベントによるトリガーのみです。また、Cloud Functions サービス エージェント サービス アカウント(service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com)には、プロジェクトに対する cloudfunctions.serviceAgent のロールが必要です。

エラー メッセージ

Cloud コンソール

Deployment failure: Insufficient permissions to (re)configure a trigger
(permission denied for bucket <BUCKET_ID>). Please, give owner permissions
to the editor role of the bucket and try again.

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Insufficient
permissions to (re)configure a trigger (permission denied for bucket <BUCKET_ID>).
Please, give owner permissions to the editor role of the bucket and try again.

解決策

次のことが可能です。

  • デフォルトのロールにこのサービス アカウントをリセットします。

    または

  • ランタイム サービス アカウントに cloudfunctions.serviceAgent ロールを付与します。

    または

  • ランタイム サービス アカウントに storage.buckets.{get, update} 権限と resourcemanager.projects.get 権限を付与します。

プロジェクト編集者のロールを持つユーザーは、関数を公開できません

未承認のデベロッパーが関数呼び出しの認証設定を変更できないようにするには、関数をデプロイするユーザーまたはサービスに cloudfunctions.functions.setIamPolicy 権限を付与します。

エラー メッセージ

Cloud SDK

ERROR: (gcloud.functions.add-iam-policy-binding) ResponseError: status=[403], code=[Forbidden], message=[Permission 'cloudfunctions.functions.setIamPolicy' denied on resource 'projects/<PROJECT_ID>/locations/<LOCATION>/functions/<FUNCTION_NAME> (or resource may not exist).]

解決策

例を挙げてみます。

Cloud Build が VPC-SC をサポートしていないため関数のデプロイに失敗する

Cloud Functions では、Cloud Build を使用してソースコードを実行可能なコンテナに構築します。VPC Service Controls で Cloud Functions を使用するには、サービス境界での Cloud Build サービス アカウントのアクセスレベルを構成する必要があります。

エラー メッセージ

Cloud コンソール

次のいずれかです。

Error in the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

Cloud SDK

次のいずれかです。

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Error in
the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

解決策

プロジェクトの監査対象リソースログで VPC Service Controls のセクションに「Request is prohibited by organization's policy」と表示され、Cloud Storage ラベルがある場合は、Cloud Build サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する必要があります。

エントリ ポイントが正しく指定されていないため関数のデプロイに失敗する

コードへのエントリ ポイント(エクスポートされた関数名)が正しく指定されていない場合、Cloud Functions のデプロイに失敗します。

エラー メッセージ

Cloud コンソール

Deployment failure: Function failed on loading user code. Error message:
Error: please examine your function logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. Error message: Please examine your function
logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

解決策

ソースコードには、Cloud Console または Cloud SDK を介して、デプロイで正しく指定されているエントリ ポイント関数が含まれている必要があります。

リソース ロケーションの制約を含む組織のポリシーを使用している場合、関数のデプロイが失敗する

組織でリソース ロケーションの制約ポリシーを使用している場合、このエラーがログに記録されることがあります。これは、デプロイのパイプラインがマルチリージョン ストレージ バケットの作成に失敗したことを示します。

エラー メッセージ

Cloud Build のログ:

Token exchange failed for project '<PROJECT_ID>'.
Org Policy Violated: '<REGION>' violates constraint 'constraints/gcp.resourceLocations'

Cloud Storage のログ:

<REGION>.artifacts.<PROJECT_ID>.appspot.com` storage bucket could not be created.

解決策

組織のポリシーの制約で constraints/gcp.resourceLocations を使用している場合は、適切なマルチリージョン ロケーションを指定する必要があります。たとえば、us リージョンのいずれかにデプロイする場合は、us-locations を含める必要があります。

ただし、きめ細かい制御が必要で、関数のデプロイを複数のリージョンではなく、単一のリージョンに限定する場合は、マルチリージョン バケットを作成してから、次の操作を行います。

  1. マルチリージョン全体を許可する
  2. テスト関数をデプロイする
  3. デプロイが成功したら、特定のリージョンのみを許可するように組織のポリシーを変更します。

マルチリージョン ストレージ バケットは、そのリージョンで引き続き使用されるため、以降のデプロイは成功します。後でマルチリージョンのストレージ バケットが作成されたリージョン以外のリージョンで allowlist を実行する場合は、この手順を繰り返します。

関数のグローバル スコープの実行中に関数のデプロイが失敗する

このエラーは、コードに問題があったことを示します。デプロイ パイプラインで関数のデプロイは完了しましたが、最後のステップで関数へのヘルスチェックが失敗しました。このヘルスチェックは、関数のグローバル スコープを実行することになっており、そこで、例外のスロー、クラッシュ、タイムアウトが発生しました。通常、グローバル スコープは、ライブラリを読み込んでクライアントを初期化する部分です。

エラー メッセージ

Cloud Logging のログ:

"Function failed on loading user code. This is likely
due to a bug in the user code."

解決策

エラー メッセージの詳細については、関数のビルドログと、関数のランタイムログをご覧ください。関数がグローバル スコープを実行できなかった理由が明確でない場合は、グローバル変数の遅延初期化を使用して、コードを一時的にリクエスト呼び出しに移動することを検討してください。これにより、クライアント ライブラリに関するほかのログ ステートメントを追加でき、インスタンス化の際のタイムアウト(特に、他のサービスを呼び出す場合)や、クラッシュ / 例外のスローをまとめられます。また、関数のタイムアウト値を引き上げることもできます。

構築

関数のソースコードを Cloud Functions にデプロイすると、そのソースは Cloud Storage バケットに保存されます。Cloud Build はコードを自動的にコンテナ イメージに構築し、そのイメージを Container Registry に push します。Cloud Functions は、関数を実行するためにコンテナを実行する必要がある場合に、このイメージにアクセスします。

Container Registry イメージがないためビルドに失敗した

Cloud Functions(第 1 世代)は、Container Registry を使用して関数のイメージを管理します。Container Registry は、Cloud Storage を使用してイメージのレイヤを STORAGE-REGION.artifacts.PROJECT-ID.appspot.com という名前のバケットに保存します。これらのバケットでオブジェクトのライフサイクル管理を使用すると、デプロイがこれらのイメージに依存しているため、関数のデプロイが中断されます。

エラー メッセージ

Cloud コンソール

Build failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Build
failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

解決策

  1. Container Registry で必要なバケットのライフサイクル管理を無効にします。
  2. 影響を受ける関数のイメージをすべて削除します。ビルドログにアクセスして、イメージパスを見つけることができます。スクリプトを参照して、イメージを一括削除します。これは、現在デプロイされている関数には影響しません。
  3. 関数を再デプロイします。

Serving

サービス提供フェーズでも、エラーが発生します。

認証を必要とする関数による権限提供のエラー

[未認証の呼び出しを許可する] が有効になっていない HTTP 関数は、適切な権限のないエンドユーザーとサービス アカウントへのアクセスを制限します。このエラー メッセージは、呼び出し元には関数を呼び出す権限がないことを示します。

エラー メッセージ

HTTP エラー レスポンス コード: 403 Forbidden

HTTP エラー レスポンス本文: Error: Forbidden ご利用のクライアントには、このサーバーから URL(/<FUNCTION_NAME>)を取得する権限がありません。

解決策

次のことが可能です。

  • 未認証の呼び出しを許可するために、関数を再デプロイします(組織でサポートされている場合)。これはテストする場合に役立ちます。

  • リクエスト ヘッダーで認証情報を使用して HTTP 関数を呼び出します。たとえば、次のように gcloud で ID トークンを取得します。

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
    

    呼び出しの認証をご覧ください。

  • Cloud Functions(第 1 世代)の場合は、特定の関数のすべてのユーザーに公開(未認証)アクセスを許可します。

  • Cloud Functions(第 2 世代)の場合は、次のいずれかを行います。

    • 特定の関数に対して、ユーザーに Cloud Run 起動元 Cloud IAM ロールを割り当てます。

    • Google Cloud コンソール:

      Google Cloud コンソールに移動

      1. アクセスを許可する関数の名前をクリックします。

      2. 関数の概要ページの右上隅にある [Powered By Cloud Run] リンクをクリックします。

      3. [トリガー] をクリックして、[未認証の呼び出しを許可する] を選択します。

      4. [保存] をクリックします。

「内部トラフィックのみを許可」の構成による権限提供のエラー

上り(内向き)設定により、Google Cloud プロジェクトまたは VPC Service Controls サービス境界の外部のリソースから HTTP 関数を呼び出せるかどうかを制限します。上り(内向き)のネットワーク処理に対して「内部トラフィックのみを許可」の設定が構成されている場合、このエラー メッセージは、同じプロジェクトまたは VPC Service Controls 境界内の VPC ネットワークからのリクエストのみが許可されることを示します。

エラー メッセージ

HTTP エラー レスポンス コード: 403 Forbidden

HTTP エラー レスポンス本文: Error 403 (Forbidden) 403エラーが発生しました。アクセスは禁止されています。お知らせできる情報は以上です。

解決策

例を挙げてみます。

  • リクエストが Google Cloud プロジェクトまたは VPC Service Controls サービス境界から発生していることを確認します。

    または

  • 上り(内向き)設定を変更して、関数のすべてのトラフィックを許可します。

関数の呼び出しに有効な認証情報がない

アクセス制限が設定された Cloud Functions の関数を呼び出すには、ID トークンが必要です。アクセス トークン更新トークンは使用できません。

エラー メッセージ

HTTP エラー レスポンス コード: 401 Unauthorized

HTTP エラー レスポンスの本文: Your client does not have permission to the requested URL

解決策

リクエストに Authorization: Bearer ID_TOKEN ヘッダーが含まれていることと、トークンが、アクセス トークンや更新トークンではなく、ID トークンであることを確認してください。サービス アカウントの秘密鍵を使用してこのトークンを手動で生成する場合は、こちらのガイドに沿って、Google によって署名された ID トークンと自己署名の JWT トークンを交換する必要があります。

curl を使用して関数を呼び出すと Google ログインページにリダイレクトされる

存在しない関数を呼び出そうとすると、Cloud Functions から HTTP/2 302 リダイレクトが返され、Google アカウント ログイン ページが表示されます。この処理は正しくありません。本来は HTTP/2 404 エラー レスポンス コードを返すはずです。現在、この問題の解決に努めています。

解決策

関数の名前を正しく指定していることを確認してください。gcloud functions call を使用していつでも確認できます。これは、関数が見つからない場合に、正しい 404 エラーを返します。

アプリケーションがクラッシュして関数の実行が失敗する

このエラーは、関数を実行するプロセスが異常終了したことを示します。通常は、関数のコードの問題によるランタイムでのクラッシュが原因です。また、関数のコード内で、デッドロックやほかの状態により、ランタイムが応答しなくなったときにも発生します。

エラー メッセージ

Cloud Logging のログ: 「Infrastructure cannot communicate with function.There was likely a crash or deadlock in the user-provided code.」

解決策

異なるランタイムでは、クラッシュする状況も変わります。根本原因を見つけるには、デバッグレベルの詳細なログを出力し、アプリケーションのロジックを確認して、エッジケースをテストします。

現在、Cloud Functions Python37 ランタイムには、ロギングを処理できるスピードに関する既知の制限事項があります。Python37 ランタイム インスタンスからのログ ステートメントが一定の早さ以上のペースで書き込まれると、このエラーが発生する可能性があります。Python ランタイム バージョン 3.8 以降には、この制限はありません。この問題を回避するため、Python ランタイムの上位バージョンへの移行をおすすめします。

それでもエラーの原因が不明な場合は、サポートページをご覧ください。

関数が実行中に停止するか、コードの終了後に実行を継続する

一部の Cloud Functions ランタイムでは、ユーザーが非同期タスクを実行できます。関数がこのようなタスクを作成する場合、これらのタスクが完了するまで明示的に待機する必要があります。これを行わないと、関数が誤ったタイミングで実行されなくなる可能性があります。

エラーの動作

関数の次のいずれかの動作を示します。

  • 関数は、非同期タスクが引き続き実行中であっても、指定されたタイムアウト期間が経過する前に終了します。
  • これらのタスクが完了しても、関数は実行を停止せず、タイムアウト期間が終了するまで実行を継続します。

解決策

関数が早期に終了する場合は、次の処理のいずれかを行う前に、すべての関数の非同期タスクが完了していることを確認してください。

  • 値を返す
  • 返された Promise オブジェクトを解決または拒否する(Node.js 関数のみ)
  • キャッチされなかった例外やエラーをスローする
  • HTTP レスポンスを送信する
  • コールバック関数を呼び出す

すべての非同期タスクが完了した時点で関数が終了しない場合は、関数が Cloud Functions のシグナルを正しく伝えているかどうかを確認する必要があります。特に、関数の非同期タスクが完了したら直ちに上に記載した操作のいずれかを行ってください。

JavaScript ヒープのメモリ不足

Node.js 12 以降の場合、メモリの上限が 2 GiB を超える関数では、ユーザーは max_old_space_size を指定するように NODE_OPTIONS を構成する必要があります。これにより、JavaScript のヒープ上限が関数のメモリ上限と同じになります。

エラー メッセージ

Cloud コンソール

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

解決策

関数のメモリ上限が max_old_space_size となるように構成された NODE_OPTIONS を含む Node.js 12 以降の関数をデプロイします。次に例を示します。

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

関数が終了した

コードを実行しているプロセスがランタイム エラーや意図的な exit によって終了した場合は、次のいずれかのエラー メッセージが表示されることがあります。また、まれにしか発生しませんが、インフラストラクチャ エラーの可能性もあります。

エラー メッセージ

関数呼び出しが中断されました。エラー: 関数が終了しました。推奨処置: ログで終了した理由を調べます。その他のトラブルシューティング情報については、Logging をご覧ください。

リクエストが拒否されました。エラー: 関数が終了しました。推奨処置: ログで終了した理由を調べます。その他のトラブルシューティング情報については、Logging をご覧ください。

関数が初期化できません。エラー: 関数が終了しました。推奨処置: ログで終了した理由を調べます。その他のトラブルシューティング情報については、Logging をご覧ください。

解決策

  • リクエストに executionID が関連付けられたバックグラウンド関数(トリガーされた Pub/Sub)がエラーとなった場合は、失敗時の再試行を有効にしてみてください。そうすると、再試行可能な例外が発生した場合に関数の実行を再試行できます。再試行の無限ループを回避する方法や、再試行可能なエラーと致命的なエラーの処理を別にする方法など、このオプションを安全に使用する方法の詳細については、ベスト プラクティスをご覧ください。

  • バックグラウンドの動作(関数の終了後に発生するもの)が問題を引き起こす可能性もあるため、コードを確認してください。Cloud Functions は、関数の実行中に実行されるもの以外の操作を保証しません。そのため、バックグラウンドで実行される操作は、クリーンアップ プロセスにより終了されることがあります。

  • トラフィックが急増している場合は、ワークロードの時間を少し伸ばすようにしてください。また、Cloud Functions にデプロイする前に Functions Framework を使用してローカルで関数をテストし、依存関係の欠落や競合によってエラーが発生しないようにしてください。

VPC-SC で保護されたリソースへのアクセス時のランタイム エラー

デフォルトでは、Cloud Functions はパブリック IP アドレスを使用して他のサービスにリクエストを送信します。関数が VPC Service Controls の境界内にない場合、VPC-SC で保護された Google Cloud サービスにアクセスしようとすると、サービス境界での拒否が原因で、HTTP 403 レスポンスを受信することがあります。

エラー メッセージ

監査対象リソースログに、次のようなエントリがあります。

"protoPayload": {
  "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
  "status": {
    "code": 7,
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "VPC_SERVICE_CONTROLS",
  ...
  "authenticationInfo": {
    "principalEmail": "CLOUD_FUNCTION_RUNTIME_SERVICE_ACCOUNT",
  ...
  "metadata": {
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
    "securityPolicyInfo": {
      "organizationId": "ORGANIZATION_ID",
      "servicePerimeterName": "accessPolicies/NUMBER/servicePerimeters/SERVICE_PERIMETER_NAME"
  ...

解決策

Google Cloud プロジェクトで、Cloud Functions の関数をサービス境界内の保護されたリソースとして追加し、VPC-SC 準拠の関数をデプロイします。詳細については、VPC Service Controls の使用をご覧ください。

Cloud Functions プロジェクトをサービス境界に追加できない場合は、境界外の関数での VPC Service Controls の使用をご覧ください。

スケーラビリティ

Cloud Functions のインフラストラクチャに関連するスケーリングの問題は、次のような状況で発生します。

次の条件は、スケーリングの失敗に関連している可能性があります。

  • トラフィックが急増している。
  • コールド スタート時間が長い。
  • リクエスト処理時間が長い。
  • 関数のエラー率が高い。
  • 最大インスタンス数の上限に達すると、システムはそれ以上スケールを行うことができません。
  • Cloud Functions サービスに起因する一時的な要因。

いずれの場合も、Cloud Functions がトラフィックの管理に必要な速度でスケールアップできないことがあります。

エラー メッセージ

  • The request was aborted because there was no available instance
    • severity=WARNING(レスポンス コード: 429)Cloud Functions は、構成時に設定された max-instances の上限のためスケールできません。
    • severity=ERROR(レスポンス コード: 500)Cloud Functions では元々トラフィック レートを管理できません。

解決策

  • HTTP トリガーベースの関数の場合、クライアントに指数バックオフを実装し、ドロップできないリクエストの再試行を試みます。Workflows から Cloud Functions の関数をトリガーする場合は、try/retry 構文を使用します。
  • バックグラウンド / イベント ドリブン関数の場合、Cloud Functions は at-least-once 配信をサポートします。再試行を明示的に有効にしなくても、イベントは自動的に再配信され、関数の実行が再試行されます。詳細については、イベント ドリブン関数の再試行をご覧ください。
  • 問題の根本原因が Cloud Functions に起因する一時的なエラーである場合、または問題についてサポートが必要な場合は、サポートにお問い合わせください

ロギング

問題を追跡するためにロギングを設定すると、独自の問題が発生することがあります。

ログエントリの重大度レベルがないか、正しくない

Cloud Functions には、デフォルトで簡単なランタイムのロギング機能が含まれています。stdout または stderr に書き込まれたログは、Google Cloud コンソールに自動的に表示されます。デフォルトでは、これらのログエントリには単純な文字列のメッセージのみが含まれます。

エラー メッセージ

ログの重大度レベルがないか、正しくない

解決策

ログに重大度を含めるには、構造化されたログエントリを送信する必要があります。

クラッシュの発生時に例外を処理するか、ログに記録する

クラッシュ情報を管理する方法とログに記録する方法をカスタマイズしたい場合があります。

解決策

例外の処理とスタック トレースのロギングをカスタマイズするには、try ブロックで関数をラップします。


import logging
import traceback
def try_catch_log(wrapped_func):
  def wrapper(*args, **kwargs):
    try:
      response = wrapped_func(*args, **kwargs)
    except Exception:
      # Replace new lines with spaces so as to prevent several entries which
      # would trigger several errors.
      error_message = traceback.format_exc().replace('\n', '  ')
      logging.error(error_message)
      return 'Error';
    return response;
  return wrapper;

#Example hello world function
@try_catch_log
def python_hello_world(request):
  request_args = request.args

  if request_args and 'name' in request_args:
    1 + 's'
  return 'Hello World!'

Node.js 10 以降、Python 3.8、Go 1.13、Java 11 でログが大きすぎる

これらのランタイムの通常のログエントリの最大サイズは 105 KiB です。

解決策

この上限より小さいログエントリを送信します。

Cloud Functions はエラーを返すが、ログが見つからない

Cloud Functions のログは、プロジェクトの作成時に作成され、有効になったデフォルトのバケットにストリーミングされます。デフォルトのバケットが無効になっている場合、または Cloud Functions のログが除外フィルタに含まれている場合、ログはログ エクスプローラに表示されません。

解決策

デフォルトのログが有効になっていることを確認します。

Cloud Functions のログがログ エクスプローラに表示されない

一部の Cloud Logging クライアント ライブラリは、非同期プロセスを使用してログエントリを書き込みます。関数がクラッシュまたは終了したときに一部のログエントリがまだ書き込まれておらず、ログが後で表示されることがあります。また、一部のログが失われて、ログ エクスプローラに表示できない場合もあります。

解決策

関数の終了前にクライアント ライブラリ インターフェースを使用してバッファ内のログエントリをフラッシュするか、ライブラリを使用してログエントリを同期的に書き込みます。ログを stdout または stderr に同期し、直接書き込むこともできます。

Cloud Functions のログが Logs Router Sink に表示されない

ログエントリは、Logs Router Sinks を使用して、さまざまな宛先にルーティングされます。

Console の Log Router で [シンクの詳細を表示する] がハイライト表示されているスクリーンショット

この設定には除外フィルタも含まれます。このフィルタでは、簡単に破棄できるエントリを定義します。

Console の Log Router で [詳細] ポップアップに除外フィルタが表示されているスクリーンショット

解決策

resource.type="cloud_functions" には除外フィルタを設定しないようにします。

データベース接続

データベースに接続するときに、さまざまな問題が発生する可能性がありますが、その多くは接続制限の超過やタイムアウトに関連しています。ログに Cloud SQL の警告が表示された場合(「コンテキスト期限を超えました」など)は、接続構成の調整が必要になることがあります。詳細については、Cloud SQL のドキュメントをご覧ください。

ネットワーキング

ネットワーク接続

下り(外向き)設定を構成した後でも、Cloud Functions の関数からのすべてのアウトバンド リクエストが失敗する場合は、接続テストを実施して、ネットワーク接続の根本的な問題を特定します。詳細については、接続テストを作成して実行するをご覧ください。

サーバーレス VPC アクセス コネクタの準備ができていないか、存在しません

サーバーレス VPC アクセス コネクタが失敗した場合は、必須としてコネクタ専用の /28 サブネット マスクを使用していない可能性があります。

エラー メッセージ

VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.

解決策

サブネットを一覧表示して、コネクタが /28 サブネット マスクを使用しているかどうかを確認します。

使用していない場合は、/28 サブネットを使用する新しいコネクタを再作成または作成します。以下の点に注意してください。

  • コネクタを再作成する場合は、他の関数を再デプロイする必要はありません。コネクタが再作成されると、ネットワークが中断する場合があります。

  • 新しい代替コネクタを作成する場合は、新しいコネクタを使用するように関数を再デプロイしてから、元のコネクタを削除します。この方法により、ネットワークの中断を回避できます。

TCP ポート 25 を使用した外部宛先 IP アドレスへの SMTP トラフィックがブロックされる

セキュリティを強化するため、関数からメールを送信するときに、Google Cloud は TCP 宛先ポート 25 への接続をブロックします。

解決策

これらの接続のブロックを解除するには、次のいずれかのオプションを選択します。