Cloud Run functions(第 1 世代)のトラブルシューティング
このドキュメントでは、Cloud Run functions(第 1 世代)の使用時に発生するエラー メッセージのトラブルシューティングと問題解決の方法について説明します。
デプロイ
このセクションでは、デプロイ中に発生する可能性がある問題と、その修正方法について説明します。こうした問題の多くは、ロールと権限または構成の誤りに関連しています。
イベント ドリブンな関数をデプロイする際にデプロイ サービス アカウントに 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 にアクセスできず、デプロイに失敗します。
エラー メッセージ
コンソール
Failed to configure trigger PubSub projects/PROJECT_ID/topics/FUNCTION_NAME
gcloud
ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Failed to configure trigger PubSub projects/PROJECT_ID/topics/FUNCTION_NAME
解決策
デフォルトの cloudfunctions.serviceAgent
ロールにサービス アカウントをリセットできます。
デフォルトのランタイム サービス アカウントが存在しない
ユーザー管理のサービス アカウントが指定されていない場合、Cloud Run functions(第 1 世代)はデフォルトで App Engine サービス アカウントを使用します。ユーザー管理のサービス アカウントを指定せずにデフォルト アカウントを削除すると、デプロイは失敗します。
エラー メッセージ
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account 'test-project-356312@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.]
解決策
この問題を解決するには、次のいずれかを行います。
関数をデプロイするときに、ユーザー管理のランタイム サービス アカウントを指定します。
プロジェクトのデフォルトのサービス アカウント PROJECT_ID@appspot.gserviceaccount.com を再作成します。
デフォルトのサービス アカウントの削除を取り消します。
関数のデプロイ中にランタイム サービス アカウントの権限がユーザーにない
すべての関数は、その関数が他のリソースにアクセスするときに ID として機能するサービス アカウントに関連付けられます。このランタイム サービス アカウントには、デフォルトのサービス アカウントまたはユーザー管理サービス アカウントのいずれかを使用できます。Cloud Functions がランタイム サービス アカウントを使用するには、デプロイ担当者がそのサービス アカウントに対する 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 USER is missing permission 'iam.serviceaccounts.actAs' on service account PROJECT_ID@appspot.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account PROJECT_ID@appspot.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding
PROJECT_ID@appspot.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 USER is missing permission 'iam.serviceaccounts.actAs' on service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding 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
が含まれています。
関数のデプロイ中に、Cloud Run functions サービス エージェント サービス アカウントにプロジェクト バケットの権限がない
Cloud Run functions は、同じ Google Cloud プロジェクトの Cloud Storage バケットからのイベントによってのみトリガーできます。また、Cloud Functions サービス エージェント サービス アカウント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)には、プロジェクトに対する cloudfunctions.serviceAgent
のロールが必要です。
エラー メッセージ
コンソール
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.
gcloud
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.
解決策
このエラーを解決するには、デフォルトのロールにサービス エージェント サービス アカウントをリセットします。
プロジェクト編集者のロールを持つユーザーが関数を公開できない
プロジェクト編集者のロールには、プロジェクト内のリソースを管理するための幅広い権限が付与されていますが、Cloud Run functions を公開する権限は本来付与されていません。関数をデプロイするユーザーまたはサービスに cloudfunctions.functions.setIamPolicy
権限を付与する必要があります。
エラー メッセージ
gcloud
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 Functions 管理者のロールを割り当てます。これらのロールには
cloudfunctions.functions.setIamPolicy
権限が含まれています。カスタムロールを作成して、権限を手動で付与します。
プロジェクトに、ドメインで制限された共有が適用されているかどうかを確認します。
リソース ロケーションを制限する組織ポリシーを使用している場合に、関数のデプロイが失敗する
組織でリソース ロケーションの制限ポリシーを使用している場合、ポリシーで制限されているリージョンでは関数のデプロイが制限されます。Google Cloud コンソールでは、関数のデプロイ中に、制限されているリージョンをリージョン プルダウンから選択することはできません。
エラー メッセージ
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[The request has violated one or more Org Policies. Please refer to the respective violations for more information. violations {
type: "constraints/gcp.resourceLocations"
subject: "orgpolicy:projects/PROJECT_ID"
description: "Constraint constraints/gcp.resourceLocations violated for projects/PROJECT_ID attempting GenerateUploadUrlActionV1 with location set to RESTRICTED_LOCATION. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
}
解決策
デプロイを成功させるには、リソース ロケーション制約の allowed_values
リストまたは denied_values
リストでロケーションを追加または削除します。
関数のグローバル スコープの実行中に関数のデプロイが失敗する
このエラーは、コードに問題があったことを示します。デプロイ パイプラインで関数のデプロイは完了しましたが、最後のステップで関数へのヘルスチェックが失敗しました。このヘルスチェックは、関数のグローバル スコープを実行することになっており、そこで、例外のスロー、クラッシュ、タイムアウトが発生しました。通常、グローバル スコープは、ライブラリを読み込んでクライアントを初期化する部分です。
エラー メッセージ
コンソール
Deployment failure: Function failed on loading user code. This is likely due to a bug in the user code.
gcloud
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. This is likely due to a bug in the user code.
Cloud Logging のログ:
"Function failed on loading user code. This is likely due to a bug in the user code."
解決策
この問題を解決するには、次のいずれかを行います。
関数がグローバル スコープを実行できなかった理由が明確でない場合は、グローバル変数の遅延初期化を使用して、コードを一時的にリクエスト呼び出しに移動することを検討してください。これにより、クライアント ライブラリに関するほかのログ ステートメントを追加でき、インスタンス化の際のタイムアウト(特に、他のサービスを呼び出す場合)や、クラッシュ / 例外のスローをまとめられます。
関数のタイムアウトを長くします。
ソースコードには、コンソールまたは gcloud を介して、デプロイで正しく指定されているエントリ ポイント関数が含まれている必要があります。
閲覧者のロールを持つユーザーが関数をデプロイできない
プロジェクト閲覧者または Cloud Functions 閲覧者のロールを持つユーザーは、関数と関数の詳細に読み取り専用のアクセス権を持ちますが、新しい関数をデプロイすることはできません。Google Cloud コンソールで関数の作成機能がグレー表示になり、次のエラーが表示されます。
エラー メッセージ
gcloud
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 デベロッパー ロールを割り当てます。
ビルド サービス アカウントに権限がない
エラー メッセージ
関数のデプロイエラーまたはビルドログに、次のいずれかのエラーが表示されることがあります。
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-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-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 関数は、適切な権限のないエンドユーザーとサービス アカウントへのアクセスを制限します。
ブラウザで Cloud Run functions の URL にアクセスしても、認証ヘッダーが自動的に追加されることはありません。
エラー メッセージ
HTTP エラー レスポンス コード: 403 Forbidden
HTTP エラー レスポンス本文:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
解決策
このエラーを解決するには、次のいずれかを行います。
ユーザーに Cloud Run functions 起動元ロールを割り当てます。
未認証の呼び出しを許可するために、関数を再デプロイします(組織でサポートされている場合)。これはテストする場合に役立ちます。
allow internal traffic only
構成によるサービス提供権限エラー
上り(内向き)設定により、Google Cloud プロジェクトまたは VPC Service Controls サービス境界の外部のリソースから HTTP 関数を呼び出せるかどうかを制限します。上り(内向き)ネットワーキングに「内部トラフィックのみを許可」の設定を構成している場合、このエラー メッセージは、同じプロジェクトまたは VPC Service Controls 境界内の VPC ネットワークからのリクエストのみが許可されることを示します。
エラー メッセージ
HTTP エラー レスポンス コード: 404 NOT FOUND
HTTP エラー レスポンス本文:
404 Page not found
解決策
このエラーを解決するには、次のいずれかを行います。
リクエストが Google Cloud プロジェクトまたは VPC Service Controls サービス境界から発生していることを確認します。
上り(内向き)設定を変更して、関数のすべてのトラフィックを許可します。
Cloud Run functions のソースコードは、関数の URL、HTTP メソッド、ロジックエラーが原因で 404 エラーになることがあります。
関数の呼び出しに有効な認証情報がない
アクセス制限が構成された関数には、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.
Cloud Run functions には次の重大度レベルがあります。
* `severity=WARNING` ( Response code: 429 ) Cloud Run functions cannot scale due
to the [`max-instances`](/functions/docs/configuring/max-instances) limit you set
during configuration.
* `severity=ERROR` ( Response code: 500 ) Cloud Run functions intrinsically
cannot manage the rate of traffic.
解決策
- HTTP トリガーベースの関数の場合、指数バックオフを実装し、ドロップできないリクエストの再試行を試みます。Workflows から Cloud Run functions をトリガーする場合は、
try/retry
構文を使用します。 - バックグラウンド関数またはイベント ドリブン関数の場合、Cloud Run functions は at-least-once 配信をサポートします。再試行を明示的に有効にしなくても、イベントは自動的に再配信され、関数の実行が再試行されます。詳細については、イベント ドリブン関数の再試行を有効にするをご覧ください。
- 問題の根本原因が Cloud Run functions のみに起因する一時的なエラーの多発である場合、または問題についてサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。
ロギング
以降のセクションでは、ロギングに関する問題とその修正方法について説明します。
ログエントリの重大度レベルがないか、正しくない
Cloud Run functions には、デフォルトでランタイムのロギング機能が含まれています。stdout
または stderr
に書き込まれたログは、Google Cloud コンソールに自動的に表示されます。デフォルトでは、これらのログエントリには文字列のメッセージのみが含まれます。
解決策
ログに重大度を含めるには、構造化されたログエントリを送信する必要があります。
クラッシュの発生時に例外を処理するか、ログに記録する
クラッシュ情報を管理する方法とログに記録する方法をカスタマイズしたい場合があります。
解決策
例外の処理とスタック トレースのロギングをカスタマイズするには、try
ブロックで関数をラップします。
try
ブロックを追加すると、retry on failure
構成のイベント ドリブン関数で予期しない副作用が発生する可能性があります。失敗したイベントの再試行自体が失敗することがあります。
例
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_functions"
に設定されている除外フィルタを削除します。
データベース接続
データベース エラーの多くは、接続制限の超過やタイムアウトに関連しています。ログに Cloud SQL の警告が表示された場合(Context deadline exceeded
など)は、接続構成の調整が必要になることがあります。詳細については、Cloud SQL のベスト プラクティスをご覧ください。
ネットワーキング
このセクションでは、ネットワーキングに関する問題と、その修正方法について説明します。
ネットワーク接続
下り(外向き)設定を構成した後でも、Cloud Run functions からのすべてのアウトバウンド リクエストが失敗する場合は、接続テストを実施して、ネットワーク接続の根本的な問題を特定します。詳細については、接続テストを作成して実行するをご覧ください。
サーバーレス VPC アクセス コネクタの準備ができていないか、存在しない
サーバーレス VPC アクセス コネクタで障害が発生した場合、コネクタ専用の /28
サブネット マスクを必須で使用していない可能性があります。
エラー メッセージ
VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.
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
ロールが必要です。それ以外の場合は、roles/compute.networkAdmin
が必要です。コネクタがホスト プロジェクトで作成されている場合は、ホスト プロジェクトの
Cloud Run functions Service Agent
に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 は Cloud Run functions からメールを送信するときに、TCP 宛先ポート 25
への接続をブロックします。
解決策
これらの接続のブロックを解除するには、次のいずれかのオプションを選択します。
TCP ポート
587
や465
など、別のポートで SMTP サーバーに接続します。
その他
このセクションでは、他のカテゴリに該当しないその他の問題について概説し、それぞれの問題の解決策を提示します。
Cloud Audit Logs でメソッド google.storage.buckets.testIamPermissions
に VPC Service Controls エラーが記録されている
Google Cloud コンソールで [関数の詳細] ページを開くと、Cloud Run functions は、ユーザーがコンテナ イメージのストレージ リポジトリを変更して公開アクセスできるかどうかを確認します。確認のため、Cloud Run functions は google.storage.buckets.testIamPermissions
メソッドを使用して、[REGION].artifacts.[PROJECT_ID].appspot.com
という形式で Container Registry バケットにリクエストを送信します。この 2 つのチェックの違いは 1 つだけです。1 つのチェックは認証付きで実行され、バケットを変更するユーザー権限を確認しますが、もう 1 つのチェックは認証なしで実行され、バケットが一般公開されているかどうかを確認します。
VPC Service Controls 境界で storage.googleapis.com
API が制限されている場合、Google Cloud コンソールの Cloud Audit Logs に google.storage.buckets.testIamPermissions
メソッドのエラーが記録されます。
エラー メッセージ
認証のない公開アクセスのチェックの場合、VPC SC 拒否ポリシーの監査ログに次のようなエントリがあります。
"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": {}, "requestMetadata": { "callerIp": "END_USER_IP" }, "serviceName": "storage.googleapis.com", "methodName": "google.storage.buckets.testIamPermissions", "resourceName": "projects/PROJECT_NUMBER", "metadata": { "ingressViolations": [ { "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "targetResource": "projects/PROJECT_NUMBER" } ], "resourceNames": [ "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com" ], "securityPolicyInfo": { "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "organizationId": "ORG_ID" }, "violationReason": "NO_MATCHING_ACCESS_LEVEL", ...
認証のある公開アクセスのチェックの場合、VPC SC 拒否ポリシーの監査ログには、次の例に示すように、ユーザーがバケット設定を変更できるエントリがあります。
"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": "END_USER_EMAIL" }, "requestMetadata": { "callerIp": "END_USER_IP", "requestAttributes": {}, "destinationAttributes": {} }, "serviceName": "storage.googleapis.com", "methodName": "google.storage.buckets.testIamPermissions", "resourceName": "projects/PROJECT_NUMBER", "metadata": { "ingressViolations": [ { "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "targetResource": "projects/PROJECT_NUMBER" } ], "resourceNames": [ "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com" ], "securityPolicyInfo": { "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "organizationId": "ORG_ID" }, "violationReason": "NO_MATCHING_ACCESS_LEVEL", ...
解決策
Container Registry バケットが公開されていない場合は、VPC Service Controls のエラーは無視できます。
また、次の例に示すように、VPC Service Controls の上り(内向き)ルールを追加して google.storage.buckets.testIamPermissions
メソッドを許可することもできます。
ingress_from { sources { access_level: "*" } identity_type: ANY_IDENTITY } ingress_to { operations { service_name: "storage.googleapis.com" method_selectors { method: "google.storage.buckets.testIamPermissions" } } resources: "projects/PROJECT_NUMBER" }
可能であれば、ユーザーの IP アドレスを使用してアクセスレベルを定義することで、上り(内向き)ルールをさらに絞り込むことができます。