Tous les produits
Search
Centre de documentation

Object Storage Service:Use bucket inventory

Dernière mise à jour :Aug 10, 2026

La fonction d'inventaire de compartiment analyse périodiquement un compartiment et génère des fichiers CSV contenant les métadonnées des objets, telles que la taille et la classe de stockage. Utilisez cette fonction lorsque l'énumération individuelle des objets via l'API ListObjects est trop lente ou coûteuse.

Limites

  • L'inventaire de compartiment est disponible uniquement pour les compartiments situés dans une région spécifique.

  • Pour utiliser la fonction d'inventaire incrémentiel, contactez le support technique.

Cas d'utilisation

OSS propose des inventaires complets et incrémentiels. Un inventaire complet capture un instantané de tous les objets à un moment donné, tandis qu'un inventaire incrémentiel enregistre les objets ajoutés ou modifiés au cours d'une période donnée. Les inventaires complets sont générés quotidiennement ou hebdomadairement ; les inventaires incrémentiels sont générés environ toutes les 10 minutes. Parmi les cas d'utilisation, on trouve :

  • Analyse ponctuelle des données : Configurez une règle d'inventaire complet pour générer un instantané complet des métadonnées destiné à une analyse hors ligne.

  • Analyse continue des données : Combinez les inventaires complets et incrémentiels pour construire une table de métadonnées unifiée. Intégrez les métadonnées des objets dans votre propre table et interrogez-la à l'aide de votre cluster Spark ou de votre moteur d'analyse.

Fonctionnement

  • Inventaire complet : Génère un instantané complet de tous les objets du compartiment, quotidiennement ou hebdomadairement.

    • Obtention des autorisations : OSS endosse un rôle RAM préautorisé pour analyser le compartiment source et écrire le rapport dans le compartiment de destination.

    • Analyse des objets : OSS analyse tous les objets correspondants en fonction des critères de filtrage définis dans la règle d'inventaire (préfixe, statut de version, heure de création ou taille).

    • Génération du rapport d'inventaire : OSS agrège les résultats de l'analyse et écrit un fichier CSV compressé au format Gzip dans le compartiment de destination.

  • Inventaire incrémentiel : Généré environ toutes les 10 minutes, il capture les événements de modification des objets (créations, mises à jour des métadonnées et suppressions).

    • Obtention des autorisations : OSS endosse un rôle RAM préautorisé pour analyser les journaux du compartiment source et écrire le rapport dans le compartiment de destination.

    • Analyse des objets : OSS analyse les journaux incrémentiels en fonction des critères de filtrage définis dans la règle d'inventaire (préfixe).

    • Génération du rapport d'inventaire : OSS agrège les résultats de l'analyse par partitions backend et écrit un fichier CSV dans le compartiment de destination.

La génération de l'inventaire s'exécute de manière asynchrone et n'affecte pas l'accès normal au compartiment.

Créer un rôle de service

L'inventaire OSS utilise un rôle RAM pour lire depuis le compartiment source et écrire dans le compartiment de destination. Créez un rôle de service dédié en appliquant le principe du moindre privilège.

Lorsque vous configurez l'inventaire via la console, le système crée automatiquement un rôle nommé AliyunOSSRole . Vous pouvez utiliser ce rôle par défaut sans en créer un vous-même. Toutefois, ce rôle dispose d'autorisations de gestion complètes pour tous les compartiments de votre compte. N'utilisez pas le rôle AliyunOSSRole en production .

Pour créer manuellement un rôle avec le moindre privilège, suivez les étapes ci-dessous :

(Facultatif) Accorder à un utilisateur RAM l'autorisation de configurer l'inventaire

Un compte Alibaba Cloud dispose par défaut de toutes les autorisations ; vous pouvez ignorer cette étape.

Cette étape accorde à un utilisateur RAM (par exemple, un administrateur des opérations et de la maintenance) l'autorisation de configurer une règle d'inventaire, et non l'autorisation d'utiliser la fonction d'inventaire OSS elle-même. Un compte Alibaba Cloud ou un administrateur hautement privilégié doit créer le rôle RAM à l'avance. Un utilisateur RAM standard n'a alors besoin que de l'autorisation d'utiliser le rôle, et non de le créer.

Pour accorder à un utilisateur RAM l'autorisation de créer et de gérer des règles d'inventaire, accordez à l'utilisateur une stratégie personnalisée contenant les autorisations suivantes :

L'autorisation oss:ListBuckets dans la stratégie suivante est requise uniquement lors de l'utilisation de la console. Si vous utilisez un SDK ou des outils tels qu'ossutil, cette autorisation n'est pas nécessaire.
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "oss:PutBucketInventory",
                "oss:GetBucketInventory",
                "oss:DeleteBucketInventory",
                "oss:ListBuckets",
                "ram:CreateRole",
                "ram:AttachPolicyToRole",
                "ram:GetRole",
                "ram:ListPoliciesForRole"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}

Conseil : Si l'utilisateur RAM actuel dispose déjà de la stratégie système AliyunOSSFullAccess, vous devez uniquement lui accorder des autorisations supplémentaires de gestion des rôles :

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ram:CreateRole",
                "ram:AttachPolicyToRole",
                "ram:GetRole",
                "ram:ListPoliciesForRole"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}
  1. Créez un rôle RAM : Accédez à la page Créer un rôle RAM. Pour le champ Trusted entity type, sélectionnez Cloud service. Pour le champ Trusted service, sélectionnez OSS.

  2. Accordez au rôle RAM l'autorisation d'écrire dans le compartiment de destination :

    1. Sur la page Créer une stratégie, cliquez sur l'onglet Script editor. Collez la stratégie suivante dans l'éditeur de stratégie et remplacez dest-bucket par le nom de votre compartiment de destination.

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "oss:PutObject",
            "Resource": [
              "acs:oss:*:*:dest-bucket/*" 
            ]
          }
        ]
      }
    2. (Facultatif) Configurez les autorisations de chiffrement KMS : Si le rapport d'inventaire doit être chiffré avec une clé KMS, vous devez également accorder au rôle RAM l'autorisation AliyunKMSCryptoUserAccess ou des autorisations KMS plus fines.

    3. Sur la page Autoriser, cliquez sur Add permissions. Pour le champ Principal, sélectionnez le rôle RAM que vous avez créé. Pour le champ Permission policy, sélectionnez la stratégie que vous venez de créer. Cliquez ensuite sur Confirm authorization.

  3. Enregistrez l'ARN du rôle : Sur la page Rôles, localisez le rôle RAM que vous avez créé. Accédez à la page Basic information et copiez l'ARN du rôle. Vous aurez besoin de l'ARN du rôle pour créer une règle d'inventaire. L'ARN est au format acs:ram::{AccountID}:role/{RoleName}.

Inventaire complet

Un inventaire complet analyse tous les objets du bucket ou sous un préfixe spécifié. Remarques :

  • Le rapport d'inventaire correspond à un snapshot pris au début de l'analyse. Les modifications apportées pendant l'analyse peuvent ne pas y figurer.

  • Le premier rapport est généré immédiatement. Les rapports suivants sont générés quotidiennement ou hebdomadairement lors des lots de traitement matinaux (UTC+8). La latence dépend du nombre d'objets et de la profondeur de la file d'attente des tâches.

Règles d'inventaire

Console

  1. Connectez-vous à la console de gestion OSS.

  2. Accédez au bucket source pour lequel vous souhaitez générer un inventaire. Dans le volet de navigation de gauche, choisissez Data Management > Bucket inventory.

  3. Sur la page Bucket Inventory, cliquez sur Create Inventory.

  4. Dans le panneau Create Inventory, configurez les paramètres suivants :

    Parameter

    Description

    Status

    Définissez l'état de la configuration d'inventaire. Sélectionnez Start.

    Rule Name

    Saisissez un identifiant unique pour la configuration d'inventaire. L'identifiant ne doit contenir que des lettres minuscules, des chiffres et des traits d'union (-), et ne doit ni commencer ni se terminer par un trait d'union (-).

    Destination bucket

    Spécifiez la destination de l'inventaire. Le bucket de destination doit se trouver dans la même région et appartenir au même compte Alibaba Cloud que le bucket source.

    • Pour enregistrer l'inventaire avec le préfixe exampledir1/ dans le bucket examplebucket, saisissez exampledir1/. Si le préfixe n'existe pas, OSS le crée automatiquement.

    • Si vous laissez ce champ vide, l'inventaire est enregistré dans le répertoire racine du bucket de destination.

    Important

    Pour éviter tout impact sur les services OSS-HDFS ou tout risque de corruption des données, ne définissez pas le préfixe de destination sur .dlsdata/ lors de la configuration d'un inventaire pour un bucket sur lequel OSS-HDFS est activé.

    Scope

    • Entire bucket : analyse tous les objets du bucket.

    • Object Prefix : analyse uniquement les objets possédant un préfixe spécifique, tel que exampledir1/.

    Encryption Method

    Indiquez si le fichier d'inventaire doit être chiffré.

    Frequency

    Sélectionnez la fréquence de génération de l'inventaire. Les options sont Weekly, Daily ou One-time export. Si le bucket contient plus de 10 milliards d'objets, sélectionnez Weekly pour réduire les coûts et la charge d'analyse.

    Optional Fields

    Sélectionnez les informations sur les objets à inclure dans l'inventaire :

    • System metadata : Object Size, Storage Class, Last Modified Date, ETag, TransitionTime, Multipart Upload Status, Encryption Status, Object ACL, Object Type, CRC64, Last Access Time et Last Access Timestamp.

      Remarque

      Pour exporter les champs Last Access Time et Last Access Timestamp, vous devez d'abord activer le suivi d'accès pour le bucket. Sinon, les valeurs de ces champs sont nulles.

    • Custom metadata : Number of Tags

    Advanced Filtering

    Important

    Les options de filtrage suivantes sont prises en charge uniquement dans les régions Chine (Qingdao), Chine (Hohhot) et Allemagne (Francfort).

    Pour filtrer les objets exportés par taille ou par date de dernière modification, activez l'option Advanced Filtering.

    Les options de filtrage disponibles sont les suivantes :

    • Advanced Filtering : définissez une heure de début et de fin pour la date de dernière modification des objets à exporter. L'heure est précise à la seconde près.

    • Time Range : définissez la taille minimale et maximale des objets à exporter.

      Important

      Les valeurs minimale et maximale doivent être supérieures à 0 B. La valeur maximale ne peut pas dépasser 48,8 To.

    • Object Size Range : spécifiez les classes de stockage à exporter. Vous pouvez exporter des objets appartenant aux classes de stockage Standard, Infrequent Access, Archive, Cold Archive et Deep Cold Archive.

    Storage Class

    Si la gestion des versions est activée pour le bucket, vous pouvez choisir d'exporter la Current version ou All versions.

  5. Cochez la case I understand and agree to grant Alibaba Cloud OSS the permissions to access bucket resources, puis cliquez sur Object Versions.

    Si le bucket contient un grand nombre d'objets, la génération de l'inventaire peut prendre un certain temps. Pour savoir comment vérifier si un inventaire a été généré, consultez la rubrique Comment vérifier si un inventaire a été généré ?.

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 {
        // In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the name of the bucket. Example: examplebucket. 
        String bucketName = "examplebucket";
        // Specify the name of the bucket in which you want to store the generated inventory lists. 
        String destBucketName ="yourDestinationBucketName";
        // Specify the account ID granted by the bucket owner. 
        String accountId ="yourDestinationBucketAccountId";
        // Specify the name of the RAM role that is granted the permissions to read all objects in the bucket for which you want to configure the inventory and the permissions to write data to the bucket in which you want to store the generated inventory lists. 
        String roleArn ="yourDestinationBucketRoleArn";
        // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
        String region = "cn-hangzhou";

        // Create an OSS Client instance. 
        // Call the shutdown method to release associated resources when the OSS Client is no longer in use.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Create an inventory. 
            InventoryConfiguration inventoryConfiguration = new InventoryConfiguration();

            // Specify the inventory name. 
            String inventoryId = "testid";
            inventoryConfiguration.setInventoryId(inventoryId);

            // Specify the object attributes that are included in inventory lists. 
            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);

            // Specify whether to generate inventory lists on a daily or weekly basis. The following code provides an example on how to generate the inventory lists on a weekly basis. Weekly indicates that the inventory lists are generated once a week and Daily indicates that the inventory lists are generated once a day. 
            inventoryConfiguration.setSchedule(new InventorySchedule().withFrequency(InventoryFrequency.Weekly));

            // Specify that the inventory lists include only the current version of objects. If you set the InventoryIncludedObjectVersions parameter to All, all versions of objects are included in the inventory lists. This configuration takes effect only when you enable versioning for the bucket. 
            inventoryConfiguration.setIncludedObjectVersions(InventoryIncludedObjectVersions.Current);

            // Specify whether the inventory is enabled. Valid values: true and false. Set the value to true to enable the inventory. Set the value to false to disable the inventory. 
            inventoryConfiguration.setEnabled(true);

            // Specify the rule used to filter the objects to include in the inventory lists. The following code provides an example on how to filter the objects by prefix. 
            InventoryFilter inventoryFilter = new InventoryFilter().withPrefix("obj-prefix");
            inventoryConfiguration.setInventoryFilter(inventoryFilter);

            // Specify the destination bucket in which you want to store the generated inventory lists. 
            InventoryOSSBucketDestination ossInvDest = new InventoryOSSBucketDestination();
            // Specify the prefix of the path in which you want to store the generated inventory lists. 
            ossInvDest.setPrefix("destination-prefix");
            // Specify the format of the inventory lists. 
            ossInvDest.setFormat(InventoryFormat.CSV);
            // Specify the ID of the account to which the destination bucket belongs. 
            ossInvDest.setAccountId(accountId);
            // Specify the role ARN of the destination bucket. 
            ossInvDest.setRoleArn(roleArn);
            // Specify the name of the destination bucket. 
            ossInvDest.setBucket(destBucketName);

            // The following code provides an example on how to encrypt the inventory lists by using customer master keys (CMKs) hosted in Key Management System (KMS). 
            // InventoryEncryption inventoryEncryption = new InventoryEncryption();
            // InventoryServerSideEncryptionKMS serverSideKmsEncryption = new InventoryServerSideEncryptionKMS().withKeyId("test-kms-id");
            // inventoryEncryption.setServerSideKmsEncryption(serverSideKmsEncryption);
            // ossInvDest.setEncryption(inventoryEncryption);

            // The following code provides an example on how to encrypt the inventory lists on the OSS server. 
            // InventoryEncryption inventoryEncryption = new InventoryEncryption();
            // inventoryEncryption.setServerSideOssEncryption(new InventoryServerSideEncryptionOSS());
            // ossInvDest.setEncryption(inventoryEncryption);

            // Specify the destination for the generated inventory lists. 
            InventoryDestination destination = new InventoryDestination();
            destination.setOssBucketDestination(ossInvDest);
            inventoryConfiguration.setDestination(destination);

            // Configure the inventory for the bucket. 
            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({
  // The region of the bucket. For example, for China (Hangzhou), use oss-cn-hangzhou.
  region: 'yourregion',
  // Obtain access credentials from environment variables. Before running this example, ensure the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // The name of the bucket.
  bucket: 'yourbucketname'
});

const inventory = {
  // The inventory ID.
  id: 'default', 
  // Specifies whether the inventory is enabled. Valid values: true and false.
  isEnabled: false, 
  // (Optional) The prefix for filtering objects.
  prefix: 'ttt',
  OSSBucketDestination: {
     // The format of the inventory.
    format: 'CSV',
   // The account ID of the destination bucket owner.
    accountId: '<Your AccountId>', 
   // The name of the role configured for the destination bucket.
    rolename: 'AliyunOSSRole',
    // The name of the destination bucket.
    bucket: '<Your BucketName>',
    // (Optional) The prefix for the destination storage path.
    prefix: '<Your Prefix>',
    // To encrypt the inventory by using SSE-OSS, use the following code.
    //encryption: {'SSE-OSS': ''},
    // To encrypt the inventory by using SSE-KMS, use the following code.
           /*
            encryption: {
      'SSE-KMS': {
        keyId: 'test-kms-id',
      }, 
    */
  },
  // The frequency at which the inventory is generated. `WEEKLY` generates a report once a week; `DAILY` generates one once a day.
  frequency: 'Daily', 
  // The object versions to include in the report. `All` includes all versions; `Current` includes only the current version.
  includedObjectVersions: 'All', 
  optionalFields: {
    // (Optional) The optional fields to include in the inventory.
    field: ["Size", "LastModifiedDate", "ETag", "StorageClass", "IsMultipartUploaded", "EncryptionStatus"]
  },
}

async function putInventory(){
  // The name of the bucket for which to add the inventory configuration.
  const bucket = '<Your BucketName>'; 
        try {
    await client.putBucketInventory(bucket, inventory);
    console.log('Inventory configuration added.')
  } catch(err) {
    console.log('Failed to add inventory configuration: ', err);
  }
}

putInventory()
import argparse
import alibabacloud_oss_v2 as oss

# Create a command line parameter parser and describe the purpose of the script. The example describes how to create an inventory for a bucket.
parser = argparse.ArgumentParser(description="put bucket inventory sample")

# Specify the command line parameters, including the required region, bucket name, endpoint, user ID, Alibaba Cloud Resource Name (ARN) of the RAM role, and inventory name.
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():
    # Parse the command line parameters to obtain the values specified by the user.
    args = parser.parse_args()

    # Obtain access credentials from environment variables for authentication.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Use the default configurations of the SDK to create a configuration object and specify the credential provider.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # Specify the region attribute of the configuration object based on the command line parameters specified by the user.
    cfg.region = args.region

    # If a custom endpoint is provided, modify the endpoint parameter in the configuration object.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Use the preceding configurations to initialize the OSSClient instance and allow the instance to interact with OSS.
    client = oss.Client(cfg)

    # Send a request to create an inventory for a bucket.
    result = client.put_bucket_inventory(oss.PutBucketInventoryRequest(
            bucket=args.bucket, # The name of the bucket.
            inventory_id=args.inventory_id, # The ID of the inventory.
            inventory_configuration=oss.InventoryConfiguration(
                included_object_versions='All', # Specify that inventory lists include all versions of objects.
                optional_fields=oss.OptionalFields(
                    fields=[ # The optional fields, such as the size and last modified time of objects.
                        oss.InventoryOptionalFieldType.SIZE,
                        oss.InventoryOptionalFieldType.LAST_MODIFIED_DATE,
                    ],
                ),
                id=args.inventory_id, # The ID of the inventory.
                is_enabled=True, # Specify whether to enable the inventory feature for the bucket. In this example, the inventory feature is enabled.
                destination=oss.InventoryDestination(
                    oss_bucket_destination=oss.InventoryOSSBucketDestination(
                        format=oss. InventoryFormatType.CSV, # Specify that the output format of the inventory lists is CSV.
                        account_id=args.user_id, # The account ID of the user.
                        role_arn=args.arn, # The ARN of the RAM role, which has the permissions to read the objects in the source bucket and write objects to the destination bucket.
                        bucket=f'acs:oss:::{args.bucket}', # The name of the destination bucket.
                        prefix='aaa', # Specify the prefix contained in the names of the objects that you want to include in inventory lists.
                    ),
                ),
                schedule=oss.InventorySchedule(
                    frequency=oss. InventoryFrequencyType.DAILY, # Specify whether to generate inventory lists on a daily or weekly basis. In this example, inventory lists are generated on a daily basis.
                ),
                filter=oss.InventoryFilter(
                    lower_size_bound=1024, # Specify the minimum size of the object that you want to include in inventory lists. Unit: bytes.
                    upper_size_bound=1048576, # Specify the maximum size of the object that you want to include in inventory lists. Unit: bytes.
                    storage_class='ColdArchive', # # Specify the storage classes of objects that you want to include in inventory lists.
                    prefix='aaa', # Specify the prefix that is used to filter inventories.
                    last_modify_begin_time_stamp=1637883649, # Specify the beginning of the time range during which the object was last modified.
                    last_modify_end_time_stamp=1638347592, # Specify the end of the time range during which the object was last modified.
                ),
            ),
    ))

    # Display the HTTP status code of the operation and request ID to check the request status.
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
    )

# Call the main function to start the processing logic when the script is directly run.
if __name__ == "__main__":
    main() # Specify the entry points in the functions of the script. The control program flow starts here.
using Aliyun.OSS;
using Aliyun.OSS.Common;

// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
var endpoint = "yourEndpoint";
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Specify the name of the bucket. 
var bucketName = "examplebucket";
// Specify the account ID granted by the bucket owner. 
var accountId ="yourDestinationBucketAccountId";
// Specify the name of the RAM role that is granted the permissions to read all objects in the bucket for which you want to configure the inventory and the permissions to write data to the bucket in which you want to store the generated inventory lists. 
var roleArn ="yourDestinationBucketRoleArn";
// Specify the name of the bucket in which you want to store the generated inventory lists. 
var destBucketName ="yourDestinationBucketName";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
const string region = "cn-hangzhou";

// Create a ClientConfiguration instance and modify the default parameters based on your requirements.
var conf = new ClientConfiguration();

// Use the signature algorithm V4.
conf.SignatureVersion = SignatureVersion.V4;

// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // Create an inventory for the bucket. 
    var config = new InventoryConfiguration();
    // Specify the name of the inventory. 
    config.Id = "report1";
    // Specify whether to enable the inventory for the bucket. Valid values: true and false. If this parameter is set to true, the inventory is enabled. 
    config.IsEnabled = true;
    // Specify the rule that is used to filter the objects included in inventory lists. The following code provides an example on how to filter the objects by prefix. 
    config.Filter = new InventoryFilter("filterPrefix");
    // Configure the bucket in which you want to store the generated inventory lists. 
    config.Destination = new InventoryDestination();
    config.Destination.OSSBucketDestination = new InventoryOSSBucketDestination();
    // Specify the format of the inventory lists. 
    config.Destination.OSSBucketDestination.Format = InventoryFormat.CSV;
    // Specify the ID of the account to which the destination bucket belongs. 
    config.Destination.OSSBucketDestination.AccountId = accountId;
    // Specify the Alibaba Cloud Resource Name (ARN) of the RAM role that is used to access the destination bucket. 
    config.Destination.OSSBucketDestination.RoleArn = roleArn;
    // Specify the name of the bucket in which you want to store the generated inventory lists. 
    config.Destination.OSSBucketDestination.Bucket = destBucketName;
    // Specify the prefix of the path in which you want to store the generated inventory lists. 
    config.Destination.OSSBucketDestination.Prefix = "prefix1";
    
    // Specify whether to generate the inventory lists on a daily or weekly basis. The following code provides an example on how to generate the inventory lists on a weekly basis. A value of Weekly indicates that the inventory lists are generated on a weekly basis. A value of Daily indicates that the inventory lists are generated on a daily basis. 
    config.Schedule = new InventorySchedule(InventoryFrequency.Daily);
    // Specify that the inventory lists include only the current versions of objects. If you set the InventoryIncludedObjectVersions parameter to All, all versions of objects are included in the inventory lists. This configuration takes effect only when versioning is enabled for the bucket. 
    config.IncludedObjectVersions = InventoryIncludedObjectVersions.All;
    
    // Specify the object attributes that are included in the inventory lists. 
    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)
{
    /* Initialize information about the account that is used to access OSS. */
            
    /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Specify the name of the bucket. Example: examplebucket. */
    std::string BucketName = "examplebucket";

    /* Initialize resources, such as network resources. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    InventoryConfiguration inventoryConf;
    /* Specify the name of the inventory. The name must be globally unique in the current bucket. */
    inventoryConf.setId("inventoryId");

    /* Specify whether to enable inventory for the bucket. Valid values: true and false. */
    inventoryConf.setIsEnabled(true);

    /* (Optional) Specify the prefix in the names of the objects. After you specify the prefix, information about the objects whose names contain the prefix is included in the inventory lists. */
    inventoryConf.setFilter(InventoryFilter("objectPrefix"));

    InventoryOSSBucketDestination dest;
    /* Specify the format of the exported inventory lists. */
    dest.setFormat(InventoryFormat::CSV);
    /* Specify the ID of the Alibaba Cloud account to which the bucket owner grants the permissions to perform the operation. */
    dest.setAccountId("10988548********");
    /* Specify the name of the RAM role to which the bucket owner grants permissions to perform the operation. */
    dest.setRoleArn("acs:ram::10988548********:role/inventory-test");
    /* Specify the bucket in which you want to store the generated inventory lists. */
    dest.setBucket("yourDstBucketName");
    /* Specify the prefix of the path in which you want to store the generated inventory lists. */
    dest.setPrefix("yourPrefix");
    /* (Optional) Specify the method that is used to encrypt inventory lists. Valid values: SSEOSS and SSEKMS. */
    //dest.setEncryption(InventoryEncryption(InventorySSEOSS()));
    //dest.setEncryption(InventoryEncryption(InventorySSEKMS("yourKmskeyId")));
    inventoryConf.setDestination(dest);

    /* Specify the time interval at which inventory lists are exported. Valid values: Daily and Weekly. */
    inventoryConf.setSchedule(InventoryFrequency::Daily);

    /* Specify whether to include all versions of objects or only the current versions of objects in the inventory lists. Valid values: All and Current. */
    inventoryConf.setIncludedObjectVersions(InventoryIncludedObjectVersions::All);

    /* (Optional) Specify the fields that are included in inventory lists based on your requirements. */
    InventoryOptionalFields field { 
        InventoryOptionalField::Size, InventoryOptionalField::LastModifiedDate, 
        InventoryOptionalField::ETag, InventoryOptionalField::StorageClass, 
        InventoryOptionalField::IsMultipartUploaded, InventoryOptionalField::EncryptionStatus
    };
    inventoryConf.setOptionalFields(field);

    /* Configure the inventory. */
    auto outcome = client.SetBucketInventoryConfiguration(
        SetBucketInventoryConfigurationRequest(BucketName, inventoryConf));

    if (!outcome.isSuccess()) {
        /* Handle exceptions. */
        std::cout << "Set Bucket Inventory fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Release resources, such as network resources. */
    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"
)

// Define global variables.
var (
	region     string // The region in which the bucket is located.
	bucketName string // The name of the bucket.
)

// Specify the init function used to initialize command line parameters.
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() {
	// Parse command line parameters.
	flag.Parse()

	var (
		accountId   = "account id of the bucket" // Specify the ID of the Alibaba Cloud account to which the bucket owner grants permissions to perform the operation. Example: 109885487000****.
		inventoryId = "inventory id"             // The name of the inventory. The name must be globally unique in the bucket.
	)

	// Check whether the name of the bucket is specified.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// Check whether the region is specified.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// Load the default configurations and specify the credential provider and region.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Create an OSS client.
	client := oss.NewClient(cfg)

	// Create a request to configure an inventory for the bucket.
	putRequest := &oss.PutBucketInventoryRequest{
		Bucket:      oss.Ptr(bucketName),  // The name of the bucket.
		InventoryId: oss.Ptr(inventoryId), // The name of the inventory specified by the user.
		InventoryConfiguration: &oss.InventoryConfiguration{
			Id:        oss.Ptr(inventoryId), // The name of the inventory specified by the user.
			IsEnabled: oss.Ptr(true),        // Enable the inventory.
			Filter: &oss.InventoryFilter{
				Prefix:                   oss.Ptr("filterPrefix"),    // Specify the rule that is used to filter the objects included in inventories.
				LastModifyBeginTimeStamp: oss.Ptr(int64(1637883649)), // The timestamp that specifies the start time of the last modification.
				LastModifyEndTimeStamp:   oss.Ptr(int64(1638347592)), // The timestamp that specifies the end time of the last modification.
				LowerSizeBound:           oss.Ptr(int64(1024)),       // The lower size limit of files (unit: bytes).
				UpperSizeBound:           oss.Ptr(int64(1048576)),    // The upper size limit of files (unit: bytes).
				StorageClass:             oss.Ptr("Standard,IA"),     // The storage class.
			},
			Destination: &oss.InventoryDestination{
				OSSBucketDestination: &oss.InventoryOSSBucketDestination{
					Format:    oss.InventoryFormatCSV,                                   // The format of the exported inventory lists.
					AccountId: oss.Ptr(accountId),                                       // Specify the ID of the account that is granted permissions by the bucket owner to perform the operation. Example: 109885487000****.
					RoleArn:   oss.Ptr("acs:ram::" + accountId + ":role/AliyunOSSRole"), // Specify the name of the RAM role that is granted permissions by the bucket owner to perform the operation. Example: acs:ram::109885487000****:role/ram-test.
					Bucket:    oss.Ptr("acs:oss:::" + bucketName),                       // Specify the name of the bucket in which you want to store the generated inventory lists.
					Prefix:    oss.Ptr("export/"),                                       // Specify the prefix of the path in which you want to store the generated inventory lists.
				},
			},
			Schedule: &oss.InventorySchedule{
				Frequency: oss.InventoryFrequencyDaily, // The frequency at which the inventory list is exported (daily).
			},
			IncludedObjectVersions: oss.Ptr("All"), // Specify whether to include all versions of objects or only the current versions of objects in the inventory list.
		},
	}

	// Execute the request.
	putResult, err := client.PutBucketInventory(context.TODO(), putRequest)
	if err != nil {
		log.Fatalf("failed to put bucket inventory %v", err)
	}

	// Display the result.
	log.Printf("put bucket inventory result:%#v\n", putResult)
}

ossutil

Créez un fichier nommé inventory-configuration.xml et ajoutez-y le contenu suivant :

<?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>

Exécutez la commande suivante :

ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration file://inventory-configuration.xml

Remarque : Pour plus d'informations sur la commande put-bucket-inventory, consultez put-bucket-inventory.

API

Appelez l'opération d'API PutBucketInventory pour configurer ou modifier une configuration d'inventaire. Cette méthode convient aux personnalisations avancées, car vous devez construire manuellement la requête HTTP et calculer la signature.

Analyse de l'inventaire

Les tâches d'inventaire s'exécutent de manière asynchrone. Chaque rapport d'inventaire est stocké dans son propre dossier, nommé selon l'heure de début de l'analyse. Les fichiers principaux incluent manifest.json et les fichiers de données .csv.gz situés dans le répertoire data/. Pour confirmer la fin de la tâche, vérifiez la présence du fichier manifest.json généré dans la destination.

  1. Analysez le fichier manifest.json : Analysez le fichier manifest.json pour obtenir l'ordre correct des colonnes et les informations sur les fichiers de données, en vous concentrant sur les deux champs suivants :

    • fileSchema : Chaîne définissant les noms des colonnes et leur ordre exact dans le fichier de données CSV.

    • files : Tableau répertoriant les détails de chaque fichier de données .csv.gz généré pour ce rapport, y compris :

      • key : Chemin du fichier

      • size : Taille du fichier

      • MD5checksum : Somme de contrôle MD5

  2. Analysez les fichiers de données CSV selon le fileSchema.

    1. Téléchargez et décompressez les fichiers de données : Pour chaque fichier de données présent dans le tableau files du fichier manifest.json, utilisez sa key (le chemin du fichier) pour télécharger l'archive .csv.gz correspondante. Décompressez l'archive pour obtenir les données au format CSV.

    2. Analysez les données dans l'ordre :

      Utilisez l'ordre des champs indiqué dans fileSchema comme en-têtes de colonne. Lisez le fichier CSV décompressé ligne par ligne. Chaque ligne représente un objet complet, et chaque colonne correspond à un champ défini dans fileSchema.

      Exemple de contenu CSV : Si la valeur de fileSchema est "Bucket,Key,Size,StorageClass,LastModifiedDate", le contenu CSV décompressé se présente comme suit :

      source-bucket,"dir%2Fbody.xml","102400","Standard","2025-04-14T07-06-00Z"
      source-bucket,"dest.png","312049","Standard","2025-04-14T07-05-59Z"
      La valeur de Key est encodée en URL et peut être décodée si nécessaire.

Fichier d'inventaire complet

Une fois la tâche d'inventaire configurée, OSS génère des fichiers d'inventaire en fonction de la période d'exportation définie dans la règle d'inventaire. La structure des répertoires pour les fichiers d'inventaire est la suivante :

<dest-bucket-name>/
└── <dest-prefix>/
    └── <source-bucket-name>/
        └── <inventory-id>/
            ├── YYYY-MM-DDTHH-MMZ/  (UTC timestamp when the scan started)
            │   ├── manifest.json   (Metadata file for the inventory task)
            │   └── manifest.checksum (MD5 checksum of the manifest.json file)
            └── data/
                └── <uuid>.csv.gz   (One or more GZIP-compressed inventory data files)

Structure des répertoires

Description

dest-prefix

Ce répertoire porte le nom du préfixe de rapport d'inventaire spécifié. Si aucun préfixe n'est indiqué, ce répertoire est omis.

source-bucket-name

Ce répertoire porte le nom du bucket source utilisé pour le rapport d'inventaire.

inventory-id

Ce répertoire porte le nom de la règle de la tâche d'inventaire.

YYYY-MM-DDTHH-MMZ

Ce répertoire utilise l'horodatage UTC de l'heure de début de l'analyse (par exemple, 2025-05-17T16-00Z). Il contient les fichiers manifest.json et manifest.checksum.

data

Ce répertoire contient les fichiers CSV d'inventaire compressés au format GZIP. Ces fichiers répertorient les objets du bucket source ainsi que leurs métadonnées associées.

Important
  • Pour les buckets sources contenant un grand nombre d'objets, l'inventaire est automatiquement divisé en plusieurs fichiers CSV compressés au format GZIP afin de faciliter le téléchargement et le traitement. Les fichiers sont nommés de manière séquentielle, par exemple uuid.csv.gz, uuid-1.csv.gz et uuid-2.csv.gz. Vous pouvez récupérer la liste des fichiers CSV à partir du fichier manifest.json, puis les décompresser et les lire dans l'ordre pour traiter les données d'inventaire.

  • L'enregistrement d'un objet unique n'est jamais réparti sur plusieurs fichiers d'inventaire.

Fichier manifeste

Le fichier manifeste se compose de manifest.json et de manifest.checksum, comme détaillé ci-dessous :

  • manifest.json : Contient les métadonnées et d'autres informations de base relatives à l'inventaire.

    {
        "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"
    }

    Le tableau suivant décrit chaque champ.

    Paramètre

    Description

    creationTimestamp

    Horodatage indiquant le début de l'analyse du bucket source.

    destinationBucket

    Bucket de destination qui stocke les fichiers d'inventaire.

    fileFormat

    Format du fichier d'inventaire.

    fileSchema

    Champs présents dans le fichier d'inventaire, classés en fixes et optionnels. L'ordre des champs fixes reste constant. L'ordre des champs optionnels dépend de celui dans lequel vous les avez sélectionnés lors de la configuration de la règle d'inventaire. Pour éviter toute incohérence, analysez les colonnes de données du fichier .csv.gz en respectant l'ordre des champs défini dans fileSchema.

    • Si vous sélectionnez la version actuelle pour la version de l'objet lors de la configuration d'une règle d'inventaire, le paramètre fileSchema liste d'abord les champs fixes Bucket, Key, suivis des champs optionnels.

    • Lorsque vous configurez une règle d'inventaire pour inclure toutes les versions d'objets, le paramètre fileSchema liste d'abord les champs fixes Bucket, Key, VersionId, IsLatest, IsDeleteMarker, suivis des champs optionnels.

    files

    Liste des fichiers d'inventaire. Chaque entrée spécifie la somme de contrôle MD5, la clé et la taille d'un fichier.

    sourceBucket

    Bucket source sur lequel la règle d'inventaire est configurée.

    version

    Version de l'inventaire.

  • manifest.checksum : Le fichier manifest.checksum contient le hachage MD5 du fichier manifest.json. Utilisez ce hachage pour vérifier l'intégrité du fichier manifest.json. Par exemple : F77449179760C3B13F1E76110F07****.

Inventaire complet

Le rapport d'inventaire est stocké dans le répertoire data/ et répertorie les fichiers exportés par la fonctionnalité d'inventaire. Voici un exemple :

image

Paramètre

Description

bucket

Bucket source sur lequel s'exécute la tâche d'inventaire.

key

Clé de l'objet.

Cette clé est encodée en URL et peut être décodée si nécessaire.

VersionId

ID de version de l'objet. Ce champ n'est présent que lorsque l'inventaire est configuré pour inclure toutes les versions d'objets.

  • Si le versioning est désactivé pour le bucket, ce champ est vide.

  • Si le versioning est activé pour le bucket, ce champ affiche le VersionId de l'objet.

IsLatest

Indique si la version de l'objet est la plus récente. Ce champ n'est présent que lorsque l'inventaire est configuré pour inclure toutes les versions d'objets.

  • Si le versioning est désactivé pour le bucket, ce champ a la valeur true.

  • Si le versioning est activé pour le bucket, ce champ a la valeur true pour la dernière version et false pour les versions précédentes.

IsDeleteMarker

Indique si la version de l'objet est un marqueur de suppression. Ce champ n'est présent que lorsque l'inventaire est configuré pour inclure toutes les versions d'objets.

  • Si le versioning est désactivé pour le bucket, ce champ a la valeur false.

  • Si le versioning est activé pour le bucket, ce champ a la valeur true si la version de l'objet est un marqueur de suppression, et false dans le cas contraire.

size

Taille de l'objet.

StorageClass

Classe de stockage de l'objet.

LastModifiedDate

Date de la dernière modification de l'objet, exprimée en temps universel coordonné (UTC), soit 8 heures de moins que l'heure de Pékin.

TransitionTime

Date à laquelle l'objet a été transféré vers la classe de stockage Cold Archive ou Deep Cold Archive par une règle de cycle de vie.

ETag

ETag de l'objet.

Identifiant du contenu de l'objet, généré lors de sa création.

  • Pour un objet créé avec l'opération PutObject, l'ETag correspond au hachage MD5 du contenu de l'objet.

  • Pour les objets créés par toute autre méthode, l'ETag est une valeur calculée unique et ne correspond pas au hachage MD5 du contenu.

IsMultipartUploaded

true si l'objet a été créé par un téléversement multipartie ; false dans le cas contraire.

EncryptionStatus

true si l'objet est chiffré ; false dans le cas contraire.

ObjectAcl

ACL de l'objet. ACL d'objet.

TaggingCount

Nombre de tags associés à l'objet.

ObjectType

Type d'objet. type d'objet.

CRC64

Somme de contrôle CRC64 de l'objet.

LastAccessDate

Dernière date d'accès à l'objet, exprimée en temps universel coordonné (UTC).

Remarque

Ce champ est disponible uniquement lorsque le suivi des accès est activé pour le bucket. Sinon, ce champ est nul.

LastAccessTimestamp

Dernière date d'accès à l'objet, sous forme d'horodatage Unix.

Remarque

Ce champ est disponible uniquement lorsque le suivi des accès est activé pour le bucket. Sinon, ce champ est nul.

Inventaire incrémentiel

Un inventaire incrémentiel s'exécute toutes les 10 minutes environ afin de capturer et de signaler les modifications apportées aux objets, notamment les créations, les mises à jour des métadonnées et les suppressions.

Configurer une règle d'inventaire

Console

  1. Connectez-vous à la console OSS.

  2. Accédez au bucket source pour lequel vous souhaitez générer un inventaire. Dans le volet de navigation de gauche, sélectionnez Data Management > Bucket Inventory.

  3. Sur la page Bucket Inventory, cliquez sur Bucket Inventory.

  4. Dans le panneau Create Inventory :

    1. Configurez les paramètres de la section Create Inventory.

      Parameter

      Description

      Basic Settings

      Définissez l'état de la tâche d'inventaire incrémentiel. Sélectionnez Status.

      Start

      Saisissez un nom pour la tâche d'inventaire. Le nom ne peut contenir que des lettres minuscules, des chiffres et des traits d'union (-), et ne doit ni commencer ni se terminer par un trait d'union.

      Rule Name

      Spécifiez le chemin de stockage du rapport d'inventaire. Le bucket source et le bucket de destination doivent appartenir au même compte Alibaba Cloud et se trouver dans la même région.

      • Pour enregistrer le rapport dans le chemin exampledir1/ du bucket examplebucket, saisissez exampledir1/. Si le chemin spécifié n'existe pas dans le bucket, OSS le crée automatiquement. Le préfixe du chemin de destination ne doit pas dépasser 128 caractères.

      • Si vous laissez ce champ vide, le rapport est enregistré dans le répertoire racine.

      Important

      Pour éviter tout impact sur OSS-HDFS et prévenir une éventuelle corruption des données, ne définissez pas le répertoire du rapport d'inventaire sur .dlsdata/ lors de la configuration d'une règle d'inventaire pour un bucket sur lequel OSS-HDFS est activé.

      Inventory Report Destination

      • Scan Scope : analyse tous les objets du bucket.

      • Scan Entire Bucket : analyse uniquement les objets dotés d'un préfixe spécifique, tel que exampledir1/.

    2. Dans la zone Object Prefix, activez l'option Track and Generate Incremental Metadata Updates et sélectionnez les champs Get Incremental Metadata Updates à exporter.

      Parameter

      Description

      Metadata Fields

      Sélectionnez les métadonnées d'objet à inclure dans le rapport.

      • Métadonnées d'événement : Metadata Fields, Serial Number, Event Type, Timestamp, User ID et Request ID.

      • Métadonnées système : Source IP, Object Size, Storage Class, Last Modified Date, ETag, type d'objet, ACL d'objet, Multipart Upload Status et CRC64.

  5. Cochez la case I acknowledge and agree to grant Alibaba Cloud OSS the permissions to access bucket resources, puis cliquez sur OK.

Ossutil

Créez un fichier nommé incremental-inventory.xml. La principale différence par rapport à une configuration d'inventaire complet réside dans l'ajout de la section <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>

Exécutez la commande suivante :

ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration file://inventory-configuration.xml
Remarque : Pour plus d'informations sur la commande put-bucket-inventory , consultez put-bucket-inventory .

API

Appelez l'opération PutBucketInventory pour configurer ou modifier une configuration d'inventaire. Cette méthode convient aux scénarios hautement personnalisés, car elle nécessite la construction manuelle d'une requête HTTP et le calcul d'une signature.

Analyser un rapport d'inventaire

Une fois la tâche d'inventaire terminée, OSS génère des fichiers de rapport dans le chemin spécifié du bucket de destination. Les fichiers principaux comprennent :

  • Un fichier manifest.json

  • Des fichiers de données .csv dans le répertoire data/

Pour confirmer l'achèvement de la tâche, vérifiez la présence du fichier manifest.json dans le bucket de destination.

Suivez ces étapes pour analyser le rapport :

  1. Lisez le fichier manifest.json : L'ordre des colonnes dans un rapport d'inventaire est dynamique et dépend des champs sélectionnés lors de la configuration de la règle d'inventaire. Vous devez d'abord analyser le champ fileSchema du fichier manifest.json. Ce champ définit le nom et l'ordre de chaque colonne du fichier CSV.

  2. Analysez les fichiers de données CSV en fonction du schéma fileSchema

    • Utilisez l'ordre défini dans fileSchema comme en-têtes de colonne pour le fichier CSV.

    • Lisez le fichier CSV ligne par ligne. Chaque ligne représente un enregistrement d'objet complet et chaque colonne correspond à un champ déclaré dans fileSchema.

Fichiers d'inventaire incrémentiel

Après avoir configuré une tâche d'inventaire, OSS génère des fichiers d'inventaire à la fréquence spécifiée dans la règle d'inventaire. La structure des répertoires des fichiers d'inventaire est la suivante :

<dest-bucket-name>/
└── <dest-prefix>/
    └── <source-bucket-name>/
       └── <inventory-id>/
          └── incremental_inventory/
             └── YYYY-MM-DDTHH-MMSSZ/
                 ├── manifest.json  
                 └── data/
                     ├── uuid1_0.csv
                     └── ......
|
**Structure des répertoires**
|
**Description**
| | --- | --- | |
dest-prefix
|
Ce répertoire est généré en fonction du préfixe spécifié pour le rapport d'inventaire. Si aucun préfixe n'est spécifié, ce répertoire est omis.
| |
source-bucket-name
|
Ce répertoire est généré en fonction du nom du bucket source.
| |
inventory_id
|
Ce répertoire porte le nom de la règle d'inventaire.
| |
incremental_inventory
|
Préfixe fixe pour l'inventaire incrémentiel, permettant de le distinguer d'un inventaire complet.
| |
YYYY-MM-DDTHH-MMSSZ
|
Horodatage UTC standard indiquant le début de l'analyse du bucket. Exemple : 2020-05-17T16-0000Z.
| |
data
|
Ce répertoire contient les fichiers d'inventaire au format CSV. Les fichiers répertorient les objets et leurs métadonnées qui ont été modifiés dans le bucket source pendant la période spécifiée.
|



























Fichier manifeste

{
    "startTimestamp": "1759320000",
    "endTimestamp": "1759320600",
    "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/5b7c6cf0db490db906c60e87b917b148_5550506986a37a62abce56a83db6736d_0.csv",
            "size": 2046}],
    "sourceBucket": "srcbucket",
    "version": "2025-09-30"
}

Le tableau suivant décrit chaque champ.

Champ

Description

startTimestamp

Horodatage indiquant le début de la fenêtre temporelle couverte par ce rapport d'inventaire incrémentiel.

endTimestamp

Horodatage indiquant la fin de la fenêtre temporelle couverte par ce rapport d'inventaire incrémentiel.

destinationBucket

Bucket de destination où sont stockés les fichiers d'inventaire.

fileFormat

Format du fichier d'inventaire.

fileSchema

Spécifie les champs présents dans le fichier d'inventaire. Le schéma comprend des champs fixes, dont l'ordre est constant, et des champs facultatifs, dont l'ordre dépend de la séquence de sélection lors de la configuration de la règle. Pour éviter toute incompatibilité de colonnes, analysez toujours les données CSV en fonction de l'ordre des champs défini dans fileSchema.

  • Si vous sélectionnez Current Version pour Object Version lors de la configuration d'une règle d'inventaire, le fileSchema commence par les champs fixes Bucket, Key, suivis des champs facultatifs.

  • Si vous sélectionnez All Versions pour Object Version lors de la configuration d'une règle d'inventaire, le fileSchema commence par les champs fixes Bucket, Key, VersionId, IsDeleteMarker, suivis des champs facultatifs.

files

Liste contenant la somme de contrôle MD5, la clé complète et la taille de chaque fichier d'inventaire.

sourceBucket

Bucket source pour lequel la règle d'inventaire est configurée.

version

Version de l'inventaire.

Champs du rapport d'inventaire incrémentiel

Type de métadonnées

Champ

Description

Métadonnées système

Bucket

Le nom du bucket source sur lequel s'exécute la tâche d'inventaire.

Métadonnées d'événement

Numéro de séquence

Un numéro de séquence unique pour chaque enregistrement. Le tri des enregistrements relatifs au même objet par SequenceNumber préserve généralement l'ordre chronologique.

Type d'enregistrement

Le type d'enregistrement : CREATE, UPDATE_METADATA ou DELETE.

  • CREATE : inclut toutes les méthodes de téléchargement sous le préfixe sélectionné, telles que PutObject, PostObject, AppendObject, MultipartUpload et CopyObject.

  • UPDATE_METADATA : inclut toutes les mises à jour de métadonnées pour les objets situés sous le préfixe sélectionné.

  • DELETE : inclut toutes les méthodes de suppression d'objets sous le préfixe sélectionné, telles que DeleteObject, DeleteMultipleObjects, la création d'un marqueur de suppression lorsque le versioning est activé, ainsi que les suppressions basées sur le cycle de vie. Les suppressions peuvent être soit des marqueurs de suppression, soit des suppressions définitives. Pour une suppression définitive, l'enregistrement ne conserve que les champs principaux Bucket, Key, SequenceNumber, RecordType, RecordTimestamp et VersionId. Toutes les autres colonnes sont vides.

Horodatage de l'enregistrement

Un horodatage UTC avec une précision à la milliseconde. Exemple : « 2024-08-25 18:08:01.024 ».

Demandeur

L'ID Alibaba Cloud ou l'ID principal du demandeur.

ID de demande

L'identifiant unique de la demande.

IP source

L'adresse IP source du demandeur.

Métadonnées système

Key

Le nom de l'objet dans le bucket. Ce nom est encodé en URL.

ID de version

L'ID de version de l'objet. Ce champ n'est inclus que si la règle d'inventaire est configurée pour exporter toutes les versions.

  • Si le versioning est désactivé pour le bucket, ce champ est vide.

  • Si le versioning est activé pour le bucket, ce champ affiche le VersionId de l'objet.

Est un marqueur de suppression

Indique si la version de l'objet est un marqueur de suppression. Ce champ n'est inclus que si la règle d'inventaire est configurée pour exporter toutes les versions.

  • Si le versioning est désactivé pour le bucket, ce champ prend par défaut la valeur false.

  • Si le versioning est activé et que la version de l'objet est un marqueur de suppression, ce champ est défini sur true. Si la version de l'objet n'est pas un marqueur de suppression, ce champ est défini sur false.

Taille

La taille de l'objet en octets.

Classe de stockage

La classe de stockage de l'objet.

Date de dernière modification

L'heure de la dernière modification de l'objet. L'heure est exprimée en UTC, soit 8 heures de retard par rapport à l'heure de Pékin (UTC+8).

ETag

Une balise d'entité (ETag) qui identifie le contenu de l'objet.

  • Pour les objets créés à l'aide de l'opération PutObject, la valeur ETag correspond au hachage MD5 du contenu de l'objet.

  • Pour les objets créés par d'autres méthodes, la valeur ETag est une valeur unique générée selon une règle de calcul spécifique, mais il ne s'agit pas du hachage MD5 du contenu de l'objet.

Est issu d'un téléchargement multipartie

Indique si l'objet a été créé via un téléchargement multipartie. La valeur true signifie que c'est le cas ; la valeur false signifie que ce n'est pas le cas.

État de chiffrement

Indique si l'objet est chiffré. La valeur true signifie qu'il l'est ; la valeur false signifie qu'il ne l'est pas.

ACL de l'objet

L'ACL de l'objet. ACL de l'objet.

Type d'objet

Le type de l'objet. Pour plus d'informations, consultez la section Types d'objets.

CRC64

La valeur CRC64 de l'objet.

Limites

Chaque bucket prend en charge jusqu'à 1 000 règles d'inventaire via l'API ou le SDK, ou 10 via la console.

Facturation

Le service d'inventaire de bucket est gratuit, mais les frais suivants s'appliquent :

  • Frais de requêtes API : requêtes Put et Get pour configurer ou récupérer les règles d'inventaire. Requêtes PUT lorsqu'OSS écrit les rapports dans le bucket de destination. Requêtes GET lorsque vous téléchargez les rapports.

  • Frais de stockage : des frais de stockage Standard s'appliquent aux rapports d'inventaire (fichiers manifest et csv.gz ou csv) stockés dans le bucket de destination.

  • Frais de trafic sortant : le téléchargement des rapports d'inventaire depuis un endpoint public entraîne des frais de trafic sortant.

  • Supprimez les règles d'inventaire dont vous n'avez plus besoin et utilisez des règles de cycle de vie pour nettoyer automatiquement les fichiers de rapport expirés.

Recommandations de production

Bonnes pratiques

  • Privilège minimal : utilisez toujours un rôle RAM dédié avec le principe du privilège minimal. N'utilisez jamais AliyunOSSRole dans un environnement de production.

  • Recommandation en matière de performances : pour les buckets source à fort trafic, stockez les rapports d'inventaire dans un bucket distinct afin d'éviter toute contention de bande passante avec les services en ligne.

  • Optimisation des coûts : pour les buckets contenant plus de dix milliards d'objets, utilisez des exports hebdomadaires. Configurez une règle de cycle de vie sur le bucket de destination pour supprimer automatiquement les rapports datant de plus d'un nombre de jours spécifié, par exemple 30 jours.

    Nombre d'objets

    Recommandation d'exportation

    <10 milliards

    Configurez des exports quotidiens ou hebdomadaires selon vos besoins

    10 à 50 milliards

    Export hebdomadaire

    ≥50 milliards

    • Effectuez des exports par lots en faisant correspondre les préfixes

    • pour augmenter la limite d'exportation

  • Partitionnement par préfixe : pour les buckets extrêmement volumineux (centaines de milliards d'objets), créez plusieurs règles d'inventaire basées sur les préfixes métier afin de générer des rapports selon une approche diviser pour mieux régner.

Prévention des risques

  • Audit des données : un rapport d'inventaire peut ne pas répertorier tous les objets. Le rapport inclut les objets dont l'heure de dernière modification est antérieure à createTimeStamp dans manifest.json. Les objets modifiés après cet horodatage peuvent être exclus. Avant d'agir sur les données d'inventaire, vérifiez les propriétés actuelles de l'objet via l'API HeadObject.

  • Surveillance et alertes : surveillez l'utilisation du stockage du bucket de destination pour éviter une explosion incontrôlée des coûts. Surveillez les appels API tels que PutBucketInventory pour suivre les modifications de configuration.

  • Gestion des changements : les modifications apportées à une règle d'inventaire (préfixe, fréquence, etc.) peuvent affecter les workflows d'analyse de données en aval. Intégrez ces changements dans vos processus de contrôle de version et de revue.

FAQ