本頁面說明如何排解使用 Cloud Storage 時可能遇到的常見錯誤。
如要瞭解影響 Cloud Storage 等 Google Cloud 服務的事件,請參閱Google Cloud Service Health Dashboard。
記錄原始要求
使用 gcloud 或 Cloud Storage 用戶端程式庫等工具時,工具會處理大部分的請求和回應資訊。不過,有時查看詳細資料有助於疑難排解,或在 Stack Overflow 等論壇上提問。請按照下列操作說明,為工具傳回要求和回應標頭:
控制台
查看要求和回應資訊的方式,取決於您用來存取 Google Cloud 控制台的瀏覽器。Google Chrome 瀏覽器:
按一下 Chrome 的主選單按鈕 (more_vert)。
選取「更多工具」。
點按「Developer Tools」(開發人員工具)。
在隨即顯示的窗格中,按一下「網路」分頁標籤。
指令列
在要求中使用全域偵錯標記。例如:
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
建立名為「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搭配 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' }
存取具有 CORS 設定的值區
如果您已在值區中設定 CORS 設定,但發現來自用戶端瀏覽器的傳入要求失敗,請嘗試下列疑難排解步驟:
查看目標值區的 CORS 設定。如果有多個 CORS 設定項目,請確保用於疑難排解的要求值,對應到單一 CORS 設定項目中的值。
測試發出 CORS 要求時,請確認您並未對
storage.cloud.google.com端點提出要求,因為該端點不允許 CORS 要求。如要進一步瞭解 CORS 支援的端點,請參閱「Cloud Storage CORS 支援」一文。使用選擇的工具檢查要求及回應。在 Chrome 瀏覽器中,您可以使用標準開發人員工具來查看此資訊:
- 按一下瀏覽器工具列中的 Chrome 選單 (more_vert)。
- 依序選取「更多工具」 >「開發人員工具」。
- 按一下 [Network] (網路) 分頁標籤。
- 從您的應用程式或指令列傳送要求。
- 在顯示網路活動的窗格中,找出要求。
- 在 [Name] 欄中,按一下與要求對應的名稱。
- 按一下 [Headers] 分頁標籤查看回應標頭,或按一下 [Response] 分頁標籤查看回應內容。
如果沒有看到要求和回應,可能是瀏覽器快取了之前失敗的預檢要求嘗試。清除瀏覽器的快取應該會一併清除預檢快取。如果沒有清除,請將 CORS 設定中的
MaxAgeSec值設為低於預設值3600(60 分鐘),等待舊MaxAgeSec設定的時間截止,然後重試要求。這會執行新的預檢要求,進而擷取新的 CORS 設定並清除快取項目。完成問題除錯後,請將MaxAgeSec改回較高的值,以降低值區的預檢流量。請確定要求含有
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不相符。
如果是簡易要求,請確保要求的 HTTP 方法至少符合值區 CORS 設定中的一個
Methods值。如果是預檢要求,請確認Access-Control-Request-Method中指定的方法至少符合一個Methods值。如果是預檢要求,請檢查是否含有一或多個
Access-Control-Request-Header標頭。如果是,請確認每個Access-Control-Request-Header值都符合值區 CORS 設定中的ResponseHeader值。所有在Access-Control-Request-Header中指名的標頭都必須納入 CORS 設定,預檢要求才會成功,並在回應中納入 CORS 標頭。
錯誤代碼
以下是您可能會遇到的常見 HTTP 狀態碼。
301:Moved Permanently (永久移動)
問題:我正在設定靜態網站,但存取目錄路徑時,系統會傳回空物件和 301 HTTP 回應代碼。
解決方案:如果您的瀏覽器下載零個位元組的物件,而且您在存取目錄 (例如 http://www.example.com/dir/) 時得到 301 HTTP 回應代碼,則您的值區很可能包含具有該名稱的空物件。如要確認這個情況並修正問題:
- 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
- 按一下控制台頂端的「啟用 Cloud Shell」按鈕。 Google Cloud
- 執行
gcloud storage ls --recursive gs://www.example.com/dir/。 如果輸出內容包含http://www.example.com/dir/,則該位置有一個空物件。 - 使用下列指令移除空物件:
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 時,可能會遇到的常見錯誤。
400:bucket 名稱無效
問題:設定或管理資源的 Storage Intelligence 功能時,您可能會收到這則錯誤訊息和 The specific bucket is not valid.
解決方法:您在要求中使用的網址無效。網址必須符合下列規定:
- Storage Intelligence 僅支援
locations/global。系統不支援使用其他位置。 - 網址中的
Storage Intelligence是單數,而非複數。
以下是有效網址的範例:
curl -X PATCH -H "Content-Type: application/json" -d
'{"edition_config": "STANDARD" }'
-H "Authorization: Bearer $(gcloud auth print-access-token)" "https://storage.googleapis.com/v2/projects/my-project/locations/global/storageIntelligence?updateMask=edition_config"400:引數無效 - 更新遮罩空白
問題:設定或管理資源的 Storage Intelligence 功能時,您可能會收到這則錯誤訊息和 Empty UPDATE_MASK in the request.
解決方法:UPDATE_MASK 是以半形逗號分隔的欄位名稱清單,當中列出要求更新的欄位。欄位名稱採用 FieldMask 格式,屬於 intelligenceConfig 資源。如要更新資源的 Storage Intelligence 設定,請在要求中使用有效的 UPDATE_MASK。不支援空白值。
400:更新遮罩路徑無效
問題:設定或管理資源的 Storage Intelligence 功能時,您可能會收到這則錯誤訊息和 Invalid UPDATE_MASK paths.
解決方法:如果在 UPDATE_MASK 中使用無效的欄位名稱,就會收到錯誤訊息。UPDATE_MASK 是以半形逗號分隔的欄位名稱清單,要求會更新這些欄位。欄位名稱採用 FieldMask 格式,屬於 IntelligenceConfig 資源。如要更新資源的 Storage Intelligence 設定,請確保 UPDATE_MASK 中列出的每個欄位名稱都是 IntelligenceConfig 資源內的有效欄位。
400:欄位無法編輯
問題:設定或管理資源的 Storage Intelligence 功能時,您可能會收到這則錯誤訊息和 Invalid UPDATE_MASK: UPDATE_TIME field is not editable.
解決方法:UPDATE_MASK 是以半形逗號分隔的欄位名稱清單,當中列出要求更新的欄位。欄位名稱採用 FieldMask 格式,且屬於 IntelligenceConfig 資源。如果您嘗試更新無法編輯的欄位,系統會顯示錯誤訊息。請從 Update_Mask 中移除無法編輯的欄位,然後再試一次。
400:無效值
問題:設定或管理資源的 Storage Intelligence 功能時,您可能會收到這則錯誤訊息和 Invalid value at storage_intelligence.edition_config.
解決方法:如果您嘗試為 edition_config 欄位使用無效值,就會收到錯誤訊息。可以使用的值為 INHERIT、STANDARD 和 DISABLED。請檢查值,然後再試一次。
400:篩選器不得為空
問題:更新資源的 Storage Intelligence 設定時,您可能會收到這則錯誤訊息和 Non-empty filter cannot be specified for INHERIT or DISABLED edition configuration. 訊息。
解決方案:將 Storage Intelligence edition_config 更新至 INHERIT 或 DISABLED 時,您無法在要求中使用任何值區篩選器。請從要求中移除篩選器,然後再試一次。
400:篩選器中的位置或值區值為空白
問題:更新資源的 Storage Intelligence 設定時,您可能會收到這則錯誤訊息和 Empty location or bucket values in filter. 訊息。
解決方法:更新 Storage Intelligence 設定並在要求中使用bucket 篩選器時,如果 location 或 bucket 的值為空字串,就會發生錯誤。請為 location 或 bucket 提供有效值,然後再試一次。
401:未經授權
問題:直接或使用 Cloud CDN 對公開值區提出的要求失敗,並收到 HTTP 401: Unauthorized 和 Authentication Required 回應。
解決方案:確認用戶端或任何中繼 Proxy 未將 Authorization 標頭新增至對 Cloud Storage 的要求。系統會驗證任何含有 Authorization 標頭的要求 (即使標頭為空白),視為驗證嘗試。
403:Account Disabled (帳戶已停用)
問題:我嘗試建立值區,但收到 403 Account Disabled 錯誤訊息。
解決方案:這個錯誤訊息表示您尚未啟用相關專案的計費功能。如需啟用計費功能的步驟,請參閱「啟用專案的計費功能」。
如果您已啟用計費功能,但仍然收到這個錯誤訊息,請聯絡支援服務並提供專案 ID 和問題說明。
403:禁止
問題:我應該有權存取特定值區或物件,但嘗試存取時卻收到 403 - Forbidden 錯誤,並顯示類似「example@email.com doesn't have storage.objects.get access to the
Google Cloud Storage object」的訊息。
解決方案:您缺少完成要求所需的 bucket 或物件 IAM 權限。如果預期可以提出要求但無法提出,請執行下列檢查:
錯誤訊息中提及的受讓人是否為您預期的對象?如果錯誤訊息提及非預期的電子郵件地址或「匿名來電者」,表示您的要求並未使用預期憑證。這可能是因為您用來提出要求的工具是使用其他別名或實體的憑證設定,也可能是因為要求是由服務帳戶代表您提出。
錯誤訊息中提及的權限是否為您認為需要的權限?如果權限要求出乎意料,可能是因為您使用的工具需要額外存取權,才能完成要求。舉例來說,如要大量刪除值區中的物件,
gcloud必須先建構要刪除的值區物件清單。大量刪除作業的這部分需要storage.objects.list權限,這可能令人意外,因為目標是刪除物件,通常只需要storage.objects.delete權限。如果這是導致錯誤訊息的原因,請確認您已獲派具有額外必要權限的 IAM 角色。您是否已取得目標資源或父項資源的 IAM 角色?舉例來說,如果您獲授專案的
Storage Object Viewer角色,並嘗試下載物件,請確認物件位於專案中的值區;您可能無意間獲得其他專案的Storage Object Viewer權限。您是否透過便利值取得特定值區或物件的存取權?移除授予便利值的存取權,可能會導致先前已啟用的主體失去資源存取權。
舉例來說,假設 jane@example.com 擁有專案
my-example-project的擁有者 (roles/owner) 基本角色,而專案的 IAM 政策將儲存空間物件建立者 (roles/storage.objectCreator) 角色授予便利值projectOwner:my-example-project。因此,jane@example.com 具有與my-example-project內值區的 Storage 物件建立者角色相關聯的權限。如果移除這項授權,jane@example.com 就會失去與 Storage 物件建立者角色相關聯的權限。在這種情況下,您可以授予自己必要的值區或物件層級權限,重新取得值區或物件的存取權,以便執行所需動作。
是否有身分與存取權管理拒絕政策禁止您使用特定權限?請與貴機構管理員聯絡,確認是否已啟用 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.
解決方案:您嘗試使用的值區名稱 (例如 gs://cats 或 gs://dogs) 已經受到使用。Cloud Storage 採用全域命名空間,因此您無法使用與現有 bucket 相同的名稱為 bucket 命名。請選擇尚未使用的名稱。
412:違反自訂限制
問題:我的要求遭到拒絕,並顯示 412 orgpolicy 錯誤。
問題:我的要求遭到拒絕,並顯示 412 Multiple constraints were violated 錯誤。
解決方法:請洽詢安全管理員團隊,確認您傳送要求的 bucket 是否受到使用自訂限制的機構政策影響。如果不同的機構政策彼此衝突,也可能會影響儲存空間。舉例來說,一項政策規定值區必須採用 Standard Storage 儲存空間級別,另一項政策則規定值區必須採用 Coldline Storage 儲存空間級別。
429:要求數量過多
問題:我的要求遭到拒絕,並顯示 429 Too Many Requests 錯誤。
解決方案:您已達到 Cloud Storage 允許特定資源發出的要求數量上限。如要瞭解 Cloud Storage 的限制,請參閱「Cloud Storage 配額」。
如果工作負載包含每秒對儲存空間發出的數千個要求,請參閱「要求率和存取分配指南」,瞭解最佳做法,包括逐步增加工作負載,以及避免使用連續檔名。
如果工作負載可能使用 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:物件最多只能有 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 控制台的通知,查看作業失敗的詳細資訊:
按一下 Google Cloud 控制台頁首的「通知」按鈕 (notifications)。
下拉式選單會顯示控制台最近執行的作業。Google Cloud
按一下要進一步瞭解的項目。
系統會開啟頁面,顯示作業的詳細資訊。
按一下各資料列,即可展開詳細錯誤資訊。
問題:使用 Google Cloud 控制台時,我沒有看到顯示特定資料欄。
解決方法:如要在控制台中顯示特定資料欄,請按一下「資料欄顯示選項」圖示 (),然後選取要顯示的資料欄。 Google Cloud
模擬資料夾和代管資料夾
問題:我刪除值區中的部分物件,現在 Google Cloud 控制台中不會顯示包含這些物件的資料夾。
解決方案:雖然 Google Cloud 控制台會顯示 bucket 內容,就像有目錄結構一樣,但資料夾在 Cloud Storage 中並不存在。因此,從值區中移除所有具有相同前置字元的物件後,代表該組物件的資料夾圖示就不會再顯示在 Google Cloud 控制台中。
問題:我無法建立代管資料夾。
解決方法:如要建立代管資料夾,請確認符合下列需求:
您擁有包含
storage.managedfolders.create權限的 IAM 角色,例如「儲存空間物件管理員」(roles/storage.objectAdmin) 角色。如需授予角色的操作說明,請參閱「使用 IAM 權限」。在要建立代管資料夾的 bucket 中啟用統一 bucket 層級存取權。
值區或專案沒有使用值區資源類型 (
storage.googleapis.com/Bucket) 或物件資源類型 (storage.googleapis.com/Object) 的 IAM 條件。如果專案中的任何值區有使用這兩種資源類型的 IAM 條件,即使之後移除條件,也無法在該專案的任何值區中建立受管理資料夾。
問題:bucket 中有受管理資料夾,因此無法停用統一的 bucket 層級存取權。
解決方法:如果 bucket 中有代管資料夾,就無法停用統一 bucket 層級存取權。如要停用統一值區層級存取權,請先刪除值區中的所有受管理資料夾。
靜態網站錯誤
以下是設定代管靜態網站的值區時可能遇到的常見問題。
透過 HTTPS 提供內容
問題:我希望透過 HTTPS 提供內容,但不想使用負載平衡器。
解決方案:你可以使用直接 URI (例如 https://storage.googleapis.com/my-bucket/my-object) 透過 HTTPS 提供靜態內容。如要透過安全資料傳輸層 (SSL) 使用自訂網域來提供內容,您也可以採取下列做法:
- 將第三方內容傳遞網路與 Cloud Storage 搭配使用。
- 改用 Firebase 託管服務,而非 Cloud Storage,提供靜態網站內容。
頁面無法存取
問題:我從我的網站所提供的網頁收到 Access denied 錯誤訊息。
解決方案:檢查物件是否為公開共用。如果不是,請參閱將資料設為公開的操作說明來瞭解如何完成這項作業。
如果您先前上傳了物件並進行共用,但之後上傳該物件的新版本,那麼您必須以公開分享方式轉貼該物件,這是因為新的上傳會取代公開權限。
下載內容
問題:系統提示我下載頁面內容,而無法在瀏覽器中查看。
解決方案:如果將 MainPageSuffix 指定為沒有網路內容類型的物件,系統會提示網站訪客下載內容,而不是提供頁面內容。如要解決此問題,請將 Content-Type 中繼資料項目更新為合適的值,例如 text/html。如需操作說明,請參閱「編輯物件中繼資料」一文。
公開您的資料
問題:我嘗試將資料設為公開,但收到機構政策錯誤訊息。
解決方法:部分機構政策限制會禁止您公開資料。舉例來說,「網域限定共用」限制 (constraints/iam.allowedPolicyMemberDomains) 會根據機構的網域限制資源共用。如果組織政策失敗,請聯絡管理員,授予您專案或儲存空間層級的權限,編輯機構、資料夾或專案資源的組織政策,允許資源共用。如果覆寫機構政策後仍看到這則錯誤訊息,請稍候幾分鐘,等待變更生效。
問題:我嘗試公開資料時,系統顯示權限錯誤。
解決方法:請確認您具備 storage.buckets.setIamPolicy 權限或 storage.objects.setIamPolicy 權限。舉例來說,「Storage 管理員」角色 (roles/storage.admin) 授予的權限就包含這些權限。如果您具備 storage.buckets.setIamPolicy 權限或 storage.objects.setIamPolicy 權限,但仍收到錯誤訊息,則您的值區可能受到禁止公開存取限制,因此無法存取 allUsers 或 allAuthenticatedUsers。限制公開存取可能是直接在值區上設定,也可能是透過較高層級設定的機構政策強制執行。
延遲時間
以下是您可能會遇到的常見延遲問題。此外,Google Cloud Service Health Dashboard會提供影響 Cloud Storage 等 Google Cloud 服務的事件資訊。
上傳或下載延遲
問題:上傳或下載時延遲時間變長。
解決方案:請考慮以下上傳和下載延遲的常見原因:
CPU 或記憶體限制:受影響環境的作業系統應具備工具,可測量 CPU 使用率和記憶體用量等本機資源耗用量。
磁碟 IO 限制:本機磁碟 IO 可能會影響效能。
地理距離:Cloud Storage 值區和受影響環境的實際距離可能會影響效能,尤其是在跨洲的情況下。如果測試時使用的值區與受影響的環境位於相同區域,就能判斷地理位置分隔對延遲的影響程度。
- 如適用,受影響環境的 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 名稱公開,而 DNS 名稱會對應到隨時間變化的大量 IP 位址,因此按照一次性查詢所設定的 Proxy 可能會無法連線至 Cloud Storage。
如果您透過 Proxy 轉送要求,建議您向網路管理員確認含有憑證的 Authorization 標頭不會遭到 Proxy 移除。如果沒有 Authorization 標頭,您的要求將會遭到拒絕,而您會收到 MissingSecurityHeader 錯誤訊息。
排解 Storage 批次作業問題
本節提供解決方案,協助您解決使用以一般運算語言 (CEL) 篩選器為基礎的儲存空間批次作業工作時可能遇到的常見問題。
快照已超過兩天,因此 Storage 批次作業工作失敗
問題:建立以 CEL 篩選器為基礎的儲存空間批次作業工作時,工作建立作業會失敗。錯誤訊息指出快照時間已超過兩天。
解決方法:為避免對過時的物件狀態執行動作,儲存空間批次作業會自動停止建立工作。如果所選快照的建立時間超過兩天,就會發生這項錯誤。如要解決這個問題,請選取下列其中一種做法:
- 使用資訊清單檔案:在 BigQuery 中手動查詢資料集。將結果匯出至 CSV 資訊清單檔案,然後將該檔案上傳至 Cloud Storage bucket。接著,您可以使用資訊清單方法建立批次作業,避免受到兩天限制。
- 檢查資料集設定:確認資料集設定已啟用,且未設為暫停狀態。確認資料集快照已順利執行。如要瞭解如何驗證設定,請參閱「查看資料集設定」。
- 使用目標位置和快照時間覆寫:指定
--target-snapshot-time旗標,以 RFC 3339 格式明確選取快照,藉此略過兩天過時失敗。指定--target-locations標記,將作業限制在快照所在位置。您可以使用這些覆寫設定,解決導致自動全域快照無法更新的同步延遲問題。因此,您可以手動指定較新的區域快照。如需指令語法,請參閱「使用進階篩選器建立工作」。
新訂閱的專案無法執行以 CEL 篩選器為基礎的 Storage 批次作業工作
問題:在剛訂閱的專案上執行以 CEL 篩選器為準的儲存空間批次作業工作時,系統找不到有效快照,因此作業會失敗。
解決方案:啟用 Storage Intelligence 訂閱方案後,您必須等待 24 小時,才能執行以 CEL 篩選器為準的儲存空間批次作業工作。這段延遲時間可讓系統執行初始中繼資料快照,並建立起始快照時間。
以 CEL 篩選器為基礎的儲存空間批次作業工作失敗,並顯示權限錯誤或擲回執行階段錯誤
問題:以 CEL 篩選器為基礎的儲存空間批次作業工作在執行期間失敗,或傳回執行階段權限錯誤。
解決方案:儲存空間批次作業會使用您的使用者憑證處理物件。如果沒有目標值區和物件的必要 IAM 讀取者或寫入者權限,工作就會失敗。如果 CEL 篩選器選取你無權存取的資源,就會發生這個問題。確認您的帳戶具備儲存空間管理員 (roles/storage.admin)、儲存空間物件管理員 (roles/storage.objectAdmin) 或等同的角色,可存取作業範圍內的所有 bucket 和物件。如需授予角色的操作說明,請參閱「使用 IAM 權限」。
後續步驟
- 在 Cloud Storage 常見問題中尋找其他問題的答案。
- 瞭解可用的支援選項。
- 瞭解如何使用 Error Reporting 找出並瞭解 Cloud Storage 錯誤。