疑難排解

本頁說明使用 Cloud Storage 時,可能遇到的常見錯誤疑難排解方法。

如要瞭解影響 Cloud Storage 等 Google Cloud 服務的事件,請參閱Google Cloud Personalized Service Health 資訊主頁。

記錄原始要求

使用 gcloud 或 Cloud Storage 用戶端程式庫等工具時,大部分的要求和回應資訊都會由工具處理。不過,有時查看詳細資料有助於疑難排解,或在 Stack Overflow 等論壇上發布問題。請按照下列操作說明,傳回工具的要求和回應標頭:

控制台

查看要求和回應資訊的方式,取決於您用來存取 Google Cloud 控制台的瀏覽器。Google Chrome 瀏覽器:

  1. 按一下 Chrome 的主選單按鈕 ()。

  2. 選取「更多工具」。

  3. 按一下「Developer Tools」(開發人員工具)。

  4. 在顯示的窗格中,按一下「網路」分頁標籤。

指令列

在要求中使用全域偵錯旗標。例如:

gcloud storage ls gs://my-bucket/my-object --log-http --verbosity=debug

用戶端程式庫

C++

  • 設定環境變數 CLOUD_STORAGE_ENABLE_TRACING=http,即可取得完整的 HTTP 流量。

  • 將環境變數 CLOUD_STORAGE_ENABLE_CLOG 設為 yes,即可記錄每個 RPC。

C#

使用 ApplicationContext.RegisterLogger 方法新增記錄器,並在 HttpClient 訊息處理常式上設定記錄選項。詳情請參閱 C# 用戶端程式庫參考文件。

Go

設定環境變數 GODEBUG=http2debug=1。詳情請參閱 Go 套件 net/http。

如要一併記錄要求主體,請使用自訂 HTTP 用戶端。

Java

  1. 建立名為「logging.properties」的檔案,並加入下列內容:

    # Properties file which configures the operation of the JDK logging facility.
    # The system will look for this config file to be specified as a system property:
    # -Djava.util.logging.config.file=${project_loc:googleplus-simple-cmdline-sample}/logging.properties
    
    # Set up the console handler (uncomment "level" to show more fine-grained messages)
    handlers = java.util.logging.ConsoleHandler
    java.util.logging.ConsoleHandler.level = CONFIG
    
    # Set up logging of HTTP requests and responses (uncomment "level" to show)
    com.google.api.client.http.level = CONFIG
  2. 搭配 Maven 使用 logging.properties

    mvn -Djava.util.logging.config.file=path/to/logging.properties insert_command

詳情請參閱「可外掛的 HTTP 傳輸」。

Node.js

呼叫 Node 指令碼前,請先設定環境變數 NODE_DEBUG=https。

PHP

使用 httpHandler 為用戶端提供自己的 HTTP 處理常式,並設定中介軟體來記錄要求和回應。

Python

使用記錄模組。例如:

import logging
import http.client

logging.basicConfig(level=logging.DEBUG)
http.client.HTTPConnection.debuglevel=5

小茹

在 .rb file 頂端的 require "google/cloud/storage" 後方,新增以下內容:

ruby
Google::Apis.logger.level = Logger::DEBUG

新增自訂標頭

在要求中加入自訂標頭是常見的偵錯工具,例如啟用偵錯標頭或追蹤要求。以下範例說明如何為不同的 Cloud Storage 工具設定要求標頭:

指令列

使用 --additional-headers 旗標,這項旗標適用於大多數指令。例如:

gcloud storage objects describe gs://my-bucket/my-object --additional-headers=HEADER_NAME=HEADER_VALUE

其中 HEADER_NAME 和 HEADER_VALUE 定義了您要新增至要求的標頭。

用戶端程式庫

C++

namespace gcs = google::cloud::storage;
gcs::Client client = ...;
client.AnyFunction(... args ..., gcs::CustomHeader("header-name", "value"));

C#

以下範例會將自訂標頭新增至用戶端程式庫提出的每項要求。

using Google.Cloud.Storage.V1;

var client = StorageClient.Create();
client.Service.HttpClient.DefaultRequestHeaders.Add("custom-header", "custom-value");

var buckets = client.ListBuckets("my-project-id");
foreach (var bucket in buckets)

{
  Console.WriteLine(bucket.Name);
}

Go

您可以對傳遞至方法的內容使用 callctx.SetHeaders,將自訂標頭新增至 Storage 套件發出的任何 API 呼叫。

package main

import (
  "context"

  "cloud.google.com/go/storage"
  "github.com/googleapis/gax-go/v2/callctx"
)

func main() {
  ctx := context.Background()

  client, err := storage.NewClient(ctx)
  if err != nil {
    // Handle error.
  }
  ctx = callctx.SetHeaders(ctx, "X-Custom-Header", "value")

  // Use client as usual with the context and the additional headers will be sent.
  _, err = client.Bucket("my-bucket").Attrs(ctx)
  if err != nil {
    // Handle error.
  }
}

Java

import com.google.api.gax.rpc.FixedHeaderProvider;
import com.google.api.gax.rpc.HeaderProvider;
import com.google.cloud.WriteChannel;
import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

import java.io.IOException;
import java.nio.ByteBuffer;
import static java.nio.charset.StandardCharsets.UTF_8;

public class Example {

  public void main(String args[]) throws IOException {
    HeaderProvider headerProvider =
            FixedHeaderProvider.create("custom-header", "custom-value");
    Storage storage = StorageOptions.getDefaultInstance()
            .toBuilder()
            .setHeaderProvider(headerProvider)
            .build().getService();
    String bucketName = "example-bucket";
    String blobName = "test-custom-header";

    // Use client with custom header
    BlobInfo blob = BlobInfo.newBuilder(bucketName, blobName).build();
    byte[] stringBytes;
    try (WriteChannel writer = storage.writer(blob)) {
      stringBytes = "hello world".getBytes(UTF_8);
      writer.write(ByteBuffer.wrap(stringBytes));
    }
  }
}

Node.js

const storage = new Storage();

storage.interceptors.push({
  request: requestConfig => {
    Object.assign(requestConfig.headers, {
      'X-Custom-Header': 'value',
      });
    return requestConfig;
  },
});

PHP

所有觸發 HTTP 要求的方法呼叫,都接受選用的 $restOptions 引數做為最後一個引數。您可以依個別要求或個別用戶端提供自訂標頭。

use Google\Cloud\Storage\StorageClient;

$client = new StorageClient([
   'restOptions' => [
       'headers' => [
           'x-foo' => 'bat'
       ]
   ]
]);

$bucket = $client->bucket('my-bucket');

$bucket->info([
   'restOptions' => [
       'headers' => [
           'x-foo' => 'bar'
       ]
   ]
]);

Python

from google.cloud import storage

client = storage.Client(
    extra_headers={
        "x-custom-header": "value"
    }
)

小茹

require "google/cloud/storage"

storage = Google::Cloud::Storage.new

storage.add_custom_headers { 'X-Custom-Header'=> 'value' }

Rust

use google_cloud_gax::options::RequestOptionsBuilder;
use google_cloud_storage::client::Storage;
use google_cloud_storage::client::StorageControl;
use http::header::{HeaderName, HeaderValue};

pub async fn sample(bucket_id: &str) -> anyhow::Result<()> {
    const NAME: &str = "hello-world.txt";

    // Set a client-level custom header on the Storage data plane client.
    let client = Storage::builder()
        .with_custom_header(
            HeaderName::from_static("x-custom-header"),
            HeaderValue::from_static("custom-value"),
        )
        .build()
        .await?;

    let reader = client
        .read_object(format!("projects/_/buckets/{bucket_id}"), NAME)
        .send()
        .await?;
    println!("Object highlights: {:?}", reader.object());

    // Set a request-level custom header on a StorageControl RPC request.
    let control = StorageControl::builder().build().await?;
    let bucket = control
        .get_bucket()
        .set_name(format!("projects/_/buckets/{bucket_id}"))
        .with_custom_header(
            HeaderName::from_static("x-custom-header"),
            HeaderValue::from_static("custom-value"),
        )
        .send()
        .await?;
    println!("Bucket {bucket_id} metadata is {bucket:?}");

    Ok(())
}

存取具有 CORS 設定的值區

如果您已在 bucket 設定 CORS,但發現來自用戶端瀏覽器的傳入要求失敗,請嘗試下列疑難排解步驟:

  1. 查看目標 bucket 的 CORS 設定。如果有多個 CORS 設定項目,請確認用於疑難排解的要求值,對應至單一 CORS 設定項目中的值。

  2. 測試發出 CORS 要求時,請確認您未向 storage.cloud.google.com 端點發出要求,因為該端點不允許 CORS 要求。如要進一步瞭解 CORS 支援的端點,請參閱「Cloud Storage CORS 支援」。

  3. 使用選擇的工具檢查要求及回應。在 Chrome 瀏覽器中,您可以使用標準開發人員工具來查看此資訊:

    1. 按一下瀏覽器工具列上的 Chrome 選單 ()。
    2. 依序選取「更多工具」 >「開發人員工具」。
    3. 按一下 [Network] (網路) 分頁標籤。
    4. 從您的應用程式或指令列傳送要求。
    5. 在顯示網路活動的窗格中,找出要求。
    6. 在 [Name] 欄中,按一下與要求對應的名稱。
    7. 按一下 [Headers] 分頁標籤查看回應標頭,或按一下 [Response] 分頁標籤查看回應內容。

    如果沒有看到要求和回應,可能是因為瀏覽器快取了先前失敗的預檢要求嘗試。清除瀏覽器的快取應該會一併清除預檢快取。如果沒有,請將 CORS 設定中的 MaxAgeSec 值設為低於預設值 3600 (60 分鐘),等待舊的 MaxAgeSec 時間過去,然後再次嘗試要求。這會執行新的預檢要求,進而擷取新的 CORS 設定並清除快取項目。問題偵錯完畢後,請將 MaxAgeSec 重新調高,減少傳送至 bucket 的預檢流量。

  4. 請確定要求含有 Origin 標頭,且該標頭值至少符合值區 CORS 設定中的一個 Origins 值。請注意,這些值的通訊協定、主機和通訊埠必須完全相符。以下是可接受的比對範例:

    • http://origin.example.com 與 http://origin.example.com:80 相符 (因為 80 是預設 HTTP 通訊埠),但與 https://origin.example.com、http://origin.example.com:8080、http://origin.example.com:5151 或 http://sub.origin.example.com 不符。

    • https://example.com:443 與 https://example.com 相符,但與 http://example.com 或 http://example.com:443 不相符。

    • http://localhost:8080 只會與 http://localhost:8080 完全相符,不會與 http://localhost:5555 或 http://localhost.example.com:8080 相符。

  5. 如果是簡單要求,請確認要求的 HTTP 方法至少與 bucket CORS 設定中的一個 Methods 值相符。如果是預檢要求,請確認 Access-Control-Request-Method 中指定的方法至少與其中一個 Methods 值相符。

  6. 如果是預檢要求,請檢查是否包含一或多個 Access-Control-Request-Header 標頭。如果是,請確認每個 Access-Control-Request-Header 值都與 bucket 的 CORS 設定中的 ResponseHeader 值相符。所有在 Access-Control-Request-Header 中指名的標頭都必須納入 CORS 設定,預檢要求才會成功,並在回應中納入 CORS 標頭。

錯誤代碼

以下是您可能會遇到的常見 HTTP 狀態碼。

301:Moved Permanently (永久移動)

問題:我正在設定靜態網站,但存取目錄路徑時,系統傳回空白物件和 301 HTTP 回應代碼。

解決方案:如果瀏覽器下載了零位元組物件,且您在存取目錄 (例如 http://www.example.com/dir/) 時收到 301 HTTP 回應代碼,則 bucket 很可能包含該名稱的空白物件。如要確認這個情況並修正問題:

  1. 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。

    前往「Buckets」(值區) 頁面

  2. 按一下 Google Cloud 控制台頂端的「啟用 Cloud Shell」按鈕。
  3. 執行 gcloud storage ls --recursive gs://www.example.com/dir/。 如果輸出內容包含 http://www.example.com/dir/,表示該位置有空白物件。
  4. 使用下列指令移除空白物件: gcloud storage rm gs://www.example.com/dir/

現在您可以存取 http://www.example.com/dir/,並讓它傳回該目錄的 index.html 檔案,而不是空白物件。

400:要求無效

問題:執行支援續傳的上傳作業時,收到這項錯誤和 Failed to parse Content-Range header. 訊息

解決方案:Content-Range 標頭中的值無效。舉例來說,Content-Range: */* 無效,應指定為 Content-Range: bytes */*。如果收到這項錯誤,表示目前支援續傳的上傳作業已失效,必須重新開始。

400:Storage Intelligence 專屬錯誤

如要瞭解設定或管理 Storage Intelligence、Storage Insights 和 Storage 批次作業時,常見錯誤的解決方法,請參閱「排解 Storage Intelligence 問題」。

401:未授權

問題:直接或透過 Cloud CDN 向公開 bucket 傳送要求,但失敗並傳回 HTTP 401: Unauthorized 和 Authentication Required 回應。

解決方案:確認用戶端或任何中繼 Proxy 未在傳送至 Cloud Storage 的要求中加入 Authorization 標頭。任何含有 Authorization 標頭的要求 (即使是空白),都會視為驗證嘗試進行驗證。

403:Account Disabled (帳戶已停用)

問題:嘗試建立 bucket 時,收到 403 Account Disabled 錯誤訊息。

解決方案:這個錯誤訊息表示您尚未啟用相關專案的計費功能。如要瞭解啟用計費功能的步驟,請參閱「啟用專案的計費功能」。

如果已啟用計費功能,但仍持續收到這則錯誤訊息,請與支援團隊聯絡,並提供專案 ID 和問題說明。

403:禁止

問題:我應該有權存取特定 bucket 或物件,但嘗試存取時,卻收到 403 - Forbidden 錯誤,並顯示類似以下的訊息:example@email.com doesn't have storage.objects.get access to the Google Cloud Storage object。

解決方案:您缺少完成要求所需的 bucket 或物件 IAM 權限。如果您預期可以提出要求,但無法提出,請執行下列檢查:

  1. 錯誤訊息中提及的被授權人是否符合預期?如果錯誤訊息提及非預期的電子郵件地址或「匿名呼叫端」,表示要求並未使用您預期的憑證。這可能是因為您用來提出要求的工具是使用其他別名或實體的憑證設定,也可能是因為服務帳戶代表您提出要求。

  2. 錯誤訊息中提及的權限,是否為您認為需要的權限?如果出現非預期的權限,可能是因為您使用的工具需要額外存取權,才能完成要求。舉例來說,如要大量刪除 bucket 中的物件,gcloud 必須先建構 bucket 中要刪除的物件清單。這部分的大量刪除動作需要 storage.objects.list 權限,這可能令人意外,因為刪除物件通常只需要 storage.objects.delete 權限。如果這是錯誤訊息的原因,請確認您已取得具備其他必要權限的 IAM 角色。

  3. 您是否已取得目標資源或上層資源的 IAM 角色?舉例來說,如果您獲派專案的 Storage Object Viewer 角色,並嘗試下載物件,請確認物件位於專案中的 bucket。您可能不小心擁有其他專案的 Storage Object Viewer 權限。

  4. 您是否透過便利值取得特定 bucket 或物件的存取權?如果移除授予便利值的存取權,先前啟用的主體可能會失去資源存取權。

    舉例來說,假設 jane@example.com 擁有 my-example-project 專案的基本角色「擁有者」(roles/owner),且專案的 IAM 政策將「Storage 物件建立者」(roles/storage.objectCreator) 角色授予便利值 projectOwner:my-example-project。因此,jane@example.com 具備 my-example-project 內 bucket 的 Storage 物件建立者角色相關權限。如果移除這項授權,jane@example.com 就會失去與 Storage 物件建立者角色相關聯的權限。

    在這種情況下,您可以授予自己必要的值區層級或物件層級權限,執行所需動作,重新取得值區或物件的存取權。

  5. 是否有 IAM 拒絕政策禁止您使用特定權限?您可以與組織管理員聯絡,確認是否已設定 IAM 拒絕政策。

403:權限遭拒

問題:設定或管理資源的 Storage Intelligence 設定時,發生權限遭拒錯誤。

解決方案:設定及管理資源的 Storage Intelligence 時,如果收到權限遭拒錯誤,且訊息類似 permission storage.intelligenceConfigs.update,請參閱要執行作業的權限一節。如要解決這個問題,請授予適當權限。您可以透過下列任一方式授予權限:

  • 在要啟用 Storage Intelligence 的Google Cloud 資源階層資源,授予 IAM 權限。
  • 確認 Google Cloud 資源階層中較高層級的資源會將權限傳遞給子項資源。

409:Conflict (衝突)

問題:我在嘗試建立值區時收到以下錯誤訊息:

409 Conflict. Sorry, that name is not available. Please try a different one.

解決方案:您嘗試使用的 bucket 名稱 (例如 gs://cats 或 gs://dogs) 已有人使用。Cloud Storage 採用全域命名空間,因此您無法使用現有 bucket 的名稱。請選擇未使用的名稱。

412:違反自訂限制

問題:我的要求遭拒,並顯示 412 orgpolicy 錯誤。

問題:我的要求遭拒,並顯示 412 Multiple constraints were violated 錯誤。

解決方案:請洽詢安全管理員團隊,確認您傳送要求的 bucket 是否受到使用自訂限制的組織政策影響。bucket 也可能受到多項互相衝突的組織政策影響。例如,某項政策指定 bucket 必須採用 Standard Storage 級別,而另一項政策指定 bucket 必須採用 Coldline Storage 級別。

429:要求數量過多

問題:我的要求遭拒,並顯示 429 Too Many Requests 錯誤。

解決方案:您已達到 Cloud Storage 允許特定資源的要求數量上限。如要瞭解 Cloud Storage 的限制,請參閱「Cloud Storage 配額」。

  • 如果工作負載每秒向 bucket 傳送 1,000 個要求,請參閱「要求比率和存取權分配指南」,瞭解最佳做法,包括逐步增加工作負載,以及避免使用依序命名的檔案。

  • 如果工作負載可能使用 50 Gbps 以上的網路輸出至特定位置,請檢查頻寬用量,確保未達到頻寬配額。

物件結構定義錯誤

本節說明使用物件情境時可能遇到的常見錯誤。

400:超過物件結構定義限制

問題:這項錯誤表示物件的脈絡資料數量超過 50 項。

解決方案:每個物件的物件脈絡數量已超過上限。請減少內容鍵/值組合數量,然後再試一次。

400:物件脈絡資料鍵或值超過大小限制

問題:這項錯誤表示物件脈絡資料鍵或值的大小超過 256 位元組。

解決方案:每個物件情境鍵和值不得超過 256 個位元組 (UTF-8 編碼)。請縮短鍵或值,然後再試一次。

400:物件脈絡資料鍵或值匯總大小超過上限

問題:錯誤指出所有物件內容鍵和值的匯總大小超過限制。

解決方案:物件的所有內容鍵和值總大小不得超過 25 KiB (25,600 位元組)。請減少比對內容資料總量,然後再試一次。

400:物件脈絡資料鍵或值含有禁止使用的字元

問題:這項錯誤表示物件情境鍵或值含有禁止使用的字元。

解決方案:物件情境鍵和值不得包含單引號 (')、雙引號 (")、反斜線 (\`), or forward slashes (/`)。請檢查情境並移除所有無效字元。

400:物件情境索引鍵或值開頭必須是英數字元

問題:這項錯誤表示物件內容鍵或值開頭不是英數字元。

解決方案:物件內容鍵和值必須以英文字母或十進位數字開頭。

400:物件脈絡資料鍵或值空白

問題:這項錯誤表示物件情境鍵或值不得空白。

解決方案:為物件內容的鍵和值提供非空白字串。

400:物件脈絡資料鍵或值並非有效的 UTF-8

問題:這項錯誤表示物件情境鍵或值並非有效的 UTF-8 字串。

解決方案:確認情境索引鍵和值中的所有字元都使用 UTF-8 編碼。

400:物件脈絡資料鍵保留前置字元

問題:這項錯誤表示物件情境索引鍵開頭為保留前置字串。

解決方案:部分前置字串僅保留給系統使用。請避免在情境金鑰中使用受限制的前置字元,例如 goog。

400:物件的 Drop Context 群組數量不得超過 50 個

問題:錯誤指出 drop_context_groups 參數的值不得超過 50 個。

解決方案:減少 drop_context_groups 參數中的值數量,然後再試一次。

400:Drop Context Groups 欄位的值無效

問題:這項錯誤表示 drop_context_groups 參數包含無效值。

解決方案:drop_context_groups 參數唯一接受的值是 custom。

診斷 Google Cloud 控制台錯誤

問題:使用 Google Cloud 控制台執行作業時,收到一般錯誤訊息。舉例來說,嘗試刪除 bucket 時,我會看到錯誤訊息,但看不到作業失敗的詳細原因。

解決方案:使用 Google Cloud 控制台的通知,查看失敗作業的詳細資訊:

  1. 按一下 Google Cloud 控制台標頭中的「Notifications」(通知) 按鈕 ()。

    下拉式選單會顯示Google Cloud 控制台最近執行的作業。

  2. 按一下要進一步瞭解的項目。

    系統會開啟頁面,顯示作業的詳細資訊。

  3. 按一下各列,即可展開詳細錯誤資訊。

問題:使用 Google Cloud 控制台時,未顯示特定資料欄。

解決方法:如要在 Google Cloud 控制台中查看特定資料欄,請按一下「Column display options」(資料欄顯示選項) 圖示 (),然後選取要顯示的資料欄。

模擬資料夾和代管資料夾

問題:我刪除了 bucket 中的一些物件,現在存放這些物件的資料夾未顯示在 Google Cloud 控制台中。

解決方案:雖然 Google Cloud 控制台會顯示 bucket 的內容,就像有目錄結構一樣,但 Cloud Storage 中基本上不存在資料夾。因此,當您從 bucket 中移除所有具有共同前置字串的物件時,代表該組物件的資料夾圖示就不會再顯示於 Google Cloud 控制台中。

問題:無法建立代管資料夾。

解決方案:如要建立代管資料夾,請務必符合下列需求條件:

  • 您具備包含 storage.managedfolders.create 權限的 IAM 角色,例如 Storage 物件管理員 (roles/storage.objectAdmin) 角色。如要瞭解如何授予角色,請參閱「使用 IAM 權限」。

  • 您要建立代管資料夾的值區已啟用統一值區層級存取權。

  • 值區或專案沒有使用值區資源類型 (storage.googleapis.com/Bucket) 或物件資源類型 (storage.googleapis.com/Object) 的 IAM 條件。如果專案中的任何值區具有使用上述任一資源類型的 IAM 條件,則無法在該專案中的任何值區建立代管資料夾,即使之後移除條件也一樣。

問題:bucket 中有代管資料夾,因此無法停用統一 bucket 層級存取權。

解決方案:如果 bucket 中有代管資料夾,就無法停用統一 bucket 層級存取權。如要停用統一 bucket 層級存取權,請先刪除 bucket 中的所有代管資料夾。

靜態網站錯誤

以下是設定代管靜態網站的值區時可能遇到的常見問題。

透過 HTTPS 提供內容

問題:我想透過 HTTPS 提供內容,但不使用負載平衡器。

解決方案:您可以使用 https://storage.googleapis.com/my-bucket/my-object 等直接 URI,透過 HTTPS 提供靜態內容。如要透過其他選項,使用自訂網域透過 SSL 提供內容,您可以:

頁面無法存取

問題:網站提供的網頁顯示 Access denied 錯誤訊息。

解決方案:檢查物件是否為公開共用。如果不是,請參閱「公開資料」的操作說明。

如果您先前上傳了物件並進行共用,但之後上傳該物件的新版本,那麼您必須以公開分享方式轉貼該物件,這是因為公開權限會由新的上傳內容取代。

下載內容

問題:系統提示我下載頁面內容,而無法在瀏覽器中查看。

解決方案:如果將 MainPageSuffix 指定為不含網路內容類型的物件,系統會提示網站訪客下載內容,而不是顯示網頁內容。如要解決這個問題,請將 Content-Type 中繼資料項目更新為適當的值,例如 text/html。如需操作說明,請參閱「編輯物件中繼資料」。

公開您的資料

問題:我嘗試公開資料,但收到組織政策錯誤訊息。

解決方案:部分組織政策限制可能會阻止您公開資料。例如,網域限定共用限制 (constraints/iam.allowedPolicyMemberDomains) 會根據組織的網域限制資源共用。如果組織政策失敗,請與管理員聯絡,要求對方編輯組織、資料夾或專案資源的組織政策,授予您專案或 bucket 層級權限,允許資源共用。如果覆寫組織政策後仍看到這則錯誤訊息,可能需要等待幾分鐘,讓變更生效。

問題:嘗試公開資料時,收到權限錯誤訊息。

解決方案:確認您具備 storage.buckets.setIamPolicy 權限或 storage.objects.setIamPolicy 權限。舉例來說,Storage 管理員 (roles/storage.admin) 角色即具備這些權限。如果您具備 storage.buckets.setIamPolicy 權限或 storage.objects.setIamPolicy 權限,但仍收到錯誤訊息,表示 bucket 可能受到禁止公開存取政策限制,不允許存取 allUsers 或 allAuthenticatedUsers。禁止公開存取功能可能直接在 bucket 上設定,也可能透過在較高層級設定的組織政策強制執行。

延遲時間

以下是您可能會遇到的常見延遲問題。此外,Google Cloud Service Health 資訊主頁也會提供影響 Google Cloud 服務 (例如 Cloud Storage) 的事件資訊。

上傳或下載延遲時間

問題:上傳或下載時延遲時間增加。

解決方案:請考量下列上傳和下載延遲的常見原因:

  • CPU 或記憶體限制:受影響環境的作業系統應有工具,可評估本機資源消耗量,例如 CPU 和記憶體用量。

  • 磁碟 IO 限制:效能影響可能是由本機磁碟 IO 造成。

  • 地理距離:Cloud Storage bucket 與受影響環境之間的實際距離可能會影響效能,尤其是跨洲的情況。使用與受影響環境位於相同區域的值區進行測試,可以找出地理位置分隔對延遲時間的影響程度。

    • 在適用情況下,受影響環境的 DNS 解析器應使用 EDNS(0) 通訊協定,以便透過適當的 Google Front End 轉送來自環境的要求。

CLI 或用戶端程式庫延遲時間

問題:使用 Google Cloud CLI 或其中一個用戶端程式庫存取 Cloud Storage 時,延遲時間增加。

解決方案:gcloud CLI 和用戶端程式庫會在適當情況下自動重試要求,而這種行為可能會有效增加使用者看到的延遲時間。使用 Cloud Monitoring 指標 storage.googleapis.com/api/request_count,查看 Cloud Storage 是否持續提供可重試的回應代碼,例如 429 或 5xx。

Proxy 伺服器

問題:我透過 Proxy 伺服器連線,我需要做些什麼?

解決方案:如要透過 Proxy 伺服器存取 Cloud Storage,您必須允許存取下列網域:

  • accounts.google.com:用於建立 OAuth2 驗證權杖
  • oauth2.googleapis.com:用於執行 OAuth2 權杖交換
  • *.googleapis.com儲存空間要求

如果您的 Proxy 伺服器或安全性政策不支援依網域加入許可清單,而僅支援依 IP 網路區塊加入許可清單,強烈建議您為所有 Google IP 位址範圍設定 Proxy 伺服器。如要查詢位址範圍,請前往 ARIN 查詢 WHOIS 資料。最佳做法是定期檢查 Proxy 設定,確保與 Google 的 IP 位址相符。

不建議使用從 oauth2.googleapis.com 和 storage.googleapis.com 的一次性查詢中取得的個別 IP 位址來設定 Proxy。Google 服務是透過 DNS 名稱公開,這些名稱會對應至大量 IP 位址,且可能隨時間變更,因此如果根據一次性查詢設定 Proxy,可能會導致無法連線至 Cloud Storage。

如果要求是透過 Proxy 伺服器轉送,您可能需要向網路管理員確認,包含憑證的 Authorization 標頭未遭 Proxy 移除。如果沒有 Authorization 標頭,要求會遭到拒絕,並收到 MissingSecurityHeader 錯誤。

後續步驟