排解 Cloud Run 函式 (第 1 代) 問題

本文說明如何排解錯誤訊息,以及使用 Cloud Run 函式 (第 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 函式 (第 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.]

解決方法

如要解決這個問題,請按照下列任一解決方案操作:

使用者在部署函式時缺少執行階段服務帳戶的權限

每個函式都與一個做為其身分識別的服務帳戶相關聯,當函式存取其他資源時,就會使用該服務帳戶。這個執行階段服務帳戶可以是預設服務帳戶或使用者代管的服務帳戶。如要讓 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 函式服務代理服務帳戶缺少專案值區權限

Cloud Run 函式只能由相同 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 函式的權限。您必須將 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).]

解決方法

如要解決這項錯誤,請按照下列任一解決方案操作:

使用「資源位置限制」機構政策時,函式部署作業會失敗

如果貴機構使用「資源位置限制」政策,則會限制在受政策限制的區域中部署函式。在 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_valuesdenied_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 控制台中的「Create function」功能已設為灰色,並顯示以下錯誤訊息:

錯誤訊息

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 服務帳戶異動」。

如要解決這個問題,請使用下列任一解決方案:

已停用建構服務帳戶

錯誤訊息

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 服務帳戶異動」。

如要解決這個問題,請使用下列任一解決方案:

供應

本節列出您可能會遇到的放送問題,並提供修正每個問題的建議。

由於函式需要驗證,因此發生權限錯誤

未啟用「允許未經驗證的叫用」的 HTTP 函式,會限制未具備適當權限的使用者和服務帳戶存取權。

在瀏覽器中造訪 Cloud Run 函式網址不會自動新增驗證標頭。

錯誤訊息

HTTP 錯誤回應代碼:403 禁止

HTTP 錯誤回應主體:

Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.

解決方法

如要解決這項錯誤,請按照下列任一解決方案操作:

  • 指派「Cloud Run 函式叫用者」角色給使用者。

  • 如果貴機構支援這項功能,請重新部署函式,允許未經驗證的叫用作業。這在測試時相當實用。

allow internal traffic only 設定而發生服務權限錯誤

Ingress 設定會限制 HTTP 函式是否可由 Google Cloud 專案或 VPC Service Controls 服務範圍外的資源叫用。設定「僅允許內部流量」的 ingress 網路設定時,這則錯誤訊息表示系統只允許來自相同專案或 VPC Service Controls 範圍內虛擬私有雲網路的要求。

錯誤訊息

HTTP 錯誤回應代碼:404 NOT FOUND

HTTP 錯誤回應主體:

404 Page not found

解決方法

如要解決這項錯誤,請按照下列任一解決方案操作:

  • 請確認要求來自您的 Google Cloud 專案或 VPC Service Controls 服務範圍。

  • 將函式的輸入設定變更為允許所有流量

  • Cloud Run 函式原始碼可能會因函式網址、HTTP 方法或邏輯錯誤而導致 404 錯誤。

函式叫用缺少有效的驗證憑證

受限存取權設定的函式需要ID 權杖。如果您使用存取權杖更新權杖,函式叫用作業就會失敗。

錯誤訊息

HTTP 錯誤回應代碼:401 未授權

HTTP 錯誤回應主體:

Your client does not have permission to the requested URL </FUNCTION_NAME>

解決方法

如要解決這項錯誤,請按照下列任一解決方案操作:

  • 請確認要求包含 Authorization: Bearer ID_TOKEN 標頭,且權杖為 ID 權杖,而非存取權或重新整理權杖。如果您使用服務帳戶的私密金鑰手動產生此符記,就必須將自行簽署的 JWT 符記換成 Google 簽署的身分符記。詳情請參閱「為呼叫程序進行驗證」。

  • 使用要求標頭中的驗證憑證叫用 HTTP 函式。舉例來說,您可以使用 gcloud 取得身分驗證權杖,如下所示:

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

    詳情請參閱「為叫用作業進行驗證 」。

函式在執行過程中停止,或在程式碼結束後繼續執行

部分 Cloud Run 函式執行階段可讓使用者執行非同步工作。如果函式建立這類工作,則必須明確等待這些工作完成。否則,函式可能會在錯誤的時間停止執行。

錯誤行為

您的函式會呈現下列任一行為:

  • 函式會在非同步工作仍在執行時終止,但在指定的逾時期限結束前終止。
  • 函式不會在這些工作完成後停止執行,而是會持續執行,直到逾時期限到期為止。

解決方法

如果函式提早終止,請務必確保函式執行下列任何動作之前,所有非同步工作都已完成:

  • 傳回值
  • 解析或拒絕傳回的 Promise 物件 (僅限 Node.js 函式)
  • 擲回未偵測到的例外狀況和錯誤
  • 傳送 HTTP 回應
  • 呼叫回呼函式

如果函式在完成非同步工作後無法終止,您應確認函式在完成後是否正確傳送 Cloud Run 函式信號。特別注意,請務必在函式完成非同步工作後,立即執行上述清單所列的其中一個作業。

存取 VPC Service Controls 保護的資源時發生執行階段錯誤

根據預設,Cloud Run 函式會使用公開 IP 位址,向其他服務提出外出要求。由於服務範圍遭到拒絕,不在 VPC Service Controls 範圍內的函式在嘗試存取受 VPC Service Controls 保護的服務時,可能會收到 HTTP 403 回應。 Google Cloud

錯誤訊息

在稽核資源記錄中,記錄項目如下:

"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"
  ...

解決方法

如要解決這項錯誤,請按照下列任一解決方案操作:

擴充性

本節列出可擴充性問題,並提供每個問題的修正建議。

與待處理佇列要求中止相關的 Cloud Logging 錯誤

下列情況可能與調整資源配置失敗有關。

  • 流量突然大幅增加。
  • 冷啟動時間過長。
  • 要求處理時間過長。
  • 函式錯誤率偏高。
  • 達到執行個體數量上限
  • 與 Cloud Run 函式服務相關的暫時性因素。

在每個情況下,Cloud Run 函式可能無法快速擴充,以便管理流量。

錯誤訊息

 The request was aborted because there was no available instance.

Cloud Run 函式有下列嚴重性等級:

* `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.

解決方法

記錄

以下章節將說明記錄相關問題及其修正方式。

記錄項目沒有或有錯誤的記錄嚴重性層級

Cloud Run 函式預設會記錄執行階段記錄。寫入 stdoutstderr 的記錄會自動顯示在 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 函式傳回錯誤,記錄檔仍會遺失

Cloud Run 函式會將 Cloud Run 函式記錄串流傳送至預設的 bucket。建立專案時,Cloud Run 函式會建立並啟用預設值區。如果預設 bucket 遭到停用,或是 Cloud Run 函式記錄檔位於排除篩選器中,則記錄檔不會顯示在 Logs Explorer 中。

解決方法

啟用預設記錄,並確認未設定排除篩選器。

Cloud Run 函式記錄未顯示在記錄檔探索工具中

部分 Cloud Logging 用戶端程式庫會使用非同步程序來寫入記錄項目。如果函式發生當機或其他終止情形,則可能有些記錄項目尚未寫入,可能會稍後才出現。部分記錄檔也可能會遺失,無法在記錄檔探索工具中查看。

解決方法

請在退出函式之前,使用用戶端程式庫介面清除緩衝記錄項目,或使用程式庫同步寫入記錄項目。您也可以同步將記錄直接寫入 stdoutstderr

使用 Log Router 匯出功能後,Cloud Run 函式記錄未顯示

記錄檔路由器接收器會將記錄項目轉送至各種目的地。

控制台記錄路由器的螢幕截圖,其中醒目顯示 View 匯出端詳細資料

設定中包含排除篩選器,可定義可捨棄的項目。

螢幕截圖:顯示排除篩選器的「Console Log Router Sink Details」對話方塊

解決方法

移除 resource.type="cloud_functions" 的排除篩選器組合。

資料庫連線

許多資料庫錯誤都與超出連線限制或逾時有關。如果您在記錄檔中看到 Cloud SQL 警告 (例如 Context deadline exceeded),可能需要調整連線設定。詳情請參閱 Cloud SQL 最佳做法

網路

本節列出網路問題,並提供如何修正每個問題的建議。

網路連線

即使您已設定輸出設定,如果 Cloud Run 函式中的所有輸出要求都失敗,您可以執行連線測試,找出任何潛在的網路連線問題。詳情請參閱「建立並執行連線測試」。

無伺服器虛擬私有雲存取連接器未就緒或不存在

如果無伺服器虛擬私有雲存取連接器發生錯誤,可能就不會使用專屬於連接器的 /28 子網路遮罩,因為這是必要條件

錯誤訊息

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

如果 Cloud Run 函式在部署時,由於 Google APIs Service Agent 服務帳戶 PROJECT_NUMBER@cloudservices.gserviceaccount.com缺少權限,導致連接器處於錯誤狀態,就會導致以下錯誤:

錯誤訊息

Failed to prepare VPC connector. Please try again later.

解決方法

列出子網路,檢查連接器是否使用 /28 子網路遮罩。如果連接器未使用 /28 子網路遮罩,請重新建立或建立新的連接器

如要解決這個問題,請按照下列任一解決方案操作:

  • 如果您重新建立連接器,就不需要重新部署其他函式。重新建立連接器時,可能會發生網路中斷的情況。

  • 如果您建立新的替代連接器,請重新部署函式以使用新連接器,然後刪除原始連接器。這可避免網路中斷。

  • 確認 Cloud Run 函式及其關聯連接器已部署在相同的地區。

  • 共用虛擬私有雲設定:

    • 請確認 VPC 連接器用於在專案中佈建資源的服務帳戶 SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.comservice-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com 沒有缺少權限。如果連接器位於服務專案中,這些服務帳戶應在共用虛擬私有雲設定的主專案中具備 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 API 服務代理人缺少在連接器專案中佈建運算資源所需的權限,請將 roles/compute.admin 授予 PROJECT_NUMBER@cloudservices.gserviceaccount.com 服務帳戶。在某些情況下,您可能需要在更新權限後重新建立連接器。

使用 TCP 通訊埠 25 傳送至外部目的地 IP 位址的 SMTP 流量遭到封鎖

為提高安全性, Google Cloud 會在透過 Cloud Run 函式傳送電子郵件時,封鎖連線至 TCP 目的地通訊埠 25

解決方法

如要解除封鎖這些連線,請選擇下列任一做法:

其他

本節將列出不屬於其他類別的其他問題,並提供各項問題的解決方法。

Cloud 稽核記錄中方法 google.storage.buckets.testIamPermissions 的 VPC Service Controls 錯誤

在Google Cloud 控制台中開啟「函式詳細資料」頁面時,Cloud Run 函式會檢查您是否可以修改容器映像檔的儲存空間存放區,以及是否可以公開存取該存放區。為進行驗證,Cloud Run 函式會使用 google.storage.buckets.testIamPermissions 方法傳送要求至 Container Registry 儲存桶,格式如下:[REGION].artifacts.[PROJECT_ID].appspot.com。兩項檢查的唯一差異在於,其中一個檢查會在驗證使用者修改儲存桶的權限時進行驗證,而另一個檢查則會在未驗證身分時進行驗證,以確認儲存桶是否可供大眾存取。

如果 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 位址定義存取層級,進一步細化入站規則。