警告
为避免影响OSS-HDFS服务的正常使用或者引发数据污染的风险,在开通了OSS-HDFS服务的Bucket设置清单报告规则时,禁止将清单报告目录填写为.dlsdata/
。
计费说明
Bucket清单功能本身不会收取费用,但使用该功能时涉及调用PutBucketInventory、GetBucketInventory、ListBucketInventory、DeleteBucketInventory API接口,将会产生接口相关的请求费用,清单结果文件的存储费用,以及正常读取清单结果文件的流量和请求费用。
在您删除清单规则前,OSS会按照清单规则一直生成清单文件,会产生一定的存储费用。为避免产生不必要的费用,请及时清理不再需要的清单文件。
权限说明
使用Bucket清单功能时,涉及创建清单规则以及向目标Bucket写入清单结果文件的操作。创建清单规则的操作由用户完成,向目标Bucket写入清单结果文件的操作是OSS服务通过扮演用户创建的RAM角色来完成。
您可以通过以下步骤为RAM用户授权,创建RAM角色并为RAM角色授权。授权完成后,您可以创建清单规则。具体操作,请参见创建清单规则。
重要
考虑到授予RAM用户创建CreateRole
、GetRoles
等角色相关的权限风险较大,您可以通过RAM用户关联的阿里云账号创建RAM角色并为相应的RAM角色完成授权。授权完成后,RAM用户可以直接复用阿里云账号创建的RAM角色。
操作方式
使用OSS控制台
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择。
在Bucket 清单页面,单击创建清单。
在设置清单报告规则面板,按以下说明配置各项参数。
参数 | 说明 |
状态 | 设置清单任务的状态。可以选择启动和禁用。 |
规则名称 | 设置清单任务的名称。只能包含小写字母、数字、短划线(-),且不能以短划线(-)开头或结尾。 |
存储清单 Bucket | 选择存储清单文件的Bucket。 配置清单的源Bucket与存放清单文件的目标Bucket可以相同也可以不同,但是必须属于同一账号下的相同地域。 |
清单报告存储路径 | 设置清单报告存储路径。 如果要将清单报告保存在Bucket根目录下,请将此项置空。 如果要将清单报告保存在Bucket非根目录下,请填写不包含Bucket名称在内的完整路径。 例如,当您需要将清单报告保存在存储空间examplebucket的exampledir1路径下,则填写为exampledir1。当您需要将清单报告保存在存储空间examplebucket的exampledir1/exampledir2路径下,则填写为exampledir1/exampledir2。
说明 如果Bucket中不存在指定的清单报告存储路径,OSS会根据填写的清单报告存储路径自动创建对应的路径。 |
清单报告导出周期 | 设置清单报告的生成周期。可选择每周或每天。 |
清单报告加密选项 | 是否加密清单文件。 |
清单内容 | 选择您希望导出的文件信息,包括Object大小、存储类型、最后更新时间、ETag、分片上传状态、加密状态、Object ACL、标签个数、文件类型、Crc64。 |
按前缀匹配 | 设置清单规则扫描Object的前缀。 如果要扫描整个Bucket内的所有Object,请将此项置空。 如果要扫描Bucket某个路径下的所有Object,请填写不包含Bucket名称在内的完整路径。 例如,当您需要扫描存储空间examplebucket的exampledir1路径下的所有Object,则填写为exampledir1/。如果您需要扫描examplebucket的exampledir1/exampledir2路径下的所有Object,则填写为exampledir1/exampledir2/。
说明 如果设置的前缀没有匹配Bucket内的任意Object,则不生成清单文件。 |
配置高级筛选功能 | 如果您需要根据文件大小、存储类型等条件过滤导出的文件,需要打开配置高级筛选功能开关。支持的过滤选项说明如下: 重要 仅华北1(青岛)、华北5(呼和浩特)和德国(法兰克福)地域支持配置以下过滤选项。 时间范围:设置待导出文件最后一次修改的起始日期和结束日期,时间精确到秒。 文件大小范围:设置待导出文件的文件大小最小值和最大值。 重要 设置文件大小范围时,确保文件大小的最小值以及最大值均大于0 B,且最大值不超过48.8 TB。 存储类型:设置待导出哪些存储类型的文件。您可以选择导出标准存储、低频访问、归档存储、冷归档存储以及深度冷归档存储的文件。
|
对象版本 | 选择清单扫描的文件版本。 如果Bucket已开启版本控制,可选择导出目标文件的当前版本或所有版本。更多信息,请参见版本控制。 如果Bucket未开启版本控制,默认导出所有文件。 |
选中我知晓并同意授予阿里云 OSS 服务访问 Bucket 资源的权限,然后单击确定。
使用阿里云SDK
以下仅列举常见SDK配置Bucket清单的代码示例。关于其他SDK的配置Bucket清单代码示例,请参见SDK简介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
String bucketName = "examplebucket";
String destBucketName ="yourDestinationBucketName";
String accountId ="yourDestinationBucketAccountId";
String roleArn ="yourDestinationBucketRoleArn";
String region = "cn-hangzhou";
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
InventoryConfiguration inventoryConfiguration = new InventoryConfiguration();
String inventoryId = "testid";
inventoryConfiguration.setInventoryId(inventoryId);
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);
inventoryConfiguration.setSchedule(new InventorySchedule().withFrequency(InventoryFrequency.Weekly));
inventoryConfiguration.setIncludedObjectVersions(InventoryIncludedObjectVersions.Current);
inventoryConfiguration.setEnabled(true);
InventoryFilter inventoryFilter = new InventoryFilter().withPrefix("obj-prefix");
inventoryConfiguration.setInventoryFilter(inventoryFilter);
InventoryOSSBucketDestination ossInvDest = new InventoryOSSBucketDestination();
ossInvDest.setPrefix("destination-prefix");
ossInvDest.setFormat(InventoryFormat.CSV);
ossInvDest.setAccountId(accountId);
ossInvDest.setRoleArn(roleArn);
ossInvDest.setBucket(destBucketName);
InventoryDestination destination = new InventoryDestination();
destination.setOssBucketDestination(ossInvDest);
inventoryConfiguration.setDestination(destination);
ossClient.setBucketInventoryConfiguration(bucketName, inventoryConfiguration);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
const OSS = require('ali-oss');
const client = new OSS({
region: 'yourregion',
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'yourbucketname'
});
const inventory = {
id: 'default',
isEnabled: false,
prefix: 'ttt',
OSSBucketDestination: {
format: 'CSV',
accountId: '<Your AccountId>',
rolename: 'AliyunOSSRole',
bucket: '<Your BucketName>',
prefix: '<Your Prefix>',
},
frequency: 'Daily',
includedObjectVersions: 'All',
optionalFields: {
field: ["Size", "LastModifiedDate", "ETag", "StorageClass", "IsMultipartUploaded", "EncryptionStatus"]
},
}
async function putInventory(){
const bucket = '<Your BucketName>';
try {
await client.putBucketInventory(bucket, inventory);
console.log('清单配置添加成功')
} catch(err) {
console.log('清单配置添加失败: ', err);
}
}
putInventory()
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import (InventoryConfiguration,
InventoryFilter,
InventorySchedule,
InventoryDestination,
InventoryBucketDestination,
INVENTORY_INCLUDED_OBJECT_VERSIONS_CURRENT,
INVENTORY_FREQUENCY_DAILY,
INVENTORY_FORMAT_CSV,
FIELD_SIZE,
FIELD_LAST_MODIFIED_DATE,
FIELD_STORAG_CLASS,
FIELD_ETAG,
FIELD_IS_MULTIPART_UPLOADED,
FIELD_ENCRYPTION_STATUS)
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
region = "cn-hangzhou"
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
account_id = 'yourtBucketDestinationAccountId'
role_arn = 'yourBucketDestinationRoleArn'
dest_bucket_name = 'yourDestinationBucketName'
inventory_id = "inventory1"
optional_fields = [FIELD_SIZE, FIELD_LAST_MODIFIED_DATE, FIELD_STORAG_CLASS,
FIELD_ETAG, FIELD_IS_MULTIPART_UPLOADED, FIELD_ENCRYPTION_STATUS]
bucket_destination = InventoryBucketDestination(
account_id=account_id,
role_arn=role_arn,
bucket=dest_bucket_name,
inventory_format=INVENTORY_FORMAT_CSV,
prefix='destination-prefix',
)
inventory_configuration = InventoryConfiguration(
inventory_id=inventory_id,
is_enabled=True,
inventory_schedule=InventorySchedule(frequency=INVENTORY_FREQUENCY_DAILY),
included_object_versions=INVENTORY_INCLUDED_OBJECT_VERSIONS_CURRENT,
inventory_filter=InventoryFilter(
"obj-prefix",
1637883649,
1638347592,
1024,
1048576,
'Standard,IA'),
optional_fields=optional_fields,
inventory_destination=InventoryDestination(bucket_destination=bucket_destination))
result = bucket.put_bucket_inventory_configuration(inventory_configuration)
print(result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
var endpoint = "yourEndpoint";
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
var bucketName = "examplebucket";
var accountId ="yourDestinationBucketAccountId";
var roleArn ="yourDestinationBucketRoleArn";
var destBucketName ="yourDestinationBucketName";
const string region = "cn-hangzhou";
var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var config = new InventoryConfiguration();
config.Id = "report1";
config.IsEnabled = true;
config.Filter = new InventoryFilter("filterPrefix");
config.Destination = new InventoryDestination();
config.Destination.OSSBucketDestination = new InventoryOSSBucketDestination();
config.Destination.OSSBucketDestination.Format = InventoryFormat.CSV;
config.Destination.OSSBucketDestination.AccountId = accountId;
config.Destination.OSSBucketDestination.RoleArn = roleArn;
config.Destination.OSSBucketDestination.Bucket = destBucketName;
config.Destination.OSSBucketDestination.Prefix = "prefix1";
config.Schedule = new InventorySchedule(InventoryFrequency.Daily);
config.IncludedObjectVersions = InventoryIncludedObjectVersions.All;
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)
{
std::string Endpoint = "yourEndpoint";
std::string Region = "yourRegion";
std::string BucketName = "examplebucket";
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
InventoryConfiguration inventoryConf;
inventoryConf.setId("inventoryId");
inventoryConf.setIsEnabled(true);
inventoryConf.setFilter(InventoryFilter("objectPrefix"));
InventoryOSSBucketDestination dest;
dest.setFormat(InventoryFormat::CSV);
dest.setAccountId("10988548********");
dest.setRoleArn("acs:ram::10988548********:role/inventory-test");
dest.setBucket("yourDstBucketName");
dest.setPrefix("yourPrefix");
inventoryConf.setDestination(dest);
inventoryConf.setSchedule(InventoryFrequency::Daily);
inventoryConf.setIncludedObjectVersions(InventoryIncludedObjectVersions::All);
InventoryOptionalFields field {
InventoryOptionalField::Size, InventoryOptionalField::LastModifiedDate,
InventoryOptionalField::ETag, InventoryOptionalField::StorageClass,
InventoryOptionalField::IsMultipartUploaded, InventoryOptionalField::EncryptionStatus
};
inventoryConf.setOptionalFields(field);
auto outcome = client.SetBucketInventoryConfiguration(
SetBucketInventoryConfigurationRequest(BucketName, inventoryConf));
if (!outcome.isSuccess()) {
std::cout << "Set Bucket Inventory fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
ShutdownSdk();
return 0;
}
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse()
var (
accountId = "account id of the bucket"
inventoryId = "inventory id"
)
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
putRequest := &oss.PutBucketInventoryRequest{
Bucket: oss.Ptr(bucketName),
InventoryId: oss.Ptr(inventoryId),
InventoryConfiguration: &oss.InventoryConfiguration{
Id: oss.Ptr(inventoryId),
IsEnabled: oss.Ptr(true),
Filter: &oss.InventoryFilter{
Prefix: oss.Ptr("filterPrefix"),
LastModifyBeginTimeStamp: oss.Ptr(int64(1637883649)),
LastModifyEndTimeStamp: oss.Ptr(int64(1638347592)),
LowerSizeBound: oss.Ptr(int64(1024)),
UpperSizeBound: oss.Ptr(int64(1048576)),
StorageClass: oss.Ptr("Standard,IA"),
},
Destination: &oss.InventoryDestination{
OSSBucketDestination: &oss.InventoryOSSBucketDestination{
Format: oss.InventoryFormatCSV,
AccountId: oss.Ptr(accountId),
RoleArn: oss.Ptr("acs:ram::" + accountId + ":role/AliyunOSSRole"),
Bucket: oss.Ptr("acs:oss:::" + bucketName),
Prefix: oss.Ptr("export/"),
},
},
Schedule: &oss.InventorySchedule{
Frequency: oss.InventoryFrequencyDaily,
},
IncludedObjectVersions: oss.Ptr("All"),
},
}
putResult, err := client.PutBucketInventory(context.TODO(), putRequest)
if err != nil {
log.Fatalf("failed to put bucket inventory %v", err)
}
log.Printf("put bucket inventory result:%#v\n", putResult)
}
使用命令行工具ossutil
您可以使用命令行工具ossutil来配置Bucket清单,ossutil的安装请参见安装ossutil。
以下命令用于在存储空间 examplebucket
中配置了一项名为 report1
的清单任务,任务每天生成,以 CSV 格式存储到 destbucket
下的指定前缀路径 prefix1/
。清单仅包含时间戳、大小和存储类型符合筛选条件的对象,并包含指定的字段信息。
ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration "{\"Id\":\"report1\",\"IsEnabled\":\"true\",\"Filter\":{\"Prefix\":\"Pics/\",\"LastModifyBeginTimeStamp\":\"1637883649\",\"LastModifyEndTimeStamp\":\"1638347592\",\"LowerSizeBound\":\"1024\",\"UpperSizeBound\":\"1048576\",\"StorageClass\":\"Standard,IA\"},\"Destination\":{\"OSSBucketDestination\":{\"Format\":\"CSV\",\"AccountId\":\"100000000000000\",\"RoleArn\":\"acs:ram::100000000000000:role/AliyunOSSRole\",\"Bucket\":\"acs:oss:::destbucket\",\"Prefix\":\"prefix1/\",\"Encryption\":{\"SSE-KMS\":{\"KeyId\":\"keyId\"}}}},\"Schedule\":{\"Frequency\":\"Daily\"},\"IncludedObjectVersions\":\"All\",\"OptionalFields\":{\"Field\":[\"Size\",\"LastModifiedDate\",\"ETag\",\"StorageClass\",\"IsMultipartUploaded\",\"EncryptionStatus\"]}}"
关于该命令的更多信息,请参见put-bucket-policy。
清单文件
清单任务配置完成后,OSS会按清单规则指定的导出周期生成清单文件。清单文件的目录结构如下:
dest_bucket
└──destination-prefix/
└──src_bucket/
└──inventory_id/
├──YYYY-MM-DDTHH-MMZ/
│ ├──manifest.json
│ └──manifest.checksum
└──data/
└──745a29e3-bfaa-490d-9109-47086afcc8f2.csv.gz
目录结构 | 说明 |
destination-prefix/ | 该目录根据设置的清单报告名前缀生成,如果清单报告名前缀设置为空,将省略该目录。 |
src_bucket/ | 该目录根据配置清单报告的源Bucket名生成。 |
inventory_id/ | 该目录根据清单任务的规则名称生成。 |
YYYY-MM-DDTHH-MMZ/ | 该目录是标准的格林威治时间戳,表示开始扫描Bucket的时间,例如2020-05-17T16-00Z。该目录下包含了manifest.json和manifest.checksum文件。 |
data/ | 该目录下存放了包含源Bucket中的对象列表以及每个对象的元数据的清单文件,清单文件格式为使用GZIP压缩的CSV文件。 重要 当导出的源Bucket中Object数量较多时,为方便用户下载和处理数据,程序会自动将清单文件切分成多个CSV压缩文件。CSV压缩文件按照uuid.csv.gz、uuid-1.csv.gz、uuid-2.csv.gz的顺序依次递增。您可以从manifest.json文件中获取CSV文件列表,然后按照以上顺序依次解压CSV文件并读取清单数据。 Object的单条记录信息仅出现在一个清单文件内,不会分布到不同的清单文件。
|
清单功能生成的具体文件说明如下:
manifest文件
manifest文件包含manifest.json和manifest.checksum,详细说明如下:
清单报告
清单报告存储在data/目录中,包含清单功能导出的文件信息。清单报告示例如下:
![DCDD87B7-7499-4D22-B684-8B25B6F1C232.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/8779410171/p775051.png)
清单报告具体的字段顺序取决于您配置清单规则时的清单内容字段排列顺序。以上清单报告示例中,各字段按从左到右的顺序说明如下。
字段名称 | 说明 |
Bucket | 执行清单任务的源Bucket名称。 |
Key | Bucket中Object的名称。 Object名称使用URL编码,您必须解码后查看。 |
VersionId | Object的版本ID。 仅当Bucket已开启版本控制功能,且您配置的清单规则为导出所有版本时出现此字段。 |
IsLatest | Object版本是否为最新版本。当版本为最新版本时取值为True,否则取值为False。 仅当Bucket已开启版本控制功能,且您配置的清单规则为导出所有版本时出现此字段。 |
IsDeleteMarker | Object版本是否为删除标记。当版本为删除标记时取值为True,否则取值为False。 仅当Bucket已开启版本控制功能,且您配置的清单规则为导出所有版本时出现此字段。 |
Size | Object大小。 |
StorageClass | Object的存储类型。 |
LastModifiedDate | Object的最后修改时间,格式是格林威治时间,与北京时间相差8小时。 |
ETag | Object的ETag。 Object生成时会创建相应的ETag,用于标识一个Object的内容。 |
IsMultipartUploaded | Object是否通过分片上传生成。如果是,则该字段值为True,否则为False。 |
EncryptionStatus | Object是否已加密。若Object已加密,则该字段值为True,否则为False。 |
ObjectAcl | Object的读写权限。更多信息,请参见Object ACL。 |
TaggingCount | Object的标签个数。 |
ObjectType | Object类型。更多信息,请参见Object类型。 |
Crc64 | Object的CRC64。 |
注意事项
存储空间清单支持按天或按周导出清单文件。
Bucket内的文件数量 | 导出建议 |
<100亿 | 按需配置按天或按周导出 |
100亿~500亿 | 按周导出 |
≥500亿 | 按前缀匹配分批导出 通过提交工单提升导出Bucket文件数量的限制
|
为保障较快的清单文件列表导出速度,在清单文件列表导出到目标Bucket的过程中,可能会占用一定的Bucket与用户级别带宽。如果存放清单文件列表的目标Bucket与配置清单任务的源Bucket相同,且源Bucket存在流量较大带宽紧张的情况,建议新建一个目标Bucket用于存放清单结果文件。
如果源Bucket没有任何文件,或清单任务设置的前缀没有匹配到任何文件,则不会生成清单文件。
导出清单文件的过程中,由于Object的创建、删除或覆盖等操作,可能会导致最终输出的清单列表中不一定包含所有的Object。最后修改时间早于manifest.json文件中createTimeStamp字段显示时间的Object会出现在清单文件中;最后修改时间晚于createTimeStamp字段显示时间的Object可能不会出现在清单文件中。建议您对清单列表中的Object进行操作之前,先使用HeadObject接口检查Object的属性。更多信息,请参见HeadObject。
在删除清单规则前,OSS会根据清单规则中的设置,以天或周为单位持续导出清单文件。为避免持续导出不必要的清单文件,您可以及时删除不再需要的清单规则。对于已导出且不再需要的存量清单文件,也可以及时清理。
相关API
以上操作方式底层基于以下API,如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketInventory。