本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
面对大规模标签管理、权限调整、数据解冻等场景,传统方式需要基于 OSS SDK 编写批量操作程序并管理任务执行状态。批量操作提供托管解决方案,单作业可处理 100 亿对象,无需编码即可完成标签管理、ACL 修改、数据解冻等操作。
适用范围
批量操作功能目前处于邀测阶段,仅在华东1(杭州)和华北6(乌兰察布)地域开放。如需使用,请联系技术支持申请开通。
操作概览
创建RAM角色:允许 OSS 服务读取清单文件、执行批量操作并生成报告文件。
准备输入清单:通过存储空间清单文件(manifest.json)、前缀(Prefix)或 CSV 清单文件(manifest.csv)指定待处理的对象范围。
创建作业:配置具体操作(标签、权限、解冻等)并提交作业。
作业管理与运维:监控作业状态,确认待执行的作业,查看执行报告,必要时调整优先级或取消作业。
步骤一:创建RAM角色
前往 RAM 控制台,创建角色。选择信任的实体类型为云服务,信任主体名称选择对象存储。
为该角色创建并附加一个自定义权限策略。策略内容如下,将
your-bucket替换为实际的 Bucket 名称。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetBucketInfo", "oss:ListObjects", "oss:GetObject", "oss:GetObjectTagging", "oss:PutObjectTagging", "oss:DeleteObjectTagging", "oss:PutObjectAcl", "oss:RestoreObject", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:your-bucket", "acs:oss:*:*:your-bucket/*" ] } ] }记录下该角色的 ARN(例如
acs:ram::<your-account-uid>:role/BatchRole),后续步骤将用到。
步骤二:准备输入清单
批量操作需要指定要处理哪些对象。根据场景不同,可以选择以下三种方式:
存储空间清单文件:适合大规模、定期重复的批量操作
前缀:处理某个目录下的所有对象
CSV 清单文件:待处理对象列表的 CSV 文件
存储空间清单文件
使用存储空间清单自动生成的清单文件。
<Manifest>
<Location>
<ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
<Bucket>my-bucket</Bucket>
<Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
</Location>
<Spec>
<Format>OSS_InventoryReport_CSV_20250611</Format>
</Spec>
</Manifest>配置说明
ETag:使用
manifest.json文件的 ETag 值Format:
OSS_InventoryReport_CSV_20250611
前缀
根据前缀自动生成对象列表。
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>CSV 清单文件
通过 CSV 文件精确列出对象。CSV 清单文件必须上传到 OSS,并且与批量作业在相同地域。
<Manifest>
<Location>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
</Location>
<Spec>
<Format>OSS_BatchOperations_CSV_20250611</Format>
<Fields>Bucket,Key</Fields>
</Spec>
</Manifest>配置说明
ETag:使用
manifest.csv的 ETag 值Fields:明确 CSV 文件的列定义
未开启版本控制:
Bucket,Key开启版本控制:
Bucket,Key,VersionId
Format:
OSS_BatchOperations_CSV_20250611
CSV 文件格式要求
文件编码:必须使用 UTF-8 编码
字段分隔符:使用英文逗号(,)分隔
Object Key 编码:必须经过 URL 编码(例如:
documents%2Freport1.pdf)文件大小限制:单个文件不超过 10TB
不支持注释:CSV 文件中不能包含注释行
CSV 文件示例
未开启版本控制
my-bucket,documents%2Freport1.pdf my-bucket,documents%2Freport2.pdf my-bucket,images%2Fphoto1.jpg开启版本控制
my-bucket,important%2Fdata.json,3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo my-bucket,config%2Fsettings.xml,null
步骤三:创建作业
批量替换标签
替换操作会删除对象原有的所有标签。单个对象最多支持10个标签,所有标签键值的总长度不能超过1KB,标签键不能重复且区分大小写。
如果有配置生命周期规则,且生命周期规则依赖批量替换标签的结果时,务必要检查批量替换标签的最终执行结果,一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成标签替换,部分Object标签替换失败,使用时请查询结果的成功数、失败数等信息,确保标签替换结果符合预期。
ossutil2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com存储空间清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectTagging>
<TagSet>
<Tag><Key>Environment</Key><Value>Production</Value></Tag>
<Tag><Key>Team</Key><Value>DataOps</Value></Tag>
</TagSet>
</PutObjectTagging>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>put-tag-inventory-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
<Bucket>my-bucket</Bucket>
<Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
</Location>
<Spec>
<Format>OSS_InventoryReport_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch replace tags using Inventory manifest</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>前缀
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectTagging>
<TagSet>
<Tag><Key>Environment</Key><Value>Production</Value></Tag>
<Tag><Key>Team</Key><Value>DataOps</Value></Tag>
</TagSet>
</PutObjectTagging>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>put-tag-job-001</ClientRequestToken>
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>
<Description>Batch replace tags for documents</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>CSV 清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectTagging>
<TagSet>
<Tag><Key>Environment</Key><Value>Production</Value></Tag>
<Tag><Key>Team</Key><Value>DataOps</Value></Tag>
</TagSet>
</PutObjectTagging>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>put-tag-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
</Location>
<Spec>
<Fields>Bucket,Key</Fields>
<Format>OSS_BatchOperations_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch replace tags for specified objects</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>返回示例
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>ODRiZWQ5Njc5ZTE0NDE5NTlmNjJmZDlkMTk2ODI2NDU=</JobId>
</CreateJobResult>API
调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<PutObjectTagging>操作类型,通过<TagSet>定义新的标签集合来完全替换对象现有标签。
批量添加标签
批量添加标签操作会在对象现有标签基础上添加新标签,保留原有的所有标签,适用于标签补充场景。由于这是非原子性操作,在高并发场景下可能存在标签丢失的风险,建议避免与其他标签操作并发执行,确保数据一致性。
如果有配置生命周期规则,且生命周期规则依赖批量添加标签的结果时,务必要检查批量添加标签的最终执行结果,一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成打标,部分Object打标失败,使用时请查询结果的成功数、失败数等信息,确保打标结果符合预期。
ossutil2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com存储空间清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<AddObjectTagging>
<TagSet>
<Tag><Key>Department</Key><Value>Engineering</Value></Tag>
<Tag><Key>Project</Key><Value>BatchOps</Value></Tag>
</TagSet>
</AddObjectTagging>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>add-tag-inventory-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
<Bucket>my-bucket</Bucket>
<Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
</Location>
<Spec>
<Format>OSS_InventoryReport_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch add tags using Inventory manifest</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>前缀
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<AddObjectTagging>
<TagSet>
<Tag><Key>Department</Key><Value>Engineering</Value></Tag>
<Tag><Key>Project</Key><Value>BatchOps</Value></Tag>
</TagSet>
</AddObjectTagging>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>add-tag-job-001</ClientRequestToken>
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>
<Description>Batch add tags to documents</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>CSV 清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<AddObjectTagging>
<TagSet>
<Tag><Key>Department</Key><Value>Engineering</Value></Tag>
<Tag><Key>Project</Key><Value>BatchOps</Value></Tag>
</TagSet>
</AddObjectTagging>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>add-tag-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
</Location>
<Spec>
<Fields>Bucket,Key</Fields>
<Format>OSS_BatchOperations_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch add tags to specified objects</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>返回示例
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>Nzg5ZjE3ZTU5OGMxNDZjZDk0YjJiODMzZDZiZjA0ZmU=</JobId>
</CreateJobResult>API
调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<AddObjectTagging>操作类型,通过<TagSet>定义新增的标签,系统会在保留现有标签的基础上添加新标签。
批量删除标签
批量删除标签操作会删除指定对象的所有标签,删除后对象的标签数量将变为0,适用于标签清理场景。
此操作是不可逆的,一旦执行就无法恢复被删除的标签,建议在生产环境执行前先在测试环境进行验证,确保不会影响业务逻辑。
如果有配置生命周期规则,且生命周期规则依赖批量删除标签的结果时,务必要检查批量删除标签的最终执行结果,一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成标签删除,部分Object标签删除失败,使用时请查询结果的成功数、失败数等信息,确保标签删除结果符合预期。
ossutil2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com存储空间清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<DeleteObjectTagging />
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>delete-tag-inventory-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
<Bucket>my-bucket</Bucket>
<Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
</Location>
<Spec>
<Format>OSS_InventoryReport_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch delete tags using Inventory manifest</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>前缀
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<DeleteObjectTagging />
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>delete-tag-job-001</ClientRequestToken>
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>
<Description>Batch delete tags for documents</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>CSV 清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<DeleteObjectTagging />
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>delete-tag-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
</Location>
<Spec>
<Fields>Bucket,Key</Fields>
<Format>OSS_BatchOperations_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch delete tags for specified objects</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>返回示例
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>NTVlYmQ4ZmQyOTM0NDJmY2E2NmNjYTUwNjU1ZGRkMGM=</JobId>
</CreateJobResult>API
调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<DeleteObjectTagging/>操作类型(无需额外参数),系统会删除指定对象的所有标签。
批量修改权限
批量权限修改支持四种ACL类型:private(仅所有者可读写)、public-read(所有人可读仅所有者可写)、public-read-write(所有人可读写)和default(继承Bucket权限设置)。权限修改后会立即生效,直接影响对象的访问权限,请根据业务需求谨慎选择合适的权限类型。
ossutil2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com存储空间清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectAcl>
<ObjectAcl>public-read</ObjectAcl>
</PutObjectAcl>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>acl-inventory-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
<Bucket>my-bucket</Bucket>
<Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
</Location>
<Spec>
<Format>OSS_InventoryReport_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch change ACL using Inventory manifest</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>前缀
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectAcl>
<ObjectAcl>public-read</ObjectAcl>
</PutObjectAcl>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>acl-job-001</ClientRequestToken>
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>
<Description>Batch change ACL to public-read for documents</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>CSV 清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectAcl>
<ObjectAcl>public-read</ObjectAcl>
</PutObjectAcl>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>acl-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
</Location>
<Spec>
<Fields>Bucket,Key</Fields>
<Format>OSS_BatchOperations_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch change ACL to public-read for specified objects</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>返回示例
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>YWNsR29iMTIzNDU2Nzg5MA==</JobId>
</CreateJobResult>API
调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<PutObjectAcl>操作类型,通过<ObjectAcl>参数设置目标权限(private/public-read/public-read-write/default)。
批量数据解冻
批量解冻操作支持Archive、ColdArchive、DeepColdArchive三种归档存储类型的对象。Archive类型的对象解冻通常在1小时内完成,可保持1-7天的可访问状态。ColdArchive类型支持Standard模式(2-5小时完成)和Bulk模式(5-12小时完成)两种解冻速度。DeepColdArchive类型仅支持Standard模式,需要48小时内完成解冻。解冻天数可设置为1-365天范围内的任意值。
如果操作的对象的存储类型和解冻模式或解冻天数不匹配,对应操作将会失败。
ossutil2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.com存储空间清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<RestoreObject>
<Days>7</Days>
<Tier>Standard</Tier>
</RestoreObject>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>restore-inventory-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>495B279A99C2BA72A66CA1E23B5FEA13</ETag>
<Bucket>my-bucket</Bucket>
<Object>inventory-reports/my-bucket/daily-inventory/2025-10-29T12-49Z/manifest.json</Object>
</Location>
<Spec>
<Format>OSS_InventoryReport_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch restore using Inventory manifest for 7 days</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>前缀
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<RestoreObject>
<Days>7</Days>
<Tier>Standard</Tier>
</RestoreObject>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>restore-job-001</ClientRequestToken>
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>archive/2024/</Prefix>
</KeyPrefixManifestGenerator>
<Description>Batch restore archive objects for 7 days</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>CSV 清单文件
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<RestoreObject>
<Days>7</Days>
<Tier>Standard</Tier>
</RestoreObject>
</Operation>
<Report>
<Bucket>my-bucket</Bucket>
<Enabled>true</Enabled>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<ClientRequestToken>restore-job-001</ClientRequestToken>
<Manifest>
<Location>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
</Location>
<Spec>
<Fields>Bucket,Key</Fields>
<Format>OSS_BatchOperations_CSV_20250611</Format>
</Spec>
</Manifest>
<Description>Batch restore specified archive objects for 7 days</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>返回示例
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>cmVzdG9yZUpvYjEyMzQ1Njc4OTA=</JobId>
</CreateJobResult>API
调用CreateJob接口创建批量作业,在XML配置的<Operation>节点中指定<RestoreObject>操作类型,通过<Days>设置解冻天数(1-365)和<Tier>设置解冻模式(Standard/Bulk)。
步骤四:作业管理与运维
查看作业状态
创建作业后,通过查询作业详细信息监控和确认作业状态。查看作业详情可以获取指定作业的完整状态信息,包括执行进度、配置参数等。
作业状态为Complete并不代表所有对象都处理成功,仍需要查看详细报告来确认最终结果。
ossutil2.0
ossutil api invoke-operation --op-name describe-job --method GET --parameters batchJob --parameters batchJobId=<JobId> --endpoint oss-cn-hangzhou.aliyuncs.com返回示例
<?xml version="1.0" encoding="UTF-8"?>
<DescribeJobResult>
<Job>
<ConfirmationRequired>true</ConfirmationRequired>
<CreationTime>1761723644</CreationTime>
<FailureReasons>
<JobFailure />
</FailureReasons>
<JobId>M2E0ODMyNmJjYmYzNGY0ZThiYjMyMmI1ZDE1YWE0OGE=</JobId>
<Operation>
<PutObjectTagging>
<TagSet>
<Tag>
<Key>Environment</Key>
<Value>Production</Value>
</Tag>
<Tag>
<Key>Team</Key>
<Value>DataOps</Value>
</Tag>
</TagSet>
</PutObjectTagging>
</Operation>
<Report>
<Enabled>true</Enabled>
<Bucket>my-bucket</Bucket>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>
<Manifest>
<Location>
<ETag>1466CA50719515AAE6F92101D83B6A20</ETag>
<Bucket>my-bucket</Bucket>
<Object>manifest.csv</Object>
</Location>
<Spec>
<Format>OSS_BatchOperations_CSV_20250611</Format>
<Fields>Bucket,Key</Fields>
</Spec>
</Manifest>
<Description>Test task for Suspended status</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
<ProgressSummary>
<NumberOfTasksFailed>0</NumberOfTasksFailed>
<NumberOfTasksSucceeded>0</NumberOfTasksSucceeded>
<TotalNumberOfTasks>3</TotalNumberOfTasks>
<Timers>
<ElapsedTimeInActiveSeconds>-1</ElapsedTimeInActiveSeconds>
</Timers>
</ProgressSummary>
<Status>Suspended</Status>
<TerminationDate>-1</TerminationDate>
</Job>
</DescribeJobResult>状态说明:
ConfirmationRequired: true- 设置为需要确认Status: Suspended- 作业已暂停,等待用户确认TotalNumberOfTasks: 3- 预计将处理 3 个对象NumberOfTasksSucceeded: 0- 尚未开始执行ElapsedTimeInActiveSeconds: -1- 尚未开始执行,因此执行时间为 -1
API
通过DescribeJob接口获取指定作业的详细信息,包括执行状态、进度统计、配置参数和错误信息。
确认待执行作业
将Suspended状态转为Ready状态,作业进入执行队列。超过14天未确认将自动转为Failed。
ossutil2.0
ossutil api invoke-operation --op-name update-job-status --method POST --parameters batchJob --parameters batchJobId=<JobId> --parameters requestedJobStatus=Ready --endpoint oss-cn-hangzhou.aliyuncs.com返回示例
<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobStatusResult>
<JobId>NGFhNmFmZDRlNTcxNDE2OGFhY2FjYWQyNDcxYjc3YzM=</JobId>
<Status>Ready</Status>
</UpdateJobStatusResult>API
通过UpdateJobStatus接口确认作业执行,将作业从Suspended状态转换为Ready状态,开始排队执行。
批量查询作业列表
查看所有作业。批量查询功能支持按作业状态和创建时间范围筛选作业列表,可以设置返回数量限制并支持分页查询,方便管理大量作业。查询结果默认按照创建时间倒序排列,最新创建的作业会显示在前面。
ossutil2.0
ossutil api invoke-operation --op-name list-jobs --method GET --parameters batchJob --parameters maxKeys=100 --endpoint oss-cn-hangzhou.aliyuncs.com返回示例
<?xml version="1.0" encoding="UTF-8"?>
<ListJobsResult>
<Jobs>
<Job>
<JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
<Status>Complete</Status>
<CreationTime>1761666548</CreationTime>
</Job>
</Jobs>
</ListJobsResult>API
通过ListJobs接口查询账号下的批量作业列表,支持按状态、时间范围筛选和分页查询,便于作业管理和监控。
调整作业优先级
优先级范围0-2147483647,数值越大优先级越高。高优先级作业可抢占低优先级作业资源。作业优先级不能保证绝对的作业执行顺序,OSS 只能尽力给高优先级作业倾斜更多资源。
ossutil2.0
ossutil api invoke-operation --op-name update-job-priority --method POST --parameters batchJob --parameters batchJobId=<JobId> --parameters priority=1000 --endpoint oss-cn-hangzhou.aliyuncs.com返回示例
<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobPriorityResult>
<JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
<Priority>1000</Priority>
</UpdateJobPriorityResult>API
通过UpdateJobPriority接口调整作业的执行优先级,实现资源调度和紧急作业处理,高优先级作业可抢占资源。
取消作业
终止正在执行或等待执行的作业。已处理的对象无法回滚。
ossutil2.0
ossutil api invoke-operation --op-name update-job-status --method POST --parameters batchJob --parameters batchJobId=<JobId> --parameters requestedJobStatus=Cancelled --endpoint oss-cn-hangzhou.aliyuncs.com返回示例
<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobStatusResult>
<JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
<Status>Cancelled</Status>
</UpdateJobStatusResult>API
通过UpdateJobStatus接口将作业状态设置为Cancelled,停止作业执行并释放资源。
故障排查
常见失败原因
AccessDenied:IAM角色权限不足,需检查权限配置InvalidManifest:清单文件格式错误或ETag不匹配InvalidArgument:操作参数不符合要求(如标签格式、ACL类型)NoSuchBucket:目标Bucket不存在或无访问权限TooManyRequests:并发作业超限,等待其他作业完成
故障诊断步骤
检查作业状态:
DescribeJob获取详细错误信息下载执行报告:查看具体失败对象和错误码
验证权限配置:确认IAM角色具备所需权限
检查输入数据:验证清单文件格式和对象存在性
作业状态说明
状态 | 说明 | 注意事项 | 下一步操作 |
| 作业刚创建,正在初始化 | - | 等待进入 Preparing 状态 |
| 正在解析清单文件和验证配置 | - | 自动进入 Suspended 或 Active |
| 待用户确认执行 | 超过14天未确认将自动转为 Failed 状态 | 调用 update-job-status 确认 |
| 准备就绪,等待执行 | - | 等待调度器分配资源 |
| 正在执行中 | - | 监控进度,等待完成 |
| 被高优先级作业抢占而暂停 | 可能有部分对象已处理成功 | 等待恢复执行 |
| 任务即将完成,正在生成报告 | - | 等待进入 Complete 状态 |
| 执行完成 | 仅表示作业完成,不代表所有对象都成功处理,需查看执行报告确认详情 | 查看报告文件分析结果 |
| 正在取消中 | 可能有部分对象在取消前已处理成功 | 等待进入 Cancelled 状态 |
| 已取消 | 可能有部分对象在取消前已处理成功 | 查看报告了解已处理的对象 |
| 正在失败中 | 可能有部分对象在失败前已处理成功 | 等待进入 Failed 状态 |
| 执行失败 | 可能有部分对象在失败前已处理成功 | 查看失败原因,修复后重新创建作业 |
应用于生产环境
最佳实践
作业规划策略:将单作业对象数控制在1亿以内确保执行稳定性,大规模数据拆分为多个作业降低单点风险,设置合理的作业优先级避免重要作业被阻塞,预估执行时间合理安排维护窗口。多作业并发操作同一批对象时执行顺序不确定,建议避免并发操作同一对象。
性能优化措施:合理组织清单文件结构避免单文件过大影响解析速度,充分利用独立QPS配额的优势不影响业务API调用,同时运行作业数控制在3个以内避免资源竞争。
错误处理机制:启用详细报告(ReportScope=AllTasks)获取完整执行结果用于问题定位。
结果确认要点:一个作业执行完后,无论作业是执行中、完成、失败、暂停、还是取消状态,均有可能部分Object完成指定操作,部分Object执行指定操作失败,使用时请查询结果的成功数、失败数等信息,确保执行指定操作的结果符合预期。
失败处理建议:Complete状态仅表示作业完成,不代表所有对象成功处理,必须查看执行报告确认详情。针对失败任务分析失败原因并重试,部分失败的作业可基于失败报告创建重试作业,Cancelled、Paused、Failed状态作业可能已有部分对象处理成功需要核对。
资源调度机制
独立QPS配额:使用独立1万QPS配额,不占用业务QPS
优先级调度:支持0-2147483647优先级,高优先级作业抢占低优先级作业资源
并发控制:单账号最多6个并发作业,超出进入等待队列
容错策略
权限验证:作业创建前验证源路径访问权限避免执行中断,确保IAM角色具有目标操作的完整权限链,定期轮换IAM角色AccessKey提升安全性。
数据保护:执行批量删除或覆盖操作前创建数据快照或备份,为重要数据启用版本控制提供多版本保护,在测试环境验证操作逻辑确认无误后再在生产环境执行。
监控告警:配置作业状态变更事件通知及时掌握执行情况,监控作业执行时间发现异常长时间运行作业,设置失败率阈值告警快速响应异常情况。
成本控制
计费方式:采用按处理对象数量计费模式,1元/100万对象,无任务创建费用,仅按实际处理对象数量付费,相比逐个对象调用API可节省90%以上操作成本。
优化建议:充分利用6个并发作业限额避免资源空闲,定期删除历史作业报告节省存储成本,及时清理测试作业避免不必要的费用支出。
配额与限制
项目 | 限制 |
单账号并发作业数 | 6个 |
单账号排队作业数 | 1万个/地域 |
单作业最大对象数 | 100亿个 |
清单文件最大大小 | 10TB |
单账号日处理对象数 | 8.6亿个/地域 |
作业历史保留期 | 90天或10万条 |
计费说明
OSS批量操作采用按量付费模式,按处理对象数量计费1元/100万对象,不收取作业创建和管理费用,不产生额外数据传输费用。
对文件进行操作会产生 OSS标准 API 费用收取。例如:打标操作,会收取 PUT类型请求费用。
计费示例:
批量标签操作500万对象:500万 ÷ 100万 × 1元 = 5元
大规模数据处理50亿对象:50亿 ÷ 100万 × 1元 = 5,000元
费用优化建议:合并相关批量操作到单个作业减少管理开销,使用精确前缀或清单文件避免处理不必要对象,非紧急批量操作安排在业务低峰期执行。
常见问题
作业提交后长时间处于Preparing状态?
可能原因包括:
清单文件过大,解析时间较长
前缀扫描涉及对象数量过多
系统负载较高,处理队列繁忙
建议:将大作业拆分为多个小作业,或使用预生成的清单文件。
部分对象处理失败如何处理?
处理步骤:
下载作业执行报告,分析失败原因
根据失败对象列表创建新的重试作业
检查权限配置是否正确,确保IAM角色具有完整权限
如何取消正在执行的作业?
使用以下命令:
POST /?batchJobStatus&batchJobId=<JobId>&requestedJobStatus=Cancelled&statusUpdateReason=用户主动取消 HTTP/1.1
Host: oss-cn-hangzhou.aliyuncs.com
Authorization: <签名信息>提示权限不足错误?
检查权限配置:
确保RAM用户具有
oss:CreateBatchJob权限检查IAM角色是否包含操作所需具体权限
验证跨桶操作时目标桶权限设置
IAM角色配置要求?
IAM角色必须包含:
OSS资源读写权限
批量操作API调用权限
报告存储空间写入权限
信任策略示例:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": ["oss.aliyuncs.com"]
}
}
]
}如何提高批量操作执行速度?
优化建议:
合理组织清单文件,避免过大单文件
避免业务高峰期执行大型作业
分配作业优先级,确保重要作业优先执行
单作业对象数不要过多,避免作业运行时间过长,建议控制在1亿以内
避免将大作业拆分成过多小作业(比如:100 万对象拆成 1000 个作业),减少任务调度消耗的时间
作业执行时间比预期长?
可能原因:
对象分布不均,某些分片处理时间较长
源对象或目标对象存在热点,影响处理速度
同时运行作业过多,资源竞争激烈
建议调整作业调度策略或降低并发作业数量。