使用跨 bucket 複製作業

本頁面概略說明跨 bucket 複製功能,並提供使用說明。

跨 bucket 複製作業總覽

在某些情況下,您可能需要將資料從一個 Cloud Storage bucket 複製到另一個 bucket。跨 bucket 複製功能會以非同步方式,將來源 bucket 中新增和更新的物件複製到目的地 bucket。

跨 bucket 複製與預設複製和加速複製不同,資料會存在兩個 bucket 中,每個 bucket 都有自己的設定,例如儲存位置、加密、存取權和儲存空間級別。因此,除了資料復原和可用性,這項服務也適用於:

  • 資料主權:在地理位置相距遙遠的區域之間維護資料。
  • 區分開發和正式版:建立不同的 bucket 和命名空間,確保開發作業不會影響正式版工作負載。
  • 共用資料:將資料複製到供應商或合作夥伴擁有的 bucket。
  • 資料匯總:將不同 bucket 的資料合併到單一 bucket,以便執行數據分析工作負載。
  • 管理成本、安全性和法規遵循:依據不同的擁有權、儲存空間級別和保留期限維護資料。

跨 bucket 複製作業會使用 Storage 移轉服務複製物件,並透過 Pub/Sub 接收來源和目的地 bucket 的變更通知。您可以在新建和現有的 bucket 啟用跨 bucket 複製功能。大多數物件可在幾分鐘內複製完成,但大於 1 GiB 的物件可能需要數小時。

限制

  • 跨 bucket 複製工作不支援自訂名稱。如果建立要求包含 name 欄位的值,則會傳回錯誤。

  • 階層命名空間 bucket 或可用區 bucket 不支援跨 bucket 複製。

  • 來源 bucket 中刪除的物件不會複製到目的地 bucket。

  • 物件生命週期設定不會複製。

  • 複製物件時,系統不會保留時間戳記中繼資料 (例如 timeCreated 和 timeUpdated)。如要進一步瞭解中繼資料保留,請參閱「在 Cloud Storage bucket 之間移轉資料」。

  • 跨 bucket 複製功能可用於在任何 Google Cloud 位置的 bucket 之間複製資料,因此跨 bucket 複製效能會因所選位置而異。因此,跨 bucket 複製功能不提供復原點目標 (RPO)。

  • 建立複製工作時,bucket 中已有的物件不會自動複製。系統只會複製新物件和更新後的物件。如要複製現有物件,請建立一次性 Storage 移轉服務移轉工作,將現有 bucket 移轉至新 bucket。如需操作說明,請參閱「建立移轉作業」。

  • 跨 bucket 複製功能只會複製使用中物件的建立和更新作業,不會複製非現行物件版本。如要在一次性遷移期間移轉現有的非現行版本,請按照「處理版本化物件」一節所述,使用物件資訊清單。

事前準備

開始前,請先完成下列步驟。

啟用 Storage 移轉服務 API

如果您尚未啟用 Storage 移轉服務 API,請啟用。

取得必要角色

如要取得使用跨 bucket 複製功能所需的權限,請要求管理員在建立複製工作的專案中,授予您下列 IAM 角色:

這些預先定義的角色具備使用跨 bucket 複製功能所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

必須具備下列權限,才能使用跨 bucket 複製功能:

  • 建立、執行及更新工作:
    • storagetransfer.jobs.create
    • storagetransfer.jobs.get
    • storagetransfer.jobs.list
    • storagetransfer.jobs.run
    • storagetransfer.jobs.update
  • 刪除工作:storagetransfer.jobs.delete

如要瞭解如何授予 bucket 角色,請參閱「搭配使用 IAM 與 bucket」。如要瞭解如何授予專案角色,請參閱「管理專案存取權」。

授予必要角色

跨 bucket 複製功能會使用 Storage 移轉服務,將物件從來源 bucket 複製到目的地 bucket,並使用 Pub/Sub 接收來源 bucket 的變更通知。

為確保跨 bucket 複製作業能使用這些服務,您必須將必要權限授予 Storage 移轉服務用於複製資料的服務帳戶,以及 Pub/Sub 用於寫入通知的服務代理。

授予 Storage 移轉服務必要角色

使用 Storage 移轉服務複製資料時,可將必要權限授予下列其中一個服務帳戶。以下任一項:

  • Storage 移轉服務服務代理,由 Google 自動建立及管理。這個服務代理的電子郵件地址採用 project-PROJECT_NUMBER@storage-transfer-service. 命名格式。您可以使用 Storage 移轉服務 googleServiceAccounts.get API,取得 Storage 移轉服務服務代理的電子郵件地址。

或:

  • 使用者自行管理的服務帳戶。這個服務帳戶的電子郵件地址採用 SERVICE_ACCOUNT_NAME@PROJECT_ID. 命名格式。您可以建立自己的服務帳戶,並授予複製資料所需的權限。

    如要瞭解如何搭配使用使用者管理的服務帳戶與 Storage 移轉服務,請參閱「將服務代理權限委派給使用者管理的服務帳戶」。除了下列清單中的權限外,您還需要其他權限。具體來說,您必須指派服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator),將使用者管理的服務帳戶存取權授予服務代理。請參閱「將存取權授予服務代理」。

Storage 移轉服務代理或使用者服務帳戶必須具備下列權限,才能複製物件,並為來源 bucket 設定 Pub/Sub 通知:

所需權限

必須授予來源專案下列權限:

  • pubsub.topics.create
  • pubsub.subscriptions.create
  • pubsub.subscriptions.consume

必須授予來源 bucket 的下列權限:

  • storage.buckets.get
  • storage.buckets.update
  • storage.objects.get

目的地 bucket 必須具備下列權限:

  • storage.buckets.get
  • storage.objects.create
  • storage.objects.get

您可以透過自訂角色授予這些權限,或授予下列所有預先定義的角色:

  • 來源專案的 Pub/Sub 編輯者 (roles/pubsub.editor) 角色
  • 來源 bucket 的 Storage 舊版 bucket 擁有者 (roles/storage.legacyBucketOwner) 和 Storage 物件檢視者 (roles/storage.objectViewer) 角色
  • 目的地 bucket 的 Storage 物件使用者 (roles/storage.objectUser) 和 Storage 舊版 bucket 讀取者 (roles/storage.legacyBucketReader) 角色

授予 Pub/Sub 的必要角色

Cloud Storage 會使用服務代理管理 Pub/Sub 通知。這個服務代理的電子郵件地址採用 service-PROJECT_NUMBER@gs-project-accounts. 命名格式。

Cloud Storage 服務代理需要下列權限,才能設定 Pub/Sub 並將訊息發布至主題:

所需權限
  • Pub/Sub 主題的 pubsub.topics.publish

您可以透過自訂角色或授予下列預先定義的角色,來授予這些權限:

  • 來源專案的 Pub/Sub 發布者 (roles/pubsub.publisher)

建立複製工作

控制台

如需 Google Cloud 控制台操作說明,瞭解如何建立複製工作,請參閱「使用 Google Cloud 控制台建立複製工作」。

指令列

使用 Google Cloud CLI 時,您可以為現有 bucket 建立複製工作。

如要建立複製工作,請使用 gcloud alpha transfer jobs create 指令並加上 --replication 旗標:

gcloud alpha transfer jobs create gs://SOURCE_BUCKET_NAME gs://DESTINATION_BUCKET_NAME --replication

更改項目:

  • 將 SOURCE_BUCKET_NAME 替換為要複製的來源 bucket 名稱。例如:my-source-bucket。

  • DESTINATION_BUCKET_NAME 替換為目的地 bucket 的名稱。例如:my-destination-bucket。

請注意,跨 bucket 複製工作不支援 --name 旗標。

REST API

JSON API

使用 JSON API 時,您可以為現有 bucket 建立複製工作。

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. 建立 JSON 檔案,其中包含 TransferJob 物件和已初始化的 ReplicationSpec 資源:

    TransferJob {
     ReplicationSpec: {
       "gcsDataSource": {
         "bucketName": "SOURCE_BUCKET_NAME"
       },
       "gcsDataSink" {
         "bucketName": "DESTINATION_BUCKET_NAME"
       },
       "objectConditions": {
       },
       "transferOptions": {
         "overwriteWhen": "OVERWRITE_OPTION"
       }
     }
     ...
    }

    更改項目:

    • SOURCE_BUCKET_NAME 替換為來源 bucket 的名稱,該 bucket 包含要複製的物件。例如:example-source-bucket。

    • DESTINATION_BUCKET_NAME 替換為要複製物件的目的地 bucket 名稱。例如:example-destination-bucket。

    • OVERWRITE_OPTION,並可選擇如何因應複製工作覆寫目的地 bucket 中現有物件的情況 (目的地物件和來源物件名稱相同時,可能會發生這種情況)。這個值必須是下列其中一項:

      • ALWAYS:一律覆寫目的地 bucket 中的物件

      • DIFFERENT:只有在目的地物件資料與來源物件資料不同時,才覆寫目的地 bucket 中的物件

      • NEVER:一律不覆寫目的地 bucket 中的物件

    請注意,跨 bucket 複製工作不支援 name 欄位。

  3. 使用 cURL 透過 transferJobs.create 要求呼叫 Storage 移轉服務 REST API:

    curl -X POST --data-binary @JSON_FILE_NAME \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs"

    更改下列內容:

    • JSON_FILE_NAME 是您在步驟 2 建立的 JSON 檔案名稱。

如要查看複製工作的狀態,請查看 Storage 移轉服務的 Cloud Logging 服務記錄。

列出複製工作

控制台

如需 Google Cloud 控制台操作說明,瞭解如何列出複製工作,請參閱「使用 Google Cloud 控制台列出複製工作」。

指令列

使用 gcloud alpha transfer jobs list 指令,並加上 --job-type 旗標:

gcloud alpha transfer jobs list --job-type=replication

REST API

JSON API

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. 使用 cURL 透過 transferJobs.list 要求呼叫 Storage 移轉服務 REST API:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs"

查看複製工作

控制台

如需 Google Cloud 控制台操作說明,瞭解如何查看複製工作,請參閱「使用 Google Cloud 控制台查看複製工作」。

指令列

使用 gcloud alpha transfer jobs describe 指令:

gcloud alpha transfer jobs describe JOB_NAME

更改項目:

  • 將 JOB_NAME 替換為複製工作的專屬 ID。例如,1234567890。如要找出移轉工作的 ID,請列出複製工作。

REST API

JSON API

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. 使用 cURL 透過 transferJobs.get 要求呼叫 Storage 移轉服務 REST API:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs/JOB_NAME"

    更改項目:

    • JOB_NAME:複製工作的專屬 ID。例如,1234567890。如要找出複製工作的 ID,請列出複製工作。

更新複製工作

您可以更新複製工作的下列欄位:

  • 複製工作的說明
  • 執行複製工作的設定
  • 發布至 Pub/Sub 的通知設定
  • 複製工作作業的記錄行為
  • 複製工作的狀態 (已啟用、已停用或已刪除)

控制台

如需 Google Cloud 控制台操作說明,瞭解如何更新複製工作,請參閱「使用 Google Cloud 控制台更新複製工作」。

指令列

使用 gcloud alpha transfer jobs update 指令,並搭配旗標來控制要更新的複製工作屬性。如需可能旗標的清單,請參閱 gcloud alpha transfer jobs update 說明文件。

舉例來說,如要更新複製工作的物件覆寫行為,請執行 gcloud alpha transfer jobs update 指令並加上 --overwrite-when 旗標:

gcloud alpha transfer jobs update JOB_NAME --overwrite-when=OVERWRITE_OPTION

更改項目:

  • 將 JOB_NAME 替換為複製工作的專屬 ID。例如,1234567890。如要找出移轉工作的 ID,請列出或查看移轉工作。

  • OVERWRITE_OPTION,並提供選項,可指定如何因應複製工作,覆寫目的地 bucket 中的現有物件。如果目的地物件和來源物件名稱相同,就可能發生這種情況。這個值必須是下列其中一項:

    • always:一律覆寫目的地物件。

    • different:只有在目的地物件資料與來源物件資料不同時,才覆寫目的地 bucket 中的物件。

    • never:一律不覆寫目的地物件。

REST API

JSON API

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. 建立 JSON 檔案,其中包含下列結構,包括要更新的 TransferJob 物件欄位:

    {
     "projectId": string,
     "transferJob": {
       object (TransferJob)
     },
       "updateTransferJobFieldMask": UPDATE_MASK
    }

    更改下列內容:

    • object (TransferJob) 會替換為要更新的複製工作欄位。詳情請參閱TransferJob 資源表示法。

    • UPDATE_MASK 是以半形逗號分隔的清單,列出要更新的欄位名稱。值可以是一或多個:description、transferSpec、notificationConfig、loggingConfig、status。

    如要進一步瞭解可加入的欄位名稱,請參閱 transferJobs.patch 要求主體。

  3. 使用 cURL 透過 transferJobs.patch 要求呼叫 Storage 移轉服務 REST API:

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs/JOB_NAME"

    更改項目:

    • JOB_NAME:複製工作的專屬 ID。例如,1234567890。如要找出複製工作的 ID,請列出複製工作。

刪除複製工作

控制台

如需 Google Cloud 控制台中有關如何刪除複製工作的操作說明,請參閱「使用 Google Cloud 控制台刪除複製工作」。

指令列

使用 gcloud alpha transfer jobs delete 指令:

gcloud alpha transfer jobs delete JOB_NAME

更改項目:

  • 將 JOB_NAME 替換為複製工作的專屬 ID。例如,1234567890。如要找出複製工作的 ID,請列出複製工作。

REST API

JSON API

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. 使用 cURL 透過 transferJobs.delete 要求呼叫 Storage 移轉服務 REST API:

    curl -X DELETE \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs/JOB_NAME"

    更改項目:

    • JOB_NAME:複製工作的專屬 ID。例如,1234567890。如要找出複製工作的 ID,請列出複製工作。