複製物件
複製允許您定義規則,以自動、非同步地將物件從源儲存桶複製到 同一帳戶 中的目標儲存桶。 此外,您也可以將物件從一個儲存桶複製到 不同帳戶 中的另一個儲存桶。
什麼是抄寫?
複製會將新建立的物件和物件更新從原始資料桶複製到目標資料桶。
- 只有新物件或現有物件的新版本(在複製規則新增到儲存桶後建立)才會複製到目標儲存桶。 現有的物件可以複 製到自己身上,建立複製的新版本。
- 來源物件的元資料會套用到複製的物件。
- 兩個儲存桶之間的雙向複製要求規則在兩個儲存桶上都處於活動狀態。
- 篩選器 (由前綴和/或標籤組成) 可用於設定複製規則的範圍,使其僅適用於某個物件子集。 單一原則中可定義多個規則,這些規則可指定不同的目的地。 以這種方式,同一個儲存桶中的不同物件可以複製到不同的目的地。
為何使用複製?
- 在不同地理位置的資料桶中保留一份資料副本。
- 透過定義複製規則,僅在允許的位置儲存複製品,以符合資料主權的合規規定。
- 保持生產與測試資料同步,因為複製會保留物件的元資料,例如最後修改時間、版本 ID 等。
- 透過為目標儲存桶定義不同的儲存類別和/或生命週期規則,為複製物件管理獨立於來源的儲存類別和生命週期政策。 同樣地,您也可以將儲存桶中的複製品儲存在單獨的服務實體甚至 IBM Cloud 帳戶中,同時也可以獨立控制對複製品的存取。
開始使用複製
要開始使用,以下是一些必須符合的先決條件:
- 在來源資料桶上設定
Writer或Manager平台角色,或指定具有適當複製動作的自訂角色 (例如cloud-object-storage.bucket.put_replication)。 - 您不需要擁有目標資料桶的存取權,但需要有足夠的平台角色來建立 新的 IAM 政策,允許源資料桶寫入目標資料桶。
- 目標磁碟桶不得啟用傳統磁碟桶防火牆,但可以使用 基於上下文的限制。
- 使用 SSE-C 加密的物件無法被複製,雖然 管理加密(SSE-KMS)如 Key Protect 與複製完全相容。
- 存檔狀態中的物件無法複製。
- 如果來源和目標儲存庫在不同的 IBM 帳戶中,請務必在每個帳戶中建立儲存庫。
- 在來源和目標儲存桶上啟用 版本控制。
由於版本化是複製的必要條件,因此不可能在以 不可變 Object Storage 政策 設定的儲存桶中複製物件。
使用一個 IBM 帳戶
若要在同一 IBM 帳戶的儲存桶之間複製物件,請執行下列步驟:
- 導覽到您選擇的來源儲存桶後,按一下組態索引標籤。
- 尋找 Bucket 複製,然後按一下設定複製按鈕。
- 選擇 Replication source(複製來源 ),然後按一下 Next(下一步 )。
- 從下拉式功能表中選擇實體和儲存桶。 或者,將選項按鈕切換為否並貼入目標水桶的 CRN。
- 按一下檢查權限按鈕。
現在,您需要在目標資料桶上授予來源資料桶 Writer 權限。 有幾種方法可以做到這一點,但最簡單的是使用 IBM Cloud Shell 和 IBM Cloud CLI。
- 在新視窗或選項卡中開啟 IBM Cloud Shell。
- 複製顯示在物件儲存主控台中的 IBM Cloud CLI 指令,並貼到新的 shell 中。
- 回到水桶設定視窗或索引標籤,再次按一下檢查權限按鈕。
現在您要建立複製規則。
- 確保規則狀態選項按鈕設為已啟用。
- 指定規則的名稱和優先順序,以及任何前綴或標籤篩選條件,以限制受複製規則限制的物件。
- 按一下完成。
使用不同的 IBM 帳戶
若要在不同 IBM 帳戶的儲存桶之間複製物件,請執行下列步驟:
- 在目的地 IBM 帳戶上設定 IAM 政策。 有關建立 IAM 政策的資訊,請參閱 什麼是 IAM 政策以及誰可以指派這些 政策。
- 在 Bucket Configuration 頁面上找到 CRN 格式的帳戶 ID 和服務實例 ID。
- 使用目的地帳戶的 IBM Cloud UI,按一下 Manage>Access**(IAM)**。
- 按一下左側面板中的驗證。
- 按一下「建立」以建立新的 IAM 政策。
- 授予服務授權頁面設定。 這是建立新 IAM 政策後的頁面。
- 選擇另一個帳戶,並提供來源帳戶的帳戶 ID。
- 提供服務存取 Cloud Object Storage.
- 在存取範圍中,選擇特定資源。
- 選擇來源服務實體,然後輸入源儲存桶的服務實體 ID。
- 在「目標」下,選擇 Cloud Object Storage 來存取來源儲存桶。
- 對於目標範圍,請選擇**特定資源>*服務實體。
- 從下拉式功能表中選擇目的地帳戶的服務實例 ID。
- 根據需要選擇角色 Object Writer 或 Writer。
物件寫入員角色足以啟用複製。
術語
來源儲存桶:已設定複製政策的儲存桶。 它是複製物件的來源。
目標儲存桶:在來源儲存桶複製政策中定義為目的地的儲存桶。 它是複製物件的目標。 也稱為「目的地」水桶。
複製:因向來源儲存桶提出請求而在目標儲存桶中建立的新物件。
複製什麼?
透過 CopyObject、PutObject 或 CompleteMultipartUpload 建立的新物件,會從來源儲存桶複製到目標儲存桶。 複製物件將從來源物件繼承下列元資料欄位:Etag, Last Modified Time, Version ID, user-attributes,和
Tags。
如果由複製政策設定,刪除標記將會被複製。
版本標籤的更新將從源資料桶複製到目標資料桶。
下列內容不會複製:
- 由生命週期事件啟動的行動
- 直接寫入存檔的物件
- 從存檔層級還原的物件
- 透過 SSE-C 加密的物件
- 物件 ACL
將複製用於業務連續性和災難恢復
複製可用於在服務中斷時提供服務的連續性:
- 確保源儲存桶和目標儲存桶位於不同位置。
- 驗證兩個儲存桶之間的物件最新版本是否同步。 工具,例如
Rclone(rclone check指令) 可以用來從指令行檢查同步性。 - 如果發生中斷,應用程式的流量可以重定向到目標資料桶。
一致性和資料完整性
雖然 IBM Cloud Object Storage 為所有資料 IO 作業提供了強大的一致性,但水桶組態最終會保持一致。 首次在儲存桶上啟用複製規則後,可能需要花一些時間才能讓設定傳遍整個系統,並開始複製新物件。
錯誤處理
複製失敗可能由多種原因引起,包括(但不限於)儲存桶設定錯誤、服務中斷、使用者與目標儲存桶的互動等。
COS 具備內建的容錯能力,可處理複製失敗的情況。 當發生失敗時,COS 可在長達 30 天內進行重試。 重試的頻率會因故障的性質而異。 舉例來說,由罕見的 I/O 錯誤所導致的失敗,可能會在數小時內重新嘗試;而因使用者儲存桶設定錯誤所導致的失敗,則可能每天重新嘗試一次。 若故障未能在 30 天內解決,系統將不再自動重新嘗試處理。 所有長期故障皆可透過 ListBucketReplicationFailures。
若您希望重新嘗試已超過 30 天的「過期」失敗案例,可透過 PutBucketReplicationFailureReattempt。
失敗的原因
在 ListBucketReplicationFailures API 的回應中,每個失敗元素都會提供 SyncFailureCause,其中列出最後已知的失敗原因。 下表說明了可能的原因:
| 原因 | 說明 |
|---|---|
| 目標儲存桶已停用版本控制功能 | 目標儲存桶未啟用版本控制功能。 使用者很可能是在設定複製功能後,才暫停了版本控制。 |
| 目標儲存桶不允許執行複製操作 | COS 服務無權代表使用者修改目標儲存桶。 請檢查 IAM 中來源與目標儲存桶資源之間是否仍存在服務對服務授權。 |
| 找不到遠端儲存桶 | 無法找到目標桶。 使用者可能已刪除目標儲存桶。 檢查目標儲存桶是否仍然存在。 |
| 來源/遠端儲存桶未找到或已停用 | 找不到該桶,或該桶處於無法使用的狀態。 檢查儲存桶是否仍然存在。 如果確實如此,請聯絡客戶支援。 |
| 找不到目標物件 | 嘗試重現元資料變更(例如標籤/物件鎖定),但目標物件不存在。 使用者很可能在變更尚未完成複製之前,就已刪除了目標儲存桶中的該物件。 |
| 找不到本地物件 | 嘗試進行複製時,找不到來源物件。 使用者很可能在寫入/修改來源物件後不久便將其刪除了。 |
| 目標儲存桶未啟用物件鎖定功能 | 嘗試在某個物件上套用 Object Lock 設定,但目標儲存桶並未啟用 Object Lock。 |
| 該加密金鑰目前處於非活躍狀態,或已被刪除 | COS 嘗試從 Key Protect 檢索加密金鑰(來源儲存桶已配置 SSE-KP/SSE-HPCS),但該金鑰已被刪除。 |
| 缺少 KMS 實例的端點資訊 | 無法取得讀取加密金鑰所需的金鑰管理服務端點。 若錯誤仍未解決,請聯絡客戶支援。 |
| 權限不足,無法查詢 KMS 端點資訊 | 來源儲存桶資源沒有權限查詢讀取加密金鑰所需的金鑰管理服務 (KMS) 端點。 請檢查您的 IAM 服務對服務授權政策。 |
| 內部錯誤 | 各種內部問題導致複製無法進行。 請聯絡客戶支援中心。 |
IAM 行動
有與複製相關的新 IAM 動作。
| IAM 行動 | 角色 |
|---|---|
cloud-object-storage.bucket.get_replication |
管理員、撰寫者、讀者 |
cloud-object-storage.bucket.put_replication |
管理員、撰寫者 |
cloud-object-storage.bucket.delete_replication |
管理員、撰寫者 |
cloud-object-storage.bucket.get_replication_failures |
管理員、撰寫者、讀者 |
cloud-object-storage.bucket.put_replication_reattempt |
管理員、撰寫者 |
Activity Tracker 事件
抄寫會產生其他事件。
| 事件動作 | 產生於 | 說明 |
|---|---|---|
| cloud-object-storage.bucket-replication.create | 來源儲存區 | 當使用者發出 PutBucketReplication API 請求時 |
| cloud-object-storage.bucket-replication.read | 來源儲存區 | 當使用者發出 GetBucketReplication API 請求時 |
| cloud-object-storage.bucket-replication.delete | 來源儲存區 | 當使用者發出 DeleteBucketReplication API 請求時 |
| cloud-object-storage.bucket-replication-failures.list | 來源儲存區 | 當使用者發出 ListBucketReplicationFailures API 請求時 |
| cloud-object-storage.bucket-replication-failures.update | 來源儲存區 | 當使用者發出 PutReplicationFailureReattempt API 請求時 |
| cloud-object-storage.object-replication.sync | 來源儲存區 | 當 COS 從來源儲存桶複製物件時 |
| cloud-object-storage.object-replication.create | 目標儲存區 | 當 COS 在目標儲存桶中建立新的複本版本時 |
| cloud-object-storage.object-replication.update | 目標儲存區 | 當 COS 在目標儲存桶的現有副本上複製元資料更新時 |
| cloud-object-storage.object-replication.delete | 目標儲存區 | 當 COS 複製目標儲存桶中的刪除標記時 |
對於 cloud-object-storage.bucket-replication.create 事件,下列欄位提供額外資訊:
| 欄位 | 說明 |
|---|---|
requestData.replication.num_sync_remote_buckets |
儲存區抄寫規則中指定的目標儲存區數目。 |
requestData.replication.failed_remote_sync |
抄寫檢查失敗的儲存區 CRN。 |
當抄寫作用中時,物件上的作業可能會產生下列額外資訊:
| 欄位 | 說明 |
|---|---|
requestData.replication.replication_throttled |
指出物件抄寫是否因節流控制機制而在來源上延遲。 |
requestData.replication.destination_bucket_id |
目標儲存區的 CRN。 |
requestData.replication.sync_type |
同步作業的類型。 - content 表示寫入物件資料_和_任何元資料到目標。- tag 表示複製物件標記。- retention 表示複製物件鎖保留設定。- legal_hold 表示複製物件鎖合法保留設定。- delete 表示寫入刪除標記到目標。 |
responseData.replication.source_bucket_id |
來源儲存區的 CRN。 |
responseData.replication.result |
值可以是 success、failure (指出伺服器錯誤)、user (指出使用者錯誤)。 |
responseData.replication.message |
HTTP 回應訊息 (例如 OK)。 |
您可以從物件寫入來源時開始追蹤物件,直到在目標上寫入為止。 搜尋與物件寫入相關聯的要求 ID,應該會出現三個事件:
- 原始
PUT。 - 來自來源的同步要求。
- 目標上的
PUT要求。
這三個遺漏中的任何一個都表示失敗。
使用情形和會計
所有抄本都是物件本身,且 提供使用情形 就像任何其他資料一樣。 順利完成抄寫會導致可計費 PUT、GET 及 HEAD 要求,雖然抄寫處理程序中所耗用的任何頻寬不會計費。
複製會產生額外的度量指標,供 IBM Cloud Monitoring 使用:
ibm_cos_bucket_replication_sync_requests_issuedibm_cos_bucket_replication_sync_requests_received
互動
版本化
版本化是啟用抄寫的必要項目。 在來源和目標儲存區上 啟用版本化 並在來源儲存區上配置抄寫之後,您可能會遇到下列問題:
- 如果您嘗試在來源儲存區上停用版本化,Object Storage 會傳回錯誤。 您必須先移除抄寫配置,才能在來源儲存區上停用版本化。
- 如果您在目標儲存區上停用版本化,則抄寫會失敗。
物件鎖定
啟用「物件鎖定」的功能,僅適用於已啟用「複製」功能的儲存桶。 當來源物件在啟用「物件鎖定」(保留和/或法律保留)的情況下建立,或對現有物件更新「物件鎖定」設定時,相關設定將會複製到目標位置。
只有當目標儲存桶已啟用「物件鎖定」功能時,才能進行物件鎖定複製。 因此,若來源儲存桶已啟用「物件鎖定」功能,建議您也在目標儲存桶上啟用此功能。
下表概述了當來源與目標儲存桶的「物件鎖定」設定不同時,其運作行為:
| 來源物件鎖定 | 目標物件鎖定 | 行為 |
|---|---|---|
| 已啟用 | 已啟用 | 來源端的所有物件鎖定狀態都將複製到目標端。 若來源物件是在未啟用「物件鎖定」的情況下建立的,則目標儲存桶的預設保留政策可能會套用至該副本。 物件鎖定複製遵循所有 S3 物件鎖定的限制。 例如,如果使用者已獨立對目標位置進行變更,系統絕不會縮短_合規_模式下複本的保留期限。 |
| 停用 | 啟用 | 來源物件不得具有「物件鎖定」功能,因此「物件鎖定」狀態絕不會從來源傳播至目標。 若目標儲存桶已設定預設保留期間,該設定將套用至新建立的複本。 |
| 啟用 | 停用 | 使用「物件鎖定」建立的來源物件將無法被複製。 COS 會對這些失敗的操作進行 重試,且一旦在目標儲存桶上啟用「物件鎖定」功能,這些操作即可被複製。 此外,針對現有物件的任何「物件鎖定」保留/法律保留更新,在目標位置啟用「物件鎖定」之前,亦無法進行複製。 未啟用「物件鎖定」功能所建立的來源物件,仍可進行複製。 |
Key Protect 加密
來源物件將 使用來源儲存區的根金鑰來加密,而抄本則使用目標儲存區的根金鑰來加密。
生命週期配置
如果在目標儲存區上啟用 生命週期原則,則生命週期動作將基於來源上物件的原始建立時間,而不是抄本在目標儲存區中變成可用的時間。
Immutable Object Storage
在已啟用 版本化 的儲存區上無法使用保留原則,而且由於版本化是抄寫的需求,因此無法在已啟用 Immutable Object Storage 的儲存區中來回抄寫物件。
舊式儲存區防火牆
使用 舊式防火牆來限制根據 IP 位址的存取權 的儲存區無法使用抄寫,因為抄寫物件的背景服務沒有固定 IP 位址且無法通過防火牆。
建議改為 使用環境定義型限制,以根據網路資訊來控制存取權。
Cloud Functions 和 Code Engine
配置抄寫此時不會提供 Cloud Functions 的觸發程式 或 Code Engine 事件,但物件寫入及刪除會同時為來源及目標儲存區建立 Object:Write 及 Object:Delete 通知。 這些事件會標註 notifications.replication_type 欄位,指出事件是否觸發同步,或由同步觸發。
抄寫現有物件
抄寫規則只能在將規則配置並套用至儲存區 之後 寫入的物件上運作。 如果儲存區中有應該抄寫的現有物件,則需要讓抄寫處理程序知道物件的存在。 透過使用 PUT copy 作業將物件複製到物件本身,可以輕鬆達成此目的。
此處理程序將重設部分物件 meta 資料,包括建立時間戳記。 這將影響生命週期原則以及使用建立或修改時間戳記 (例如內容遞送網路) 的任何其他服務。 確保適當地處理重設物件 meta 資料可能導致的任何中斷。
該程序涉及:
- 建立應該遵循抄寫規則之儲存區中所有物件的清單,
- 反覆運算該清單,在來源與要求目標相同的每一個物件上執行
PUT copy作業。
此範例只會抄寫 PUT copy 要求所建立物件的新版本。 為了抄寫物件的所有版本,也需要複製每一個個別版本。
下列範例以 Python撰寫,但演算法可以在任何程式設計語言或環境定義中套用。
import os
import sys
import ibm_boto3
from ibm_botocore.config import Config
# Create client connection
cos = ibm_boto3.client("s3",
ibm_api_key_id=os.environ.get('IBMCLOUD_API_KEY'),
ibm_service_instance_id=os.environ['SERVICE_INSTANCE_ID'],
config=Config(signature_version="oauth"),
endpoint_url=os.environ['US_GEO']
)
# Define the bucket with existing objects for replication
bucket = os.environ['BUCKET']
def copy_in_place(BUCKET_NAME):
print("Priming existing objects in " + bucket + " for replication...")
paginator = cos.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=bucket)
for page in pages:
for obj in page['Contents']:
key = obj['Key']
print(" * Copying " + key + " in place...")
try:
headers = cos.head_object(
Bucket=bucket,
Key=key
)
md = headers["Metadata"]
cos.copy_object(
CopySource={
'Bucket': bucket,
'Key': key
},
Bucket=bucket,
Key=key,
TaggingDirective='COPY',
MetadataDirective='REPLACE',
Metadata=md
)
print(" Success!")
except Exception as e:
print(" Unable to copy object: {0}".format(e))
print("Existing objects in " + bucket + " are now subject to replication rules.")
copy_in_place(bucket)
REST API 範例
下列範例使用 cURL 顯示以方便使用。 環境變數用來代表使用者特定的元素,例如 $BUCKET、$TOKEN 及 $REGION。 請注意,$REGION 也會包含任何網路類型規格,因此使用專用網路將要求傳送至 us-south 中的儲存區需要將變數設為 private.us-south。
在儲存區上啟用抄寫
抄寫配置在要求內文中以 XML 形式提供。 新要求將改寫儲存區上存在的任何現有抄寫規則。
抄寫配置必須至少包含一個規則,且最多可以包含 1,000 個規則。 每一個規則都會透過過濾來源儲存區中的物件,來識別要抄寫的物件子集。 若要選擇要抄寫的其他物件子集,請為每一個子集新增規則。
若要指定來源儲存區中要套用抄寫規則的物件子集,請新增 Filter 元素作為 Rule 元素的子項。 您可以根據物件索引鍵字首及/或一或多個物件標籤來過濾物件。 當您在配置中新增 Filter 元素時,也必須新增下列元素: DeleteMarkerReplication、Status 和 Priority。
選用標頭
| 標頭 | 類型 | 說明 |
|---|---|---|
Content-MD5 |
字串 | base64 對載荷進行了 128 位元 MD5 雜湊運算,此雜湊值用作完整性檢查,以確保載荷在傳輸過程中未遭篡改。 |
x-amz-checksum-crc32 |
字串 | 這個標頭是 Base64 編碼、32 位元 CRC32 物件的校驗和。 |
x-amz-checksum-crc32c |
字串 | 這個標頭是 Base64 編碼、32 位元 CRC32C 物件的校驗和。 |
x-amz-checksum-crc64nvme |
字串 | 這個標頭是 Base64 編碼、64 位元 CRC64NVME 物件的校驗和。 CRC64NVME 的校驗和永遠是完整物件的校驗和。 |
x-amz-checksum-sha1 |
字串 | 這個標頭是 Base64 編碼、160 位元的 SHA1 物件摘要。 |
x-amz-checksum-sha256 |
字串 | 這個標頭是 Base64 編碼、256 位元 SHA256 的物件摘要。 |
Content-MD5 標頭或 checksum 標頭 (包括 x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1, 或 x-amz-checksum-sha256)
必須作為有效負載的完整性檢查。 要求的內文必須包含具有下列綱目的 XML 區塊:
| 元素 | 類型 | 子項 | 上代 | 限制 |
|---|---|---|---|---|
ReplicationConfiguration |
容器 | Rule |
無 | 限制 1。 |
Rule |
容器 | ID, Status, Filter, DeleteMarkerReplication, Destination, Priority |
ReplicationConfiguration |
限制 1000。 |
ID |
字串 | 無 | Rule |
必須包含 (a-z,A-Z0-9) 以及以下符號:! _ . * ' ( ) - |
Destination |
容器 | Bucket |
Rule |
限制 1。 |
Bucket |
字串 | 無 | Destination |
目標儲存區的 CRN。 |
Priority |
整數 | 無 | Rule |
優先順序與每一個規則相關聯。 在某些情況下,多個規則可能適用於上傳的物件。 在這些狀況下,物件儲存體將在抄寫該物件時套用具有較高優先順序的適用規則。 因此,不論抄寫原則中有多少規則可能符合物件,都只能將單一抄寫規則套用至任何物件。 請注意,數字越高,優先順序越高。 |
Status |
字串 | 無 | Rule |
指定該規則是否已啟用。 有效值為 Enabled 或 Disabled。 |
DeleteMarkerReplication |
容器 | Status |
Rule |
限制 1。 |
Status |
字串 | 無 | DeleteMarkerReplication |
指定物件儲存體是否抄寫刪除標記。 有效值為 Enabled 或 Disabled。 |
Filter |
字串 | Prefix, Tag, AND |
Rule |
識別套用抄寫規則的物件子集的過濾器。 Filter 必須正好指定一個 Prefix、Tag 或 And 子元素。 |
Prefix |
字串 | 無 | Filter |
物件索引鍵名稱字首,可識別套用規則的物件子集。 |
Tag |
字串 | 無 | Filter |
用於指定標籤索引鍵和值的儲存器。 此規則僅適用於在其標籤集中具有標籤的物件。 |
And |
字串 | 無 | Filter |
用於指定規則過濾器的儲存器。 過濾器會決定套用規則的物件子集。 只有在您指定多個過濾器時,才需要此元素。 |
Key |
字串 | 無 | Tag |
標籤索引鍵。 |
Value |
字串 | 無 | Tag |
標籤值。 |
此範例將抄寫任何新物件,但不會抄寫刪除標記。
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Priority>1</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Disabled</Status>
</DeleteMarkerReplication>
<Filter/>
<Destination>
<Bucket>$DESTINATION_CRN</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
此範例會將任何索引鍵 (名稱) 開頭為 project_a/ 的物件抄寫至以 $DESTINATION_CRN_A 識別的儲存區,任何索引鍵 (名稱) 開頭為 project_b/ 的物件抄寫至以 $DESTINATION_CRN_B 識別的儲存區,以及任何具有索引鍵 Client 及值 ACME 之物件標籤的物件抄寫至以
$DESTINATION_CRN_C 識別的第三個儲存區,並在所有情況下抄寫刪除標記。
假設下列四個物件已新增至來源儲存區。 它們將抄寫至目標儲存區,如下所述:
project_a/foo.mp4project_a/bar.mp4project_b/baz.pdfproject_b/acme.pdf。這個第四個物件也有一個物件標籤,其索引鍵為Client,值為ACME。
由於下列規則,物件 1 和 2 將抄寫至 $DESTINATION_CRN_A。 物件 3 將抄寫至 $DESTINATION_CRN_B。 物件 4 將僅抄寫至 $DESTINATION_CRN_C,因為 ID 為 AcmeCorp 的規則具有比 ID 為 ProjectB 的規則更高的優先順序值,並且雖然它符合這兩個規則的需求,但將僅遵循前者。
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>ProjectA</ID>
<Priority>10</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_a/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_A</Bucket>
</Destination>
</Rule>
<Rule>
<ID>ProjectB</ID>
<Priority>5</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_b/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_B</Bucket>
</Destination>
</Rule>
<Rule>
<ID>AcmeCorp</ID>
<Priority>20</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Tag>
<Key>Client</Key>
<Value>ACME</Value>
</Tag>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_C</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
成功要求會傳回 200 回應。
檢視儲存區的抄寫配置
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
這會傳回具有適當綱目的 XML 回應主體:
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Status>ENABLED</Status>
<DeleteMarkerReplication>
<Status>DISABLED</Status>
</DeleteMarkerReplication>
<Destination>
<Bucket>crn:v1:bluemix:public:cloud-object-storage:global:a/9978e07eXXXXXXXX66c89c428028654:ef1c725e-XXXX-4967-bcc1-734c03a2b846:bucket:replication-destination</Bucket>
</Destination>
<Priority>1</Priority>
<Filter/>
</Rule>
</ReplicationConfiguration>
刪除儲存桶的複製設定
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
成功要求會傳回 204 回應。
列出某個儲存桶的複製失敗紀錄
使用 curl
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-failures" \
-H 'Authorization: bearer $TOKEN'
選用的查詢參數
| 名稱 | 類型 | 說明 |
|---|---|---|
| 編碼類型 | 字串 | 若物件名稱中使用了 XML 不支援的 Unicode 字元,可將此參數設定為 url,以正確編碼回應內容。 |
| max-keys | 字串 | 限制回應中顯示的失敗次數。 預設值及最大值為 1,000。 |
| 首次同步嘗試時間 | 字串 | 指定清單應從何時開始顯示,依時間倒序排列。 該時間對應於複製最初被觸發時(
|
| 續接標記 | 字串 | 指定清單應從哪個故障開始列出,並按時間倒序排列。 若在上一則清單請求所返回的項目之後還有更多項目,則此功能用於分頁。 |
回應範例
<ListReplicationFailureResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>example</Name>
<FirstSyncAttemptedBefore>2025-12-15T00:00:00.000Z</FirstSyncAttemptedBefore>
<MaxKeys>10</MaxKeys>
<IsTruncated>false</IsTruncated>
<EncodingType>false</EncodingType>
<KeyCount>2</KeyCount>
<Contents>
<Key>test-obj+*1765434016787</Key>
<VersionId>00000000-0000-0000-0000-019b0c114413</VersionId>
<SyncType>Content</SyncType>
<FirstSyncAttempted>2025-12-11T06:20:16.787Z</FirstSyncAttempted>
<LastSyncAttempted>2025-12-11T06:20:16.787Z</LastSyncAttempted>
<SyncFailureCause>Versioning disabled on destination bucket</SyncFailureCause>
</Contents>
<Contents>
<Key>test-obj+*1765434016786</Key>
<VersionId>00000000-0000-0000-0000-019b0c114412</VersionId>
<SyncType>Content</SyncType>
<FirstSyncAttempted>2025-12-11T06:20:16.786Z</FirstSyncAttempted>
<LastSyncAttempted>2025-12-11T06:20:16.786Z</LastSyncAttempted>
<SyncFailureCause>Replication operation not authorized on target bucket</SyncFailureCause>
</Contents>
</ListReplicationFailureResult>
回應元素
| 名稱 | 類型 | 說明 |
|---|---|---|
ListReplicationFailureResult |
容器 | 根層標籤 |
Name |
字串 | 正在列出的儲存桶名稱。 |
FirstSyncAttemptedBefore |
字串 | ISO-8601 所請求的日期與時間戳記 ?first-sync-attempted-before |
MaxKeys |
號碼 | 此商品頁面上所要求的最大鑰匙數量。 |
IsTruncated |
布林 | 當前的清單是否被截斷(即在該清單中回傳的最後一個元素之後,還有更多失敗的項目)。 若 true,則會始終提供 NextContinuationToken。 |
EncodingType |
字串 | 此商品頁面上所要求的編碼類型。 |
KeyCount |
號碼 | 此清單中回傳的故障元件數量。 |
ContinuationToken |
字串 | 為此列表所指定的續接標記。 |
NextContinuationToken |
字串 | 若當前清單被截斷,則此為分頁時應使用的下一個續接標記。 |
排程在儲存桶中重新嘗試已過期的複製失敗
此操作將排程重新嘗試所有複製失敗的處理,包括任何發生超過 30 天、且不再符合系統自動重試條件的「過期」失敗。 長期複製失敗的處理以 24 小時為一個週期進行。 發出此請求後,系統將安排在格林威治標準時間(GMT)下一個午夜開始的週期內,針對已過期的失敗項目進行重試。 舉例來說,若在 2026-01-01T01:00:00Z 發出請求,這些失敗狀況最早會在 2026-01-02T00:00:00Z 時被處理。 若請求成功,此時間戳記也會出現在回應標頭中:x-ibm-replication-reattempt-scheduled-time。
在格林威治標準時間(GMT)同一天內送達的多個請求(即導致相同的排程時間),具有冪等性。
每次過期的失敗都會以盡力而為的方式重新嘗試一次——這些操作將會被執行,但無法保證其執行時間。
使用 curl
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-reattempt" \
-H 'Authorization: bearer $TOKEN'
回應範例
HTTP/1.1 204 No Content
Connection: close
...
x-ibm-replication-reattempt-scheduled-time: Fri, 12 Dec 2025 00:00:00 GMT
SDK 範例
下列範例使用 IBM COS SDK for Python 及 Node.js,雖然物件版本化的實作應該與任何容許設定自訂端點的 S3-compatible 程式庫或工具完全相容。 使用協力廠商工具需要 HMAC 認證來計算 AWS V4 簽章。 如需 HMAC 認證的相關資訊,請參閱文件。
Python
使用 IBM COS SDK for Python 啟用版本化可以使用 低階用戶端 語法來完成。
使用用戶端:
#!/usr/bin/env python3
import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError
# Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')
BUCKET = "my-replication-bucket" # The bucket that will enable replication.
# Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
ibm_api_key_id=API_KEY,
ibm_service_instance_id=SERVICE_INSTANCE,
config=Config(signature_version="oauth"),
endpoint_url=ENDPOINT
)
response = cosClient.put_bucket_versioning(
Bucket=BUCKET,
ReplicationConfiguration={
'Rules': [
{
'ID': 'string',
'Priority': 123,
'Filter': {
'Prefix': 'string',
'Tag': {
'Key': 'string',
'Value': 'string'
},
'And': {
'Prefix': 'string',
'Tags': [
{
'Key': 'string',
'Value': 'string'
},
]
}
},
'Status': 'Enabled'|'Disabled',
'Destination': {
'Bucket': 'string',
},
'DeleteMarkerReplication': {
'Status': 'Enabled'|'Disabled'
}
},
]
}
)
列出使用相同用戶端的物件版本:
resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)
請注意,Python API 非常靈活,有許多不同的方法可達成相同的作業。
Node.js
使用 IBM COS SDK for Node.js 啟用版本化:
const IBM = require('ibm-cos-sdk');
var config = {
endpoint: '<endpoint>',
apiKeyId: '<api-key>',
serviceInstanceId: '<resource-instance-id>',
};
var cos = new IBM.S3(config);
var params = {
Bucket: 'STRING_VALUE', /* required */
ReplicationConfiguration: { /* required */
Role: 'STRING_VALUE', /* required */
Rules: [ /* required */
{
Destination: { /* required */
Bucket: 'STRING_VALUE', /* required */
},
Status: Enabled | Disabled, /* required */
Filter: {
And: {
Prefix: 'STRING_VALUE',
Tags: [
{
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
},
/* more items */
]
},
Prefix: 'STRING_VALUE',
Tag: {
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
}
},
ID: 'STRING_VALUE',
Prefix: 'STRING_VALUE',
Priority: 'NUMBER_VALUE',
}
}
]
},
ContentMD5: 'STRING_VALUE',
};
cos.putBucketReplication(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});