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 :
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.
-
Accordez au rôle RAM l'autorisation d'écrire dans le compartiment de destination :
-
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-bucketpar le nom de votre compartiment de destination.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": [ "acs:oss:*:*:dest-bucket/*" ] } ] } (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
AliyunKMSCryptoUserAccessou des autorisations KMS plus fines.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.
-
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
Connectez-vous à la console de gestion OSS.
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.
Sur la page Bucket Inventory, cliquez sur Create Inventory.
-
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 bucketexamplebucket, saisissezexampledir1/. 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.
ImportantPour é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é.
-
None : l'inventaire n'est pas chiffré.
-
AES256 : chiffre l'inventaire à l'aide de l'algorithme de chiffrement AES256.
-
KMS : chiffre l'inventaire à l'aide d'une clé KMS. Vous pouvez utiliser une clé KMS gérée par OSS ou créer une clé KMS dans la même région que le bucket de destination.
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.
RemarquePour 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
ImportantLes 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.
ImportantLes 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.
-
-
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(®ion, "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.
-
Analysez le fichier manifest.json : Analysez le fichier
manifest.jsonpour 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.gzgénéré pour ce rapport, y compris :key: Chemin du fichiersize: Taille du fichierMD5checksum: Somme de contrôle MD5
-
Analysez les fichiers de données CSV selon le fileSchema.
Téléchargez et décompressez les fichiers de données : Pour chaque fichier de données présent dans le tableau
filesdu fichiermanifest.json, utilisez sakey(le chemin du fichier) pour télécharger l'archive.csv.gzcorrespondante. Décompressez l'archive pour obtenir les données au format CSV.-
Analysez les données dans l'ordre :
Utilisez l'ordre des champs indiqué dans
fileSchemacomme 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 dansfileSchema.Exemple de contenu CSV : Si la valeur de
fileSchemaest"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
Keyest 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
|
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.checksumcontient le hachage MD5 du fichiermanifest.json. Utilisez ce hachage pour vérifier l'intégrité du fichiermanifest.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 :

|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
Connectez-vous à la console OSS.
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.
Sur la page Bucket Inventory, cliquez sur Bucket Inventory.
-
Dans le panneau Create Inventory :
-
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.
ImportantPour é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/.
-
-
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.
-
-
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.jsonDes fichiers de données
.csvdans le répertoiredata/
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 :
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
fileSchemadu fichiermanifest.json. Ce champ définit le nom et l'ordre de chaque colonne du fichier CSV.-
Analysez les fichiers de données CSV en fonction du schéma fileSchema
Utilisez l'ordre défini dans
fileSchemacomme 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
|
|
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 |
|
Type d'enregistrement |
Le type d'enregistrement : CREATE, UPDATE_METADATA ou DELETE.
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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
PutetGetpour 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
manifestetcsv.gzoucsv) 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
AliyunOSSRoledans 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 à
createTimeStampdans 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
PutBucketInventorypour 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.