當儲存空間(Bucket)中的檔案(Object)數量達到數百萬甚至上百億時,通過 ListObjects 介面逐一列舉效率低且成本高。儲存空間清單功能通過非同步、定期掃描 Bucket,產生包含指定對象中繼資料(如大小、儲存類型等)的資訊清單檔,適用于海量對象的管理情境。
適用範圍
僅有地區屬性的Bucket支援開啟儲存空間清單功能。
如需使用增量清單功能,請聯絡支援人員申請,當前僅支援墨西哥地區。
使用情境
OSS 提供全量清單和增量清單。其中,全量清單是指對某一時間點 Bucket 內所有存量檔案的快照,增量清單則記錄了指定時間段內新增或變動的檔案中繼資料。全量清單和增量清單均可以按照一定周期產生資訊清單檔,並投遞到指定的 Bucket 進行轉存。可配置按周期產生一次全量清單,並且通常每 10 分鐘產生一次差異清查檔案。使用全量資訊清單檔和差異清查檔案的情境如下:
一次性的資料分析和統計情境:若僅需要對歷史檔案進行統計,可以配置全量清單建置規則,定期產生一次全量檔案中繼資料清單,用以離線的資料統計、資料分析。
持久性的資料分析和統計情境:不僅需要對歷史檔案進行統計分析,也需要對後續的增量檔案進行統計和分析,可以基於全量中繼資料清單和增量中繼資料清單構建統一的中繼資料表,如將存量和增量中繼資料均寫入到自建的 table 中,通過自己的 spark 叢集進行中繼資料檢索、查詢、統計和分析。
工作原理
全量清單:定期(每天或每周)為儲存空間中的對象產生一份完整的快照,其工作流程如下:
擷取許可權:OSS 通過扮演一個預先授權的 RAM 角色,來獲得掃描源Bucket和向目標 Bucket 寫入清單報告的許可權。
掃描對象:OSS 根據清單規則中定義的篩選條件(如對象首碼、版本狀態、建立時間或大小),掃描源 Bucket 中的所有匹配對象。
產生清單報告:OSS 將掃描結果彙總產生清單報告,並以 Gzip 壓縮的 CSV 檔案格式,寫入目標的 Bucket 中。
增量清單:通常以10分鐘為周期,捕獲並報告該時間視窗內發生的所有對象變更事件(包括建立、中繼資料更新、刪除),其工作流程如下:
擷取許可權:OSS 通過扮演一個預先授權的 RAM 角色,來獲得掃描源Bucket日誌和向目標 Bucket 寫入清單報告的許可權。
掃描對象:OSS 根據規則中定義的篩選條件(如對象首碼),掃描增量日誌中所有匹配的記錄。
產生清單報告:OSS 將掃描結果,以後端分區彙總的方式,產生清單報告,以CSV格式寫入指定的目標Bucket 中。
建立清單規則後,OSS 會周期自動執行清單任務,該任務在後台非同步運行,不影響對 Bucket 的正常訪問。
建立並授權服務角色
OSS 清單服務需要通過扮演 RAM 角色來獲得讀取源 Bucket和寫入目標 Bucket的許可權。為確保賬戶安全,建議遵循最小許可權原則,為清單功能建立專用的服務角色。
通過控制台快速配置清單時,系統會引導自動建立名為AliyunOSSRole的角色,可直接使用預設角色,無需自行建立服務角色。但此角色擁有對賬戶下所有 Bucket 的完全系統管理權限,不建議在生產環境中使用AliyunOSSRole。
以下是手動建立最小許可權角色的步驟:
建立RAM角色:進入建立RAM角色頁面。信任主體類型選擇雲端服務,信任主體名稱選擇Object Storage Service。
為RAM角色授予寫入目標 Bucket 的許可權:
在建立權限原則頁面,單擊指令碼編輯頁簽。將以下策略內容粘貼到策略編輯器中,並將
dest-bucket替換為實際的源Bucket名稱。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": [ "acs:oss:*:*:dest-bucket/*" ] } ] }(可選)配置 KMS 加密許可權:如果清單報告需要使用 KMS 祕密金鑰加密,還需為該 RAM 角色授予
AliyunKMSCryptoUserAccess許可權或更精細的 KMS 相關許可權。在授權頁面,單擊新增授權,授權主體選擇建立的RAM角色,權限原則選擇剛建立的策略,然後單擊確認新增授權。
記錄角色ARN:在角色頁面找到建立RAM角色,進入基本資料頁面,複製角色的ARN用於建立清單規則。格式為
acs:ram::{源帳號UID}:role/{角色名稱}。
全量清單
全量清單會定期掃描並匯出Bucket中所有(或指定首碼下所有)對象的完整列表。請注意:
報告快照:清單報告反映的是掃描任務啟動時的對象狀態。掃描過程需要時間,此期間的對象變更(如新增、刪除)不保證會包含在本次報告中。
首份清單會在配置後立即執行,後續按設定的每日或每周的周期在北京時間淩晨批量執行,匯出延遲受對象數量與任務隊列影響。
配置清單規則
控制台
登入 OSS 管理主控台。
進入需要產生清單的源 Bucket,在左側導覽列選擇 資料管理 > Bucket 清單。
在Bucket 清單頁面,單擊建立清單。
在設定清單報告規則面板,配置以下參數:
參數
說明
狀態
設定清單任務的狀態,選擇啟動。
規則名稱
設定清單任務的名稱。只能包含小寫字母、數字、短劃線(-),且不能以短劃線(-)開頭或結尾。
清單報告儲存至
設定清單報告的儲存路徑。配置清單的 Bucket 與存放清單 Bucket 必須同帳號、同地區。
若需將報告儲存到儲存空間 examplebucket 的 exampledir1 路徑,請填寫
exampledir1/,指定路徑在 Bucket 中不存在時,OSS 會自動建立該路徑。若留空,報告將儲存在根目錄。
重要為避免影響OSS-HDFS服務的正常使用或者引發資料汙染的風險,在開通了OSS-HDFS服務的Bucket設定清單報告規則時,禁止將清單報告目錄填寫為
.dlsdata/。資訊清單檔掃描範圍
掃描整個Bucket:掃描整個 Bucket的所有檔案。
按首碼匹配:用於僅掃描指定首碼下的檔案,例如 exampledir1/。
清單報告加密選項
選擇是否加密資訊清單檔。
無:不加密。
AES256:使用AES256密碼編譯演算法加密資訊清單檔。
KMS:使用KMS祕密金鑰加密資訊清單檔,可以選擇使用OSS託管的KMS密鑰或在KMS平台建立一個與目標Bucket相同地區的KMS密鑰。
清單報告匯出周期
設定清單報告的組建循環。可選擇每周、每天、單次匯出。檔案數超百億時,建議選擇每周以降低成本和掃描壓力。
清單內容
選擇希望匯出的檔案資訊:
系統中繼資料:Object大小、儲存類型、最後更新日期、ETag、TransitionTime、分區上傳狀態、加密狀態、Object ACL、檔案類型、CRC64。
自訂中繼資料:標籤個數
配置進階篩選功能
重要僅華北1(青島)、華北5(呼和浩特)和德國(法蘭克福)地區支援配置以下過濾選項。
如果需要根據檔案大小、儲存類型等條件過濾匯出的檔案,需要開啟配置進階篩選功能開關。
支援的過濾選項說明如下:
時間範圍:設定待匯出檔案最後一次修改的起始日期和結束日期,時間精確到秒。
檔案大小範圍:設定待匯出檔案的檔案大小最小值和最大值。
重要設定檔案大小範圍時,確保檔案大小的最小值以及最大值均大於0 B,且最大值不能超過48.8 TB。
儲存類型:設定待匯出哪些儲存類型的檔案。可以選擇匯出標準儲存、低頻訪問、Archive Storage、冷Archive Storage以及深度冷Archive Storage的檔案。
對象版本
若 Bucket 開啟了版本控制,可選擇匯出目前的版本或所有版本。
選中我知曉並同意授予阿里雲 OSS 服務訪問 Bucket 資源的許可權,然後單擊確定。
涉及Object較多時,產生資訊清單檔需要一定的時間。可以通過兩種方式判斷是否已產生資訊清單檔,詳情請參見如何判斷是否已產生資訊清單檔?。
SDK
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫存放清單結果的Bucket名稱。
String destBucketName ="yourDestinationBucketName";
// 填寫Bucket所有者授予的賬戶ID。
String accountId ="yourDestinationBucketAccountId";
// 填寫具有讀取源Bucket所有檔案和向目標Bucket寫入檔案許可權的角色名稱。
String roleArn ="yourDestinationBucketRoleArn";
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 建立清單配置。
InventoryConfiguration inventoryConfiguration = new InventoryConfiguration();
// 設定清單規則名稱。
String inventoryId = "testid";
inventoryConfiguration.setInventoryId(inventoryId);
// 設定清單中包含的Object屬性。
List<String> fields = new ArrayList<String>();
fields.add(InventoryOptionalFields.Size);
fields.add(InventoryOptionalFields.LastModifiedDate);
fields.add(InventoryOptionalFields.IsMultipartUploaded);
fields.add(InventoryOptionalFields.StorageClass);
fields.add(InventoryOptionalFields.ETag);
fields.add(InventoryOptionalFields.EncryptionStatus);
inventoryConfiguration.setOptionalFields(fields);
// 設定清單的產生計劃,以下樣本為每周一次。其中,Weekly表示每周一次,Daily表示每天一次。
inventoryConfiguration.setSchedule(new InventorySchedule().withFrequency(InventoryFrequency.Weekly));
// 設定清單中包含的Object的版本為目前的版本。如果設定為InventoryIncludedObjectVersions.All則表示Object的所有版本在版本控制狀態下生效。
inventoryConfiguration.setIncludedObjectVersions(InventoryIncludedObjectVersions.Current);
// 清單配置是否啟用的標識,取值為true或者false,設定為true表示啟用清單配置,設定為false表示關閉清單配置。
inventoryConfiguration.setEnabled(true);
// 設定清單篩選規則,指定篩選Object的首碼。
InventoryFilter inventoryFilter = new InventoryFilter().withPrefix("obj-prefix");
inventoryConfiguration.setInventoryFilter(inventoryFilter);
// 建立存放清單結果的目標Bucket配置。
InventoryOSSBucketDestination ossInvDest = new InventoryOSSBucketDestination();
// 設定存放清單結果的儲存路徑首碼。
ossInvDest.setPrefix("destination-prefix");
// 設定清單格式。
ossInvDest.setFormat(InventoryFormat.CSV);
// 設定目標Bucket的使用者accountId。
ossInvDest.setAccountId(accountId);
// 設定目標Bucket的roleArn。
ossInvDest.setRoleArn(roleArn);
// 設定目標Bucket的名稱。
ossInvDest.setBucket(destBucketName);
// 如果需要使用KMS加密清單,請參考如下設定。
// InventoryEncryption inventoryEncryption = new InventoryEncryption();
// InventoryServerSideEncryptionKMS serverSideKmsEncryption = new InventoryServerSideEncryptionKMS().withKeyId("test-kms-id");
// inventoryEncryption.setServerSideKmsEncryption(serverSideKmsEncryption);
// ossInvDest.setEncryption(inventoryEncryption);
// 如果需要使用OSS服務端加密清單,請參考如下設定。
// InventoryEncryption inventoryEncryption = new InventoryEncryption();
// inventoryEncryption.setServerSideOssEncryption(new InventoryServerSideEncryptionOSS());
// ossInvDest.setEncryption(inventoryEncryption);
// 設定清單的目的地。
InventoryDestination destination = new InventoryDestination();
destination.setOssBucketDestination(ossInvDest);
inventoryConfiguration.setDestination(destination);
// 上傳清單配置。
ossClient.setBucketInventoryConfiguration(bucketName, inventoryConfiguration);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫儲存空間名稱。
bucket: 'yourbucketname'
});
const inventory = {
// 設定清單配置ID。
id: 'default',
// 清單配置是否啟用的標識,取值為true或false。
isEnabled: false,
//(可選)設定清單篩選規則,指定篩選object的首碼。
prefix: 'ttt',
OSSBucketDestination: {
// 設定清單格式。
format: 'CSV',
// 目標Bucket擁有者的帳號ID。
accountId: '<Your AccountId>',
// 目標Bucket的角色名稱。
rolename: 'AliyunOSSRole',
// 目標Bucket的名稱。
bucket: '<Your BucketName>',
//(可選)清單結果的儲存路徑首碼。
prefix: '<Your Prefix>',
// 如果需要使用SSE-OSS加密清單,請參考以下代碼。
//encryption: {'SSE-OSS': ''},
// 如果需要使用SSE-KMS加密清單,請參考以下代碼。
/*
encryption: {
'SSE-KMS': {
keyId: 'test-kms-id',
};,
*/
},
// 設定清單的產生計劃,WEEKLY對應每周一次,DAILY對應每天一次。
frequency: 'Daily',
// 設定清單結果中包含了Object的所有版本, 如果設定為Current,則表示僅包含Object的目前的版本。
includedObjectVersions: 'All',
optionalFields: {
//(可選)設定清單中包含的Object屬性。
field: ["Size", "LastModifiedDate", "ETag", "StorageClass", "IsMultipartUploaded", "EncryptionStatus"]
},
}
async function putInventory(){
// 需要添加清單配置的Bucket名稱。
const bucket = '<Your BucketName>';
try {
await client.putBucketInventory(bucket, inventory);
console.log('清單配置添加成功')
} catch(err) {
console.log('清單配置添加失敗: ', err);
}
}
putInventory()import argparse
import alibabacloud_oss_v2 as oss
# 建立命令列參數解析器,並描述指令碼用途:設定儲存空間清單(Inventory)
parser = argparse.ArgumentParser(description="put bucket inventory sample")
# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、使用者ID、角色ARN以及清單名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--user_id', help='User account ID.', required=True)
parser.add_argument('--arn', help='The Alibaba Cloud Resource Name (ARN) of the role that has the permissions to read all objects from the source bucket and write objects to the destination bucket. Format: `acs:ram::uid:role/rolename`.', required=True)
parser.add_argument('--inventory_id', help='The name of the inventory.', required=True)
def main():
# 解析命令列參數,擷取使用者輸入的值
args = parser.parse_args()
# 從環境變數中載入訪問憑證資訊,用於身分識別驗證
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 使用SDK預設配置建立設定物件,並設定認證提供者
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定設定物件的地區屬性,根據使用者提供的命令列參數
cfg.region = args.region
# 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 使用上述配置初始化OSS用戶端,準備與OSS互動
client = oss.Client(cfg)
# 發送請求以配置指定儲存空間的清單設定
result = client.put_bucket_inventory(oss.PutBucketInventoryRequest(
bucket=args.bucket, # 儲存空間名
inventory_id=args.inventory_id, # 儲存空間清單ID
inventory_configuration=oss.InventoryConfiguration(
included_object_versions='All', # 包含所有版本的對象
optional_fields=oss.OptionalFields(
fields=[ # 可選欄位,如大小和最後修改日期
oss.InventoryOptionalFieldType.SIZE,
oss.InventoryOptionalFieldType.LAST_MODIFIED_DATE,
],
),
id=args.inventory_id, # 儲存空間清單ID
is_enabled=True, # 啟用儲存空間清單
destination=oss.InventoryDestination(
oss_bucket_destination=oss.InventoryOSSBucketDestination(
format=oss.InventoryFormatType.CSV, # 輸出格式為CSV
account_id=args.user_id, # 使用者賬戶ID
role_arn=args.arn, # 角色ARN,具有讀取源儲存空間和寫入目標儲存空間的許可權
bucket=f'acs:oss:::{args.bucket}', # 目標儲存空間
prefix='aaa', # 資訊清單檔首碼
),
),
schedule=oss.InventorySchedule(
frequency=oss.InventoryFrequencyType.DAILY, # 清單頻率,這裡設定為每天
),
filter=oss.InventoryFilter(
lower_size_bound=1024, # 對象大小下限(位元組)
upper_size_bound=1048576, # 對象大小上限(位元組)
storage_class='ColdArchive', # 儲存類別篩選條件
prefix='aaa', # 對象首碼篩選條件
last_modify_begin_time_stamp=1637883649, # 最後修改時間戳記開始範圍
last_modify_end_time_stamp=1638347592, # 最後修改時間戳記結束範圍
),
),
))
# 列印操作結果的狀態代碼和請求ID,以便確認請求狀態
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
main() # 指令碼進入點,控製程序流程從這裡開始using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱。
var bucketName = "examplebucket";
// 填寫Bucket所有者授予的賬戶ID。
var accountId ="yourDestinationBucketAccountId";
// 填寫具有讀取源Bucket所有檔案和向目標Bucket寫入檔案許可權的角色名稱。
var roleArn ="yourDestinationBucketRoleArn";
// 填寫存放清單結果的Bucket名稱。
var destBucketName ="yourDestinationBucketName";
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();
// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// 添加Bucket清單。
var config = new InventoryConfiguration();
// 設定清單規則名稱。
config.Id = "report1";
// 清單配置是否啟用的標識,取值為true或false。設定為true,表示啟用清單配置。
config.IsEnabled = true;
// 設定清單篩選規則,指定篩選Object的首碼。
config.Filter = new InventoryFilter("filterPrefix");
// 建立清單的bucket目的地配置。
config.Destination = new InventoryDestination();
config.Destination.OSSBucketDestination = new InventoryOSSBucketDestination();
// 設定清單格式。
config.Destination.OSSBucketDestination.Format = InventoryFormat.CSV;
// 存放清單結果的目標Bucket的使用者accountId。
config.Destination.OSSBucketDestination.AccountId = accountId;
// 存放清單結果的目標Bucket的roleArn。
config.Destination.OSSBucketDestination.RoleArn = roleArn;
// 存放清單結果的目標Bucket名稱。
config.Destination.OSSBucketDestination.Bucket = destBucketName;
// 設定存放清單結果的儲存路徑首碼。
config.Destination.OSSBucketDestination.Prefix = "prefix1";
// 設定清單的產生計劃,以下樣本為每周一次。其中,Weekly對應每周一次,Daily對應每天一次。
config.Schedule = new InventorySchedule(InventoryFrequency.Daily);
// 設定清單中包含的object的版本為目前的版本。如果設定為InventoryIncludedObjectVersions.All則表示object的所有版本,在版本控制狀態下生效。
config.IncludedObjectVersions = InventoryIncludedObjectVersions.All;
// 設定清單中包含的Object屬性。
config.OptionalFields.Add(InventoryOptionalField.Size);
config.OptionalFields.Add(InventoryOptionalField.LastModifiedDate);
config.OptionalFields.Add(InventoryOptionalField.StorageClass);
config.OptionalFields.Add(InventoryOptionalField.IsMultipartUploaded);
config.OptionalFields.Add(InventoryOptionalField.EncryptionStatus);
config.OptionalFields.Add(InventoryOptionalField.ETag);
var req = new SetBucketInventoryConfigurationRequest(bucketName, config);
client.SetBucketInventoryConfiguration(req);
Console.WriteLine("Set bucket:{0} InventoryConfiguration succeeded", bucketName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS帳號資訊。*/
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
InventoryConfiguration inventoryConf;
/* 指定清單規則名稱,該名稱在當前Bucket下必須全域唯一。*/
inventoryConf.setId("inventoryId");
/* 清單配置是否啟用的標識,可選值為true或false。*/
inventoryConf.setIsEnabled(true);
/* (可選)清單篩選的首碼。指定首碼後,清單將篩選出符合首碼的Object。*/
inventoryConf.setFilter(InventoryFilter("objectPrefix"));
InventoryOSSBucketDestination dest;
/* 匯出資訊清單檔的檔案格式。*/
dest.setFormat(InventoryFormat::CSV);
/* 儲存空間擁有者的賬戶UID。*/
dest.setAccountId("10988548********");
/* 指定角色名稱,該角色需要擁有讀取源儲存空間所有檔案以及向目標儲存空間寫入檔案的許可權,格式為acs:ram::uid:role/rolename。*/
dest.setRoleArn("acs:ram::10988548********:role/inventory-test");
/* 存放匯出的資訊清單檔的儲存空間。*/
dest.setBucket("yourDstBucketName");
/* 資訊清單檔的儲存路徑首碼。*/
dest.setPrefix("yourPrefix");
/* (可選)資訊清單檔的加密方式, 可選SSEOSS或者SSEKMS方式加密。*/
//dest.setEncryption(InventoryEncryption(InventorySSEOSS()));
//dest.setEncryption(InventoryEncryption(InventorySSEKMS("yourKmskeyId")));
inventoryConf.setDestination(dest);
/* 資訊清單檔匯出的周期, 可選為Daily或者Weekly。*/
inventoryConf.setSchedule(InventoryFrequency::Daily);
/* 是否在清單中包含Object版本資訊, 可選為All或者Current。*/
inventoryConf.setIncludedObjectVersions(InventoryIncludedObjectVersions::All);
/* (可選)設定清單結果中應包含的配置項, 請按需配置。*/
InventoryOptionalFields field {
InventoryOptionalField::Size, InventoryOptionalField::LastModifiedDate,
InventoryOptionalField::ETag, InventoryOptionalField::StorageClass,
InventoryOptionalField::IsMultipartUploaded, InventoryOptionalField::EncryptionStatus
};
inventoryConf.setOptionalFields(field);
/* 設定清單配置。*/
auto outcome = client.SetBucketInventoryConfiguration(
SetBucketInventoryConfigurationRequest(BucketName, inventoryConf));
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "Set Bucket Inventory fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
var (
accountId = "account id of the bucket" // 儲存空間所有者授予的賬戶ID,例如109885487000****
inventoryId = "inventory id" // 由使用者指定的清單名稱,清單名稱在當前Bucket下必須全域唯一
)
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立設定儲存空間清單的請求
putRequest := &oss.PutBucketInventoryRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
InventoryId: oss.Ptr(inventoryId), // 由使用者指定的清單名稱
InventoryConfiguration: &oss.InventoryConfiguration{
Id: oss.Ptr(inventoryId), // 由使用者指定的清單名稱
IsEnabled: oss.Ptr(true), // 啟用清單配置
Filter: &oss.InventoryFilter{
Prefix: oss.Ptr("filterPrefix"), // 設定清單篩選規則,指定篩選Object的首碼
LastModifyBeginTimeStamp: oss.Ptr(int64(1637883649)), // 最後修改開始時間戳
LastModifyEndTimeStamp: oss.Ptr(int64(1638347592)), // 最後修改結束時間戳記
LowerSizeBound: oss.Ptr(int64(1024)), // 檔案大小下限(位元組)
UpperSizeBound: oss.Ptr(int64(1048576)), // 檔案大小上限(位元組)
StorageClass: oss.Ptr("Standard,IA"), // 儲存類型
},
Destination: &oss.InventoryDestination{
OSSBucketDestination: &oss.InventoryOSSBucketDestination{
Format: oss.InventoryFormatCSV, // 匯出資訊清單檔的檔案格式
AccountId: oss.Ptr(accountId), // 儲存空間所有者授予的賬戶ID,例如109885487000****
RoleArn: oss.Ptr("acs:ram::" + accountId + ":role/AliyunOSSRole"), // 儲存空間所有者授予操作許可權的角色名稱,比如acs:ram::109885487000****:role/ram-test
Bucket: oss.Ptr("acs:oss:::" + bucketName), // 存放匯出的清單結果的Bucket名稱
Prefix: oss.Ptr("export/"), // 存放清單結果的儲存路徑首碼
},
},
Schedule: &oss.InventorySchedule{
Frequency: oss.InventoryFrequencyDaily, // 資訊清單檔匯出的周期(每天)
},
IncludedObjectVersions: oss.Ptr("All"), // 是否在清單中包含Object的所有版本資訊
},
}
// 執行設定儲存空間清單的請求
putResult, err := client.PutBucketInventory(context.TODO(), putRequest)
if err != nil {
log.Fatalf("failed to put bucket inventory %v", err)
}
// 列印設定儲存空間清單的結果
log.Printf("put bucket inventory result:%#v\n", putResult)
}
ossutil
建立一個名為 inventory-configuration.xml 的檔案,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<InventoryConfiguration>
<Id>report1</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>100000000000000</AccountId>
<RoleArn>acs:ram::100000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::destbucket</Bucket>
<Prefix>prefix1/</Prefix>
<Encryption>
<SSE-KMS>
<KeyId>keyId</KeyId>
</SSE-KMS>
</Encryption>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Daily</Frequency>
</Schedule>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
<Field>IsMultipartUploaded</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</InventoryConfiguration>執行以下命令:
ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration file://inventory-configuration.xml注意:關於 put-bucket-inventory 命令的詳細用法,請參考 put-bucket-inventory。
API
可直接調用 PutBucketInventory來配置或修改清單規則。需要手動構造 HTTP 要求並計算簽名,適用於對流程有高度自訂需求的情境。
解析清單報告
清單任務以非同步方式執行。清單報告的所有檔案都儲存在一個以掃描啟動時間命名的檔案夾中。核心檔案包括 manifest.json 和 data/ 目錄下的 .csv.gz 資料檔案。要確認任務是否完成,可以檢查目標是否已產生 manifest.json 檔案。
讀取
manifest.json檔案:解析manifest.json檔案以擷取正確的列順序和資料檔案資訊,重點關注以下兩個欄位:fileSchema:字串類型,定義了 CSV 檔案中各列的名稱和確切順序。
files:數群組類型,列出了本次報告產生的所有
.csv.gz資料檔案的詳細資料,包括:key:檔案路徑size:檔案大小MD5checksum:MD5 校正值
根據
fileSchema解析 CSV 資料檔案擷取並解壓資料檔案:從
manifest.json的files數組中擷取每個資料檔案的key(即檔案路徑)。根據該路徑下載對應的.csv.gz壓縮包。解壓檔案,得到 CSV 格式的資料。按序解析資料:
以
fileSchema欄位中定義的順序作為 CSV 檔案的欄位標題。逐行讀取解壓後的 CSV 檔案。每一行代表一個對象(檔案)的完整記錄,每一列則對應fileSchema中指定的一個欄位。CSV 內容樣本:如果
fileSchema為"Bucket,Key,Size,StorageClass,LastModifiedDate",解壓後的 CSV 內容格式如下:source-bucket,"dir%2Fbody.xml","102400","Standard","2025-04-14T07-06-00Z" source-bucket,"dest.png","312049","Standard","2025-04-14T07-05-59Z"Key 使用URL編碼,可按需解碼。
全量資訊清單檔
清單任務配置完成後,OSS會按清單規則指定的匯出周期產生資訊清單檔。資訊清單檔的目錄結構如下:
<dest-bucket-name>/
└── <dest-prefix>/
└── <source-bucket-name>/
└── <inventory-id>/
├── YYYY-MM-DDTHH-MMZ/ (掃描開始的UTC時間)
│ ├── manifest.json (清單任務的中繼資料檔案)
│ └── manifest.checksum (manifest.json 檔案的 MD5 校正和)
└── data/
└── <uuid>.csv.gz (多份GZIP 壓縮的清單資料檔案)目錄結構 | 說明 |
dest-prefix | 該目錄根據設定的清單報告名首碼產生,如果清單報告名首碼設定為空白,將省略該目錄。 |
source-bucket-name | 該目錄根據配置清單報告的源Bucket名產生。 |
inventory_id | 該目錄根據清單任務的規則名稱產生。 |
YYYY-MM-DDTHH-MMZ | 該目錄是標準的格林威治時間戳記,表示開始掃描Bucket的時間,例如2025-05-17T16-00Z。該目錄下包含了manifest.json和manifest.checksum檔案。 |
data | 該目錄下存放了包含源Bucket中的對象列表以及每個對象的中繼資料的資訊清單檔,資訊清單檔格式為使用GZIP壓縮的CSV檔案。 重要
|
manifest檔案
manifest檔案包含manifest.json和manifest.checksum,詳細說明如下:
manifest.json:提供了有關清單的中繼資料和其他基本資料。
{ "creationTimestamp": "1642994594", "destinationBucket": "dest-bucket-name", "fileFormat": "CSV", "fileSchema": "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, Size, StorageClass, LastModifiedDate, ETag, IsMultipartUploaded, EncryptionStatus, ObjectAcl, TaggingCount, ObjectType, CRC64", "files": [{ "MD5checksum": "F77449179760C3B13F1E76110F07****", "key": "dest-prefix/source-bucket-name/inventory-id/data/a1574226-b5e5-40ee-91df-356845777c04.csv.gz", "size": 2046}], "sourceBucket": "source-bucket-name", "version": "2019-09-01" }各欄位詳細說明如下:
欄位名稱
說明
creationTimestamp
時間戳記,顯示開始掃描源Bucket的時間。
destinationBucket
存放資訊清單檔的目標Bucket。
fileFormat
資訊清單檔的格式。
fileSchema
資訊清單檔包含的欄位,分為固定欄位和可選欄位。其中,固定欄位的順序是固定的,可選欄位的排列順序取決於配置清單規則時清單內容欄位的排列順序(控制台配置時以欄位的勾選先後順序為準)。 因此,建議以fileSchema中的欄位順序去解析csv.gz中的資料列,避免出現列和屬性對應錯誤的情況。
配置清單規則時如果對象版本選擇了目前的版本,則fileSchema中,先排列固定欄位
Bucket, Key,後續為可選欄位。配置清單規則時如果對象版本選擇了所有版本,則fileSchema中,先排列固定欄位
Bucket, Key, VersionId, IsLatest, IsDeleteMarker,後續為可選欄位。
files
包含資訊清單檔的MD5值、檔案名稱完整路徑及檔案大小。
sourceBucket
配置清單規則的源Bucket。
version
清單版本號碼。
manifest.checksum:
manifest.checksum檔案包含了manifest.json檔案的 MD5 雜湊值,可用於校正manifest.json檔案的完整性,例如F77449179760C3B13F1E76110F07****。
全量清單報告
清單報告儲存在data/目錄中,包含清單功能匯出的檔案資訊。清單報告樣本如下:

欄位名稱 | 說明 |
Bucket | 執行清單任務的源Bucket名稱。 |
Key | Bucket中Object的名稱。 Object名稱使用URL編碼,可按需解碼。 |
VersionId | Object的版本ID。僅當配置的清單規則為匯出所有版本時出現此欄位。
|
IsLatest | Object版本是否為最新版本。僅當配置的清單規則為匯出所有版本時出現此欄位。
|
IsDeleteMarker | Object版本是否為刪除標記。僅當配置的清單規則為匯出所有版本時出現此欄位。
|
Size | Object大小。 |
StorageClass | Object的儲存類型。 |
LastModifiedDate | Object的最後修改時間,格式是格林威治時間,與北京時間相差8小時。 |
TransistionTime | Object通過生命週期規則轉儲為冷歸檔或者深度冷Archive Storage類型的時間。 |
ETag | Object的ETag。 Object產生時會建立相應的ETag,用於標識一個Object的內容。
|
IsMultipartUploaded | Object是否通過分區上傳產生。如果是,則該欄位值為true,否則為false。 |
EncryptionStatus | Object是否已加密。若Object已加密,則該欄位值為true,否則為false。 |
ObjectAcl | Object的讀寫權限。更多資訊,請參見Object ACL。 |
TaggingCount | Object的標籤個數。 |
ObjectType | Object類型。更多資訊,請參見Object類型。 |
Crc64 | Object的CRC64。 |
增量清單
增量清單通常以10分鐘為周期,捕獲並報告該時間視窗內發生的所有對象變更事件(包括建立、中繼資料更新、刪除)。
配置清單規則
控制台
登入 OSS 管理主控台。
進入需要產生清單的源 Bucket,在左側導覽列選擇 資料管理 > Bucket 清單。
在Bucket 清單頁面,單擊建立清單。
在設定清單報告規則面板。
配置基礎設定參數:
參數
說明
狀態
設定增量清單任務的狀態,選擇啟動。
規則名稱
設定清單任務的名稱。只能包含小寫字母、數字、短劃線(-),且不能以短劃線(-)開頭或結尾。
清單報告儲存至
設定清單報告的儲存路徑。配置清單的 Bucket 與存放清單 Bucket 必須同帳號、同地區。
若需將報告儲存到儲存空間 examplebucket 的 exampledir1 路徑,請填寫
exampledir1/,指定路徑在 Bucket 中不存在時,OSS 會自動建立該路徑。目標路徑首碼的長度不能超過 128 個字元。若留空,報告將儲存在根目錄。
重要為避免影響OSS-HDFS服務的正常使用或者引發資料汙染的風險,在開通了OSS-HDFS服務的Bucket設定清單報告規則時,禁止將清單報告目錄填寫為
.dlsdata/。資訊清單檔掃描範圍
掃描整個Bucket:掃描整個 Bucket的所有檔案。
按首碼匹配:用於僅掃描指定首碼下的檔案,例如 exampledir1/。
在追蹤並產生增量中繼資料更新地區,開啟擷取增量中繼資料更新,並根據需要選擇希望匯出的中繼資料欄位。
參數
說明
中繼資料欄位
選擇希望匯出的檔案資訊。
事件中繼資料:序號、事件類型、時間戳記、使用者ID、請求ID、請求源IP。
系統中繼資料:Object大小、儲存類型、最後更新日期、ETag、分區上傳狀態、檔案類型、Object ACL、CRC64、加密狀態。
選中我知曉並同意授予阿里雲 OSS 服務訪問 Bucket 資源的許可權,然後單擊確定。
ossutil
建立一個名為 incremental-inventory.xml 的檔案。與全量清單配置相比,關鍵在於增加了 <IncrementalInventory> 節。
<?xml version="1.0" encoding="UTF-8"?>
<InventoryConfiguration>
<Id>Report-1</Id>
<IsEnabled>true</IsEnabled>
<Filter>
<Prefix>test</Prefix>
</Filter>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>12xxxxxx29</AccountId>
<RoleArn>acs:ram::12xxxxxx29:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::test-inc-bi-bj</Bucket>
<Prefix>Report-1</Prefix>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Weekly</Frequency>
</Schedule>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
</OptionalFields>
<IncrementalInventory>
<IsEnabled>true</IsEnabled>
<Schedule>
<Frequency>600</Frequency>
</Schedule>
<OptionalFields>
<Field>SequenceNumber</Field>
<Field>RecordType</Field>
<Field>RecordTimestamp</Field>
<Field>Requester</Field>
<Field>RequestId</Field>
<Field>SourceIp</Field>
<Field>Size</Field>
<Field>StorageClass</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>IsMultipartUploaded</Field>
<Field>ObjectType</Field>
<Field>ObjectAcl</Field>
<Field>Crc64</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</IncrementalInventory>
</InventoryConfiguration>執行以下命令:
ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration file://inventory-configuration.xml注意:關於 put-bucket-inventory 命令的詳細用法,請參考 put-bucket-inventory。API
可直接調用 PutBucketInventory來配置或修改清單規則。這需要手動構造 HTTP 要求並計算簽名,適用於對流程有高度自訂需求的情境。
解析清單報告
清單任務完成後,會在目標 Bucket 的指定路徑下產生報告檔案,核心包括:
manifest.json檔案data/目錄下的.csv資料檔案
判斷任務是否已完成,可以檢查目標 Bucket 中是否產生了 manifest.json 檔案。
解析步驟如下:
讀取
manifest.json檔案:清單報告的列順序是動態,取決於配置清單規則時所勾選的欄位。需要先解析manifest.json中的fileSchema欄位,該欄位定義了 CSV 檔案中各列的名稱及其順序。根據
fileSchema解析 CSV 資料檔案以
fileSchema中定義的順序作為 CSV 檔案的欄位標題。按行讀取 CSV 檔案:每一行代表一個對象(檔案)的完整記錄,每一列對應
fileSchema中聲明的一個欄位。
差異清查檔案
清單任務配置完成後,OSS會按清單規則指定的匯出周期產生資訊清單檔。資訊清單檔的目錄結構如下:
<dest-bucket-name>/
└── <dest-prefix>/
└── <source-bucket-name>/
└── <inventory-id>/
└── incremental_inventory/
└── YYYY-MM-DDTHH-MMSSZ/
├── manifest.json
└── data/
├── uuid1_0.csv
└── ......目錄結構 | 說明 |
dest-prefix | 該目錄根據設定的清單報告名首碼產生,如果清單報告名首碼設定為空白,將省略該目錄。 |
source-bucket-name | 該目錄根據配置清單報告的源Bucket名產生。 |
inventory_id | 該目錄根據清單任務的規則名稱產生。 |
incremental_inventory | 增量清單的固定首碼(區分全量匯出結果)。 |
YYYY-MM-DDTHH-MMSSZ | 該目錄是標準的格林威治時間戳記,表示開始掃描Bucket的時間,例如2020-05-17T16-0000Z。 |
data | 該目錄下存放的是在指定時間周期內,源 Bucket 中發生修改的對象及其中繼資料的資訊清單檔,資訊清單檔格式為CSV檔案。 |
manifest檔案
{
"creationTimestamp": "1642994594",
"destinationBucket": "destbucket",
"fileFormat": "CSV",
"fileSchema": "Bucket, Key, VersionId, IsDeleteMarker, SequenceNumber, RecordType, RecordTimestamp, Requester, RequestId, SourceIp, Size, StorageClass, LastModifiedDate, ETag, IsMultipartUploaded, ObjectType, ObjectAcl, CRC64, EncryptionStatus",
"files": [{
"MD5checksum": "60463A9A34019CF448A730EB2CB3****",
"key": "dest-prefix/source-bucket-name/inventory-id/incremental_inventory/2025-09-28T07-4000Z/data/a1574226-b5e5-40ee-91df-356845777c04.csv",
"size": 2046}],
"sourceBucket": "srcbucket",
"version": "2025-09-30"
}各欄位詳細說明如下:
欄位名稱 | 說明 |
creationTimestamp | 時間戳記,顯示開始掃描源Bucket的時間。 |
destinationBucket | 存放資訊清單檔的目標Bucket。 |
fileFormat | 資訊清單檔的格式。 |
fileSchema | 資訊清單檔包含的欄位,分為固定欄位和可選欄位。其中,固定欄位的順序是固定的,可選欄位的排列順序取決於配置清單規則時清單內容欄位的排列順序(控制台配置時以欄位的勾選先後順序為準)。 因此,建議以fileSchema中的欄位順序去解析csv.gz中的資料列,避免出現列和屬性對應錯誤的情況。
|
files | 包含資訊清單檔的MD5值、檔案名稱完整路徑及檔案大小。 |
sourceBucket | 配置清單規則的源Bucket。 |
version | 清單版本號碼。 |
增量清單報告欄位
中繼資料類型 | 欄位名稱 | 說明 |
System Metadata | Bucket | 執行清單任務的源Bucket名稱。 |
Event Metadata | SequenceNumber | 序號,每條記錄的SequenceNumber唯一,同Bucket同Object下的記錄,可按照SequenceNumber排序,通常保證排序後的記錄遵循時間邏輯順序。 |
RecordType | 事件類型:CREATE、UPDATE_METADATA、DELETE
| |
RecordTimestamp | 時間戳記 ( 樣本:"2024-08-25 18:08:01.024"),採用格林威治時區,精度到毫秒。 | |
Requester | 要求者的阿里雲 ID 或者 Principal ID。 | |
RequestId | 請求的唯一標識。 | |
SourceIp | 要求者源 IP。 | |
System Metadata | Key | Bucket 中 Object 的名稱,採用URL編碼。 |
VersionId | Object的版本ID。僅當配置的清單規則為匯出所有版本時出現此欄位。
| |
IsDeleteMarker | Object版本是否為刪除標記。僅當配置的清單規則為匯出所有版本時出現此欄位。
| |
Size | Object大小。 | |
StorageClass | Object的儲存類型。 | |
LastModifiedDate | Object的最後修改時間,格式是格林威治時間,與北京時間相差8小時。 | |
ETag | Object的ETag。Object產生時會建立相應的ETag,用於標識一個Object的內容。
| |
IsMultipartUploaded | Object是否通過分區上傳產生。如果是,則該欄位值為true,否則為false。 | |
EncryptionStatus | Object是否已加密。若Object已加密,則該欄位值為true,否則為false。 | |
ObjectAcl | Object的讀寫權限。更多資訊,請參見Object ACL。 | |
ObjectType | Object類型。更多資訊,請參見Object類型。 | |
Crc64 | Object的CRC64。 |
配額與限制
單個 Bucket 最多支援 1000 條清單規則(通過 API/SDK)或 10 條(通過控制台)。
計費說明
儲存空間清單暫不收取功能使用費,但會產生以下關聯費用:
API 請求費:配置和擷取清單規則時產生
Put請求費用和Get請求費用。OSS 寫入清單報告到目標 Bucket 時會產生 PUT 請求費用。下載和讀取清單報告時,會產生 GET 請求費用。儲存費用:產生的清單報告(
manifest檔案和csv.gz、csv檔案)會佔用目標 Bucket 的儲存空間,按標準儲存費用計費。外網流出費用:使用外網 Endpoint 下載和讀取清單報告時,會產生外網流出流量費用。
為避免不必要的開銷,請及時刪除不再需要的清單規則,並使用生命週期規則自動清理到期的清單報告檔案。
應用於生產環境
最佳實務
最小許可權:始終使用專用的、具備最小許可權的 RAM 角色,切勿在生產環境中使用
AliyunOSSRole。效能建議:對於高流量的源 Bucket,應將清單報告儲存到另一個專用的 Bucket,避免因寫入報告而產生的頻寬競爭影響線上業務。
成本最佳化:儲存空間清單支援按天或按周匯出資訊清單檔。對於超過百億檔案的 Bucket,建議使用每周清單。同時,在目標 Bucket 上配置生命週期規則,自動刪除超過 N 天(例如 30 天)的清單報告以節省儲存成本。
Bucket內的檔案數量
匯出建議
<100億
按需配置按天或按周匯出
100億~500億
按周匯出
≥500億
按首碼匹配分批匯出
通過提升匯出限制
首碼分區:對於超大規模(如千億級)的 Bucket,可按業務首碼建立多條清單規則,分而治之地產生報告,便於管理和處理。
風險防範
資料審計:匯出資訊清單檔的過程中,由於Object的建立、刪除或覆蓋等操作,可能會導致最終輸出的清單列表中不一定包含所有的Object。最後修改時間早於manifest.json檔案中createTimeStamp欄位顯示時間的Object會出現在資訊清單檔中;最後修改時間晚於createTimeStamp欄位顯示時間的Object可能不會出現在資訊清單檔中。建議在對清單列表中的Object進行操作之前,先使用HeadObject介面檢查Object的屬性。
監控警示:監控目標 Bucket 的儲存用量,防止資訊清單檔無限制增長導致成本失控。監控
PutBucketInventory等 API 的調用,以便追蹤配置變更。變更管理:清單規則的變更(如修改首碼、頻率)會影響下遊的資料分析流程。所有變更應納入版本控制和評審流程。