全部產品
Search
文件中心

Object Storage Service:使用儲存空間清單

更新時間:Feb 11, 2026

當儲存空間(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 使用者(例如營運管理員)去配置清單規則,而不是為清單服務本身授權。為遵循安全最佳實務,推薦由阿里雲帳號或具備高許可權的管理員預先建立好清單服務所需的 RAM 角色。然後,普通 RAM 使用者在配置清單時,只需被授予使用該角色的許可權即可,無需自行建立角色。

如果需要授予 RAM 使用者建立和管理清單規則的許可權,請為其授予包含以下許可權的自訂策略:

以下策略中的 oss:ListBuckets 許可權僅在通過控制台操作時需要。如果通過 SDK 或 ossutil 等工具訪問,則無需此許可權。
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "oss:PutBucketInventory",
                "oss:GetBucketInventory",
                "oss:DeleteBucketInventory",
                "oss:ListBuckets",
                "ram:CreateRole",
                "ram:AttachPolicyToRole",
                "ram:GetRole",
                "ram:ListPoliciesForRole"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}

提示:如果當前 RAM 使用者已擁有 AliyunOSSFullAccess 系統許可權,則僅需為其補充授予角色管理的相關許可權即可:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ram:CreateRole",
                "ram:AttachPolicyToRole",
                "ram:GetRole",
                "ram:ListPoliciesForRole"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}
  1. 建立RAM角色:進入建立RAM角色頁面。信任主體類型選擇雲端服務信任主體名稱選擇Object Storage Service

  2. 為RAM角色授予寫入目標 Bucket 的許可權:

    1. 建立權限原則頁面,單擊指令碼編輯頁簽。將以下策略內容粘貼到策略編輯器中,並將dest-bucket替換為實際的源Bucket名稱。

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "oss:PutObject",
            "Resource": [
              "acs:oss:*:*:dest-bucket/*" 
            ]
          }
        ]
      }
    2. (可選)配置 KMS 加密許可權:如果清單報告需要使用 KMS 祕密金鑰加密,還需為該 RAM 角色授予 AliyunKMSCryptoUserAccess 許可權或更精細的 KMS 相關許可權。

    3. 授權頁面,單擊新增授權授權主體選擇建立的RAM角色,權限原則選擇剛建立的策略,然後單擊確認新增授權

  3. 記錄角色ARN:在角色頁面找到建立RAM角色,進入基本資料頁面,複製角色的ARN用於建立清單規則。格式為 acs:ram::{源帳號UID}:role/{角色名稱}

全量清單

全量清單會定期掃描並匯出Bucket中所有(或指定首碼下所有)對象的完整列表。請注意:

  • 報告快照:清單報告反映的是掃描任務啟動時的對象狀態。掃描過程需要時間,此期間的對象變更(如新增、刪除)不保證會包含在本次報告中。

  • 首份清單會在配置後立即執行,後續按設定的每日或每周的周期在北京時間淩晨批量執行,匯出延遲受對象數量與任務隊列影響。

配置清單規則

控制台

  1. 登入 OSS 管理主控台

  2. 進入需要產生清單的源 Bucket,在左側導覽列選擇 資料管理 > Bucket 清單

  3. Bucket 清單頁面,單擊建立清單

  4. 設定清單報告規則面板,配置以下參數:

    參數

    說明

    狀態

    設定清單任務的狀態,選擇啟動

    規則名稱

    設定清單任務的名稱。只能包含小寫字母、數字、短劃線(-),且不能以短劃線(-)開頭或結尾。

    清單報告儲存至

    設定清單報告的儲存路徑。配置清單的 Bucket 與存放清單 Bucket 必須同帳號、同地區。

    • 若需將報告儲存到儲存空間 examplebucket 的 exampledir1 路徑,請填寫 exampledir1/,指定路徑在 Bucket 中不存在時,OSS 會自動建立該路徑。

    • 若留空,報告將儲存在根目錄。

    重要

    為避免影響OSS-HDFS服務的正常使用或者引發資料汙染的風險,在開通了OSS-HDFS服務的Bucket設定清單報告規則時,禁止將清單報告目錄填寫為.dlsdata/

    資訊清單檔掃描範圍

    • 掃描整個Bucket:掃描整個 Bucket的所有檔案。

    • 按首碼匹配:用於僅掃描指定首碼下的檔案,例如 exampledir1/

    清單報告加密選項

    選擇是否加密資訊清單檔。

    清單報告匯出周期

    設定清單報告的組建循環。可選擇每周、每天、單次匯出。檔案數超百億時,建議選擇每周以降低成本和掃描壓力。

    清單內容

    選擇希望匯出的檔案資訊:

    • 系統中繼資料Object大小儲存類型最後更新日期ETagTransitionTime分區上傳狀態加密狀態Object ACL檔案類型CRC64

    • 自訂中繼資料標籤個數

    配置進階篩選功能

    重要

    僅華北1(青島)、華北5(呼和浩特)和德國(法蘭克福)地區支援配置以下過濾選項。

    如果需要根據檔案大小、儲存類型等條件過濾匯出的檔案,需要開啟配置進階篩選功能開關。

    支援的過濾選項說明如下:

    • 時間範圍:設定待匯出檔案最後一次修改的起始日期和結束日期,時間精確到秒。

    • 檔案大小範圍:設定待匯出檔案的檔案大小最小值和最大值。

      重要

      設定檔案大小範圍時,確保檔案大小的最小值以及最大值均大於0 B,且最大值不能超過48.8 TB。

    • 儲存類型:設定待匯出哪些儲存類型的檔案。可以選擇匯出標準儲存、低頻訪問、Archive Storage、冷Archive Storage以及深度冷Archive Storage的檔案。

    對象版本

    若 Bucket 開啟了版本控制,可選擇匯出目前的版本所有版本

  5. 選中我知曉並同意授予阿里雲 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(&region, "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 檔案。

  1. 讀取 manifest.json 檔案:解析 manifest.json 檔案以擷取正確的列順序和資料檔案資訊,重點關注以下兩個欄位:

    • fileSchema:字串類型,定義了 CSV 檔案中各列的名稱和確切順序。

    • files:數群組類型,列出了本次報告產生的所有 .csv.gz 資料檔案的詳細資料,包括:

      • key:檔案路徑

      • size:檔案大小

      • MD5checksum:MD5 校正值

  2. 根據 fileSchema 解析 CSV 資料檔案

    1. 擷取並解壓資料檔案:從 manifest.jsonfiles 數組中擷取每個資料檔案的 key(即檔案路徑)。根據該路徑下載對應的 .csv.gz 壓縮包。解壓檔案,得到 CSV 格式的資料。

    2. 按序解析資料

      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.jsonmanifest.checksum檔案。

data

該目錄下存放了包含源Bucket中的對象列表以及每個對象的中繼資料的資訊清單檔,資訊清單檔格式為使用GZIP壓縮的CSV檔案。

重要
  • 當匯出的源Bucket中Object數量較多時,為方便使用者下載和處理資料,程式會自動將資訊清單檔切分成多個CSV壓縮檔。CSV壓縮檔按照uuid.csv.gzuuid-1.csv.gzuuid-2.csv.gz的順序依次遞增。可以從manifest.json檔案中擷取CSV檔案清單,然後按照以上順序依次解壓CSV檔案並讀取清單資料。

  • Object的單條記錄資訊僅出現在一個資訊清單檔內,不會分布到不同的資訊清單檔。

manifest檔案

manifest檔案包含manifest.jsonmanifest.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.checksummanifest.checksum 檔案包含了 manifest.json 檔案的 MD5 雜湊值,可用於校正 manifest.json 檔案的完整性,例如F77449179760C3B13F1E76110F07****

全量清單報告

清單報告儲存在data/目錄中,包含清單功能匯出的檔案資訊。清單報告樣本如下:

image

欄位名稱

說明

Bucket

執行清單任務的源Bucket名稱。

Key

Bucket中Object的名稱。

Object名稱使用URL編碼,可按需解碼。

VersionId

Object的版本ID。僅當配置的清單規則為匯出所有版本時出現此欄位。

  • 如果配置清單規則的Bucket未開啟版本控制,則該欄位顯示為空白。

  • 如果配置清單規則的Bucket已開啟版本控制,則該欄位顯示為Object的VersionId。

IsLatest

Object版本是否為最新版本。僅當配置的清單規則為匯出所有版本時出現此欄位。

  • 如果配置清單規則的Bucket未開啟版本控制,則該欄位顯示為true

  • 如果配置清單規則的Bucket已開啟版本控制,且Object為最新版本時,則該欄位顯示為true。如果Object為歷史版本,則該欄位顯示為false。

IsDeleteMarker

Object版本是否為刪除標記。僅當配置的清單規則為匯出所有版本時出現此欄位。

  • 如果配置清單規則的Bucket未開啟版本控制,則該欄位預設顯示為false

  • 如果配置清單規則的Bucket已開啟版本控制,且Object為刪除標記時,則該欄位顯示為true。如果Object不是刪除標記,則該欄位顯示為false

Size

Object大小。

StorageClass

Object的儲存類型。

LastModifiedDate

Object的最後修改時間,格式是格林威治時間,與北京時間相差8小時。

TransistionTime

Object通過生命週期規則轉儲為冷歸檔或者深度冷Archive Storage類型的時間。

ETag

Object的ETag。

Object產生時會建立相應的ETag,用於標識一個Object的內容。

  • 通過PutObject介面建立的Object,ETag值是其內容的MD5值。

  • 通過其他方式建立的Object,ETag值是基於一定計算規則產生的唯一值,但不是其內容的MD5值。

IsMultipartUploaded

Object是否通過分區上傳產生。如果是,則該欄位值為true,否則為false

EncryptionStatus

Object是否已加密。若Object已加密,則該欄位值為true,否則為false

ObjectAcl

Object的讀寫權限。更多資訊,請參見Object ACL

TaggingCount

Object的標籤個數。

ObjectType

Object類型。更多資訊,請參見Object類型

Crc64

Object的CRC64。

增量清單

增量清單通常以10分鐘為周期,捕獲並報告該時間視窗內發生的所有對象變更事件(包括建立、中繼資料更新、刪除)。

配置清單規則

控制台

  1. 登入 OSS 管理主控台

  2. 進入需要產生清單的源 Bucket,在左側導覽列選擇 資料管理 > Bucket 清單

  3. Bucket 清單頁面,單擊建立清單

  4. 設定清單報告規則面板。

    1. 配置基礎設定參數:

      參數

      說明

      狀態

      設定增量清單任務的狀態,選擇啟動

      規則名稱

      設定清單任務的名稱。只能包含小寫字母、數字、短劃線(-),且不能以短劃線(-)開頭或結尾。

      清單報告儲存至

      設定清單報告的儲存路徑。配置清單的 Bucket 與存放清單 Bucket 必須同帳號、同地區。

      • 若需將報告儲存到儲存空間 examplebucket 的 exampledir1 路徑,請填寫 exampledir1/,指定路徑在 Bucket 中不存在時,OSS 會自動建立該路徑。目標路徑首碼的長度不能超過 128 個字元。

      • 若留空,報告將儲存在根目錄。

      重要

      為避免影響OSS-HDFS服務的正常使用或者引發資料汙染的風險,在開通了OSS-HDFS服務的Bucket設定清單報告規則時,禁止將清單報告目錄填寫為.dlsdata/

      資訊清單檔掃描範圍

      • 掃描整個Bucket:掃描整個 Bucket的所有檔案。

      • 按首碼匹配:用於僅掃描指定首碼下的檔案,例如 exampledir1/

    2. 追蹤並產生增量中繼資料更新地區,開啟擷取增量中繼資料更新並根據需要選擇希望匯出的中繼資料欄位

      參數

      說明

      中繼資料欄位

      選擇希望匯出的檔案資訊。

      • 事件中繼資料序號事件類型時間戳記使用者ID請求ID請求源IP

      • 系統中繼資料Object大小儲存類型最後更新日期ETag分區上傳狀態檔案類型、Object ACLCRC64加密狀態

  5. 選中我知曉並同意授予阿里雲 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 檔案。

解析步驟如下:

  1. 讀取 manifest.json 檔案:清單報告的列順序是動態,取決於配置清單規則時所勾選的欄位。需要先解析 manifest.json 中的 fileSchema 欄位,該欄位定義了 CSV 檔案中各列的名稱及其順序。

  2. 根據 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中的資料列,避免出現列和屬性對應錯誤的情況。

  • 配置清單規則時如果對象版本選擇了目前的版本,則fileSchema中,先排列固定欄位Bucket, Key,後續為可選欄位。

  • 配置清單規則時如果對象版本選擇了所有版本,則fileSchema中,先排列固定欄位Bucket, Key, VersionId, IsDeleteMarker,後續為可選欄位。

files

包含資訊清單檔的MD5值、檔案名稱完整路徑及檔案大小。

sourceBucket

配置清單規則的源Bucket。

version

清單版本號碼。

增量清單報告欄位

中繼資料類型

欄位名稱

說明

System Metadata

Bucket

執行清單任務的源Bucket名稱。

Event Metadata

SequenceNumber

序號,每條記錄的SequenceNumber唯一,同Bucket同Object下的記錄,可按照SequenceNumber排序,通常保證排序後的記錄遵循時間邏輯順序。

RecordType

事件類型:CREATE、UPDATE_METADATA、DELETE

  • CREATE:所選首碼下發生的所有上傳方式,如 Put/Post/Append/MultipartUpload/Copy

  • UPDATE_METADATA:所選首碼下所有中繼資料的更新都記錄在該類型中

  • DELETE:所選首碼下的檔案的所有刪除方式,如 DeleteObject/DeleteMultipleObjects、開啟多版本後產生 DeleteMarker、生命週期刪除。刪除有DeleteMarker和永久刪除,其中,永久刪除記錄僅保留 BucketKeySequenceNumberRecordTypeRecordTimestamp 和 VersionId 核心欄位,其餘列均為空白(null)。

RecordTimestamp

時間戳記 ( 樣本:"2024-08-25 18:08:01.024"),採用格林威治時區,精度到毫秒。

Requester

要求者的阿里雲 ID 或者 Principal ID。

RequestId

請求的唯一標識。

SourceIp

要求者源 IP。

System Metadata

Key

Bucket 中 Object 的名稱,採用URL編碼。

VersionId

Object的版本ID。僅當配置的清單規則為匯出所有版本時出現此欄位。

  • 如果配置清單規則的Bucket未開啟版本控制,則該欄位顯示為空白。

  • 如果配置清單規則的Bucket已開啟版本控制,則該欄位顯示為Object的VersionId。

IsDeleteMarker

Object版本是否為刪除標記。僅當配置的清單規則為匯出所有版本時出現此欄位。

  • 如果配置清單規則的Bucket未開啟版本控制,則該欄位預設顯示為false

  • 如果配置清單規則的Bucket已開啟版本控制,且Object為刪除標記時,則該欄位顯示為true。如果Object不是刪除標記,則該欄位顯示為false

Size

Object大小。

StorageClass

Object的儲存類型。

LastModifiedDate

Object的最後修改時間,格式是格林威治時間,與北京時間相差8小時。

ETag

Object的ETag。Object產生時會建立相應的ETag,用於標識一個Object的內容。

  • 通過PutObject介面建立的Object,ETag值是其內容的MD5值。

  • 通過其他方式建立的Object,ETag值是基於一定計算規則產生的唯一值,但不是其內容的MD5值。

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.gzcsv 檔案)會佔用目標 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 的調用,以便追蹤配置變更。

  • 變更管理:清單規則的變更(如修改首碼、頻率)會影響下遊的資料分析流程。所有變更應納入版本控制和評審流程。

常見問題