Cloud Run functions のトラブルシューティング
このドキュメントでは、Cloud Run functions の使用時に発生するエラー メッセージのトラブルシューティングと問題解決の方法について説明します。
デプロイ
このセクションでは、デプロイで発生する可能性がある問題と、その修正方法について説明します。デプロイ中に発生する可能性のある問題の多くは、ロールと権限または構成の誤りに関連しています。
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 関数は、適切な権限のないエンドユーザーとサービス アカウントへのアクセスを制限します。このエラー メッセージは、呼び出し元には関数を呼び出す権限がないことを示します。
エラー メッセージ
HTTP エラー レスポンス コード: 403 Forbidden
HTTP エラー レスポンス本文:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
解決策
この問題を解決するには、次のいずれかの方法を試してください。
特定の関数に対して、ユーザーに Cloud Run 起動元 Cloud IAM ロールを割り当てます。
未認証の呼び出しを許可するために、関数を再デプロイします(組織でサポートされている場合)。これはテストに便利です。
allow internal traffic only
構成によるサービング エラー
上り(内向き)設定により、Google Cloud プロジェクトまたは VPC Service Controls サービス境界の外部のリソースから HTTP 関数を呼び出せるかどうかを制限します。上り(内向き)ネットワーキングに「内部トラフィックのみを許可」の設定を構成している場合、このエラー メッセージは、同じプロジェクトまたは VPC Service Controls 境界内の VPC ネットワークからのリクエストのみが許可されることを示します。これは、デフォルトの functions.net
URL の 404 エラーの場合もあります。
エラー メッセージ
HTTP エラー レスポンス コード: 404 NOT FOUND
解決策
このエラーを解決するには、次のいずれかの解決策を行います。
リクエストが Google Cloud プロジェクトまたは VPC Service Controls サービス境界から発生していることを確認します。
上り(内向き)設定を変更して、関数のすべてのトラフィックを許可します。
Cloud Run functions のソースコードは、関数の URL、HTTP メソッド、ロジックエラーが原因で 404 になることもあります。
関数の呼び出しに有効な認証情報がない
アクセス制限が設定された Cloud Run functions を呼び出すには、ID トークンが必要です。アクセス トークンや更新トークンは使用できません。
エラー メッセージ
HTTP エラー レスポンス コード: 401 Unauthorized
HTTP エラー レスポンス本文:
Your client does not have permission to the requested URL 'FUNCTION_NAME'
解決策
このエラーを解決するには、次のいずれかを行います。
リクエストに
Authorization: Bearer ID_TOKEN
ヘッダーが含まれていることと、トークンが、アクセス トークンや更新トークンではなく、ID トークンであることを確認してください。サービス アカウントの秘密鍵を使用してこのトークンを手動で生成する場合は、Google によって署名された ID トークンと自己署名の JWT トークンを交換する必要があります。詳細については、呼び出しの認証をご覧ください。リクエスト ヘッダーで認証情報を使用して HTTP 関数を呼び出します。たとえば、次のように
gcloud
で ID トークンを取得します。 詳細については、呼び出しの認証をご覧ください。curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME未認証の呼び出しを許可するために、関数を再デプロイします(組織でサポートされている場合)。これはテストに便利です。
関数が実行中に停止するか、コードの終了後に実行を継続する
一部の Cloud Run functions ランタイムでは、ユーザーが非同期タスクを実行できます。関数がこのようなタスクを作成する場合、これらのタスクが完了するまで明示的に待機する必要があります。これを行わないと、関数が誤ったタイミングで実行されなくなる可能性があります。
エラーの動作
関数の次のいずれかの動作を示します。
- 関数は、非同期タスクが引き続き実行中であっても、指定されたタイムアウト期間が経過する前に終了します。
- これらのタスクが完了しても、関数は実行を停止せず、タイムアウト期間が終了するまで実行を継続します。
解決策
関数が早期に終了する場合は、関数が次のいずれかのアクションを行う前に、すべての関数の非同期タスクが完了していることを確認してください。
- 値を返す
- 返された
Promise
オブジェクトを解決または拒否する(Node.js 関数のみ) - キャッチされなかった例外やエラーをスローする
- HTTP レスポンスを送信する
- コールバック関数を呼び出す
非同期タスクの完了後に関数が終了しない場合は、タスクの完了後に Cloud Run functions に正しくシグナルを送信していることを確認する必要があります。特に、関数の非同期タスクが完了したら直ちに上に記載した操作のいずれかを行ってください。
VPC Service Controls で保護されたリソースへのアクセス時のランタイム エラー
デフォルトでは、Cloud Run functions はパブリック IP アドレスを使用して他のサービスにリクエストを送信します。関数が VPC Service Controls の境界内にない場合、VPC Service Controls で保護された 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" ...
解決策
このエラーを解決するには、次のいずれかを行います。
この関数は、すべての送信トラフィックを VPC ネットワーク経由で転送する必要があります。詳細については、VPC Service Controls に準拠した関数をデプロイするをご覧ください。
または、関数のランタイム サービス アカウントに境界へのアクセス権を付与します。これを行うには、アクセスレベルを作成して、アクセスレベルをサービス境界に追加するか、境界に上り(内向き)ポリシーを作成します。詳細については、境界外の関数での VPC Service Controls の使用をご覧ください。
スケーラビリティ
このセクションでは、スケーラビリティに関する問題を取り上げ、各問題の修正方法のヒントを示します。
保留中のキュー リクエストに関連する Cloud Logging エラー
スケーリングの失敗は、次のシナリオで発生する可能性があります。
- トラフィックが急増している。
- コールド スタート時間が長い。
- リクエスト処理時間が長い。
- 関数のエラー率が高い。
- 最大インスタンス数の上限に達し、システムのスケーリングが阻止される
- Cloud Run functions サービスに起因する一時的な要因。
いずれの場合も、Cloud Run functions がトラフィックの管理に必要な速度でスケールアップできないことがあります。
エラー メッセージ
The request was aborted because there was no available instance
severity=WARNING
(レスポンス コード: 429)Cloud Run functions は、構成時に設定されたmax-instances
の上限のためスケールできません。severity=ERROR
(レスポンス コード: 500)Cloud Run functions では元々トラフィック レートを管理できません。
解決策
この問題を解決するには、上記の原因に対処してください。
HTTP トリガーベースの関数の場合、クライアントに指数バックオフを実装し、ドロップできないリクエストの再試行を試みます。Workflows から Cloud Run functions をトリガーする場合は、
try/retry
構文を使用します。バックグラウンド関数またはイベント ドリブン関数の場合、Cloud Run functions は at-least-once 配信をサポートします。再試行を明示的に有効にしなくても、イベントは自動的に再配信され、関数の実行が再試行されます。詳細については、イベント ドリブン関数の再試行をご覧ください。
問題の根本原因が Cloud Run functions に起因する一時的なエラーである場合、または問題についてサポートが必要な場合は、サポートにお問い合わせください
コールド スタートに関連する問題がある場合は、最小インスタンス数を構成して、コールド スタートの回数を減らし、請求額の増加を抑えます。
ロギング
以降のセクションでは、ロギングに関する問題とその修正方法について説明します。
ログエントリの重大度レベルがないか、正しくない
Cloud Run functions には、デフォルトでランタイムのロギング機能が含まれています。stdout
または stderr
に書き込まれたログは、Cloud Logging に自動的に表示されます。デフォルトでは、これらのログエントリには文字列のメッセージのみが含まれます。
エラー メッセージ
ログの重大度レベルがないか、正しくない
解決策
ログに重大度を含めるには、構造化されたログエントリを送信する必要があります。
クラッシュの発生時に例外を処理するか、ログに記録する
クラッシュ情報を管理する方法とログに記録する方法をカスタマイズしたい場合があります。
解決策
例外の処理とスタック トレースのロギングをカスタマイズするには、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 Run Functions がエラーを返すにもかかわらずログが見つからない
Cloud Run functions は、Cloud Run functions のログをデフォルトのバケットにストリーミングします。プロジェクトを作成すると、Cloud Run functions によってデフォルト バケットが作成され、有効になります。デフォルトのバケットが無効になっている場合、または Cloud Run functions のログが除外フィルタに含まれている場合、ログはログ エクスプローラに表示されません。
解決策
デフォルトのログを有効にします。
Cloud Run functions のログがログ エクスプローラに表示されない
一部の Cloud Logging クライアント ライブラリは、非同期プロセスを使用してログエントリを書き込みます。関数がクラッシュまたは終了したときに一部のログエントリがまだ書き込まれておらず、後でログに表示されることがあります。一部のログが失われ、ログ エクスプローラに表示されない場合があります。
解決策
関数の終了前にクライアント ライブラリ インターフェースを使用してバッファ内のログエントリをフラッシュするか、ライブラリを使用してログエントリを同期的に書き込みます。ログを stdout
または stderr
に同期し、直接書き込むこともできます。
Logs Router シンクを使用しているときに Cloud Run Functions のログが見つからない
Logs Router シンクは、さまざまな宛先にログエントリを転送します。
[除外フィルタ] では、破棄できるエントリを定義します。
解決策
resource.type = "cloud_run_revision"
に設定されている除外フィルタを削除します。
データベース接続
データベースに接続するときに、さまざまな問題が発生する可能性がありますが、その多くは接続制限の超過やタイムアウトに関連しています。ログに Cloud SQL の警告が表示された場合(Context deadline exceeded
など)は、接続構成の調整が必要になることがあります。詳細については、Cloud SQL のベスト プラクティスをご覧ください。
ネットワーキング
このセクションでは、ネットワーキングに関する問題と、その修正方法について説明します。
ネットワーク接続
下り(外向き)設定を構成した後でも、Cloud Run functions からのすべてのアウトバウンド リクエストが失敗する場合は、接続テストを実施して、ネットワーク接続の根本的な問題を特定します。詳細については、接続テストを作成して実行するをご覧ください。
サーバーレス VPC アクセス コネクタの準備ができていないか、存在しない
サーバーレス VPC アクセス コネクタで障害が発生した場合、コネクタ専用の /28
サブネット マスクを必須で使用していない可能性があります。
エラー メッセージ
Problem connecting to VPC Connector projects/xxxxx/locations/REGION/connectors/xxxx: Serverless VPC Access is not found.
Google API サービス エージェント サービス アカウント PROJECT_NUMBER@cloudservices.gserviceaccount.com
に対する権限がないため、Cloud Run functions のデプロイ時にコネクタの状態が良好でないと、次のエラーが発生します。
エラー メッセージ
Failed to prepare VPC connector. Please try again later.
解決策
サブネットを一覧取得して、コネクタが /28
サブネット マスクを使用しているかどうかを確認します。コネクタが /28
サブネット マスクを使用していない場合は、新しいコネクタを再作成または作成します。
この問題を解決するには、次のいずれかを行います。
コネクタを再作成する場合、他の関数を再デプロイする必要はありません。コネクタが再作成されると、ネットワークの中断が発生することがあります。
新しい代替コネクタを作成する場合は、新しいコネクタを使用するように関数を再デプロイしてから、元のコネクタを削除します。この方法により、ネットワークの中断を回避できます。
Cloud Run functions とそれに関連付けられたコネクタが同じリージョンにデプロイされていることを確認します。
共有 VPC 構成の場合:
プロジェクト内のリソースをプロビジョニングするために VPC コネクタによって使用されるサービス アカウント
SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com
とservice-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com
に権限が不足していないことを確認します。コネクタがサービス プロジェクトにある場合、これらのサービス アカウントには共有 VPC 構成のホスト プロジェクトでroles/compute.networkUser
ロールが必要です。コネクタがホスト プロジェクトで作成されている場合は、ホスト プロジェクトの Cloud Run サービス エージェントに
Serverless VPC Access User
ロールが付与されていることを確認します。
コネクタのステータスが
Connector is in a bad state, manual deletion recommended
エラーで、コネクタのプロジェクトでコンピューティング リソースをプロビジョニングするために必要な権限が Google APIs サービス エージェントにない場合は、PROJECT_NUMBER@cloudservices.gserviceaccount.com
サービス アカウントにroles/compute.admin
を付与します。場合によっては、これらの権限を追加した後にコネクタを再作成する必要があります。
TCP ポート 25 を使用した外部宛先 IP アドレスへの SMTP トラフィックがブロックされる
セキュリティを強化するため、Google Cloud は関数からメールを送信するときに、TCP 宛先ポート 25
への接続をブロックします。
解決策
これらの接続のブロックを解除するには、次のいずれかの解決策を試してください。
TCP ポート
587
や465
など、別のポートで SMTP サーバーに接続します。
デフォルトの functions.net
URL で 404 エラーが発生する
Cloud Run で run.app
URL を無効にすると、Cloud Run functions(第 2 世代)のデフォルトの cloudfunctions.net
URL にもアクセスできなくなります。このエラーは、内部トラフィックのみを許可する構成によるサービング エラーが原因で発生することもあります。
エラー メッセージ
HTTP エラー レスポンス コード: 404 NOT FOUND
解決策
Cloud Run functions(第 2 世代)のデフォルトの cloudfunctions.net
URL を再度有効にするには、service.yaml
ファイルを新しい構成に置き換えて Cloud Run で run.app
URL を再度有効にする必要があります。ここで、annotations:run.googleapis.com/default-url-disabled: false
とします。