The Batch Operations feature lets you process up to 10 billion objects in a single job. You can perform operations such as tag management, ACL modification, and data restore without writing code.
Scope
The Batch Operations feature is fully available in the Singapore and Germany (Frankfurt) regions. To use this feature in the China (Hangzhou), China (Shanghai), China (Shenzhen), China (Guangzhou), China (Qingdao), China (Beijing), China (Zhangjiakou), China (Hohhot), China (Ulanqab), China (Chengdu), China (Hong Kong), or Indonesia (Jakarta) regions, contact Technical Support to apply for access.
Operation overview
Create a RAM role: Allow the OSS service to read the manifest file, execute batch operations, and generate a report.
Prepare an input manifest: Specify the objects to process using a bucket inventory file (manifest.json), a prefix, or a CSV manifest file (manifest.csv).
Create a job: Configure specific operations, such as tagging, setting permissions, or restoring objects, and then submit the job.
Manage and maintain the job: Monitor the job status, confirm pending jobs, view the execution report, and adjust the priority or cancel the job as needed.
Step 1: Create a RAM role
Go to the RAM console to create a role. Select Alibaba Cloud Service as the trusted entity type and Object Storage Service as the trusted service.
Create and attach a custom policy to the role. The policy content is as follows. Replace
your-bucketwith your actual bucket name.{ "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/*" ] } ] }Record the ARN of the role, for example,
acs:ram::<your-account-uid>:role/BatchRole. You will use it in the following steps.
Step 2: Prepare an input manifest
Batch operations require you to specify which objects to process. You can choose one of the following three methods based on your scenario:
Bucket inventory file: Suitable for large-scale, regularly repeated batch operations.
Prefix: Processes all objects in a specific folder.
CSV manifest file: A CSV file that lists the objects to be processed.
Bucket inventory file
Use a manifest file automatically generated by Bucket Inventory.
<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>Configuration description
ETag: The ETag value of the
manifest.jsonfile.Format:
OSS_InventoryReport_CSV_20250611
Prefix
Generates an object list based on a specified prefix.
<KeyPrefixManifestGenerator>
<SourceBucket>my-bucket</SourceBucket>
<Prefix>documents/2024/</Prefix>
</KeyPrefixManifestGenerator>CSV manifest file
Lists specific objects using a CSV file. The CSV manifest file must be uploaded to OSS and located in the same region as the batch job.
<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>Configuration description
ETag: The ETag value of
manifest.csv.Fields: The columns in the CSV file.
Versioning not enabled:
Bucket,KeyVersioning enabled:
Bucket,Key,VersionId
Format:
OSS_BatchOperations_CSV_20250611
CSV file format requirements
File encoding: UTF-8.
Field separator: Comma (,).
Object Key encoding: URL-encoded (for example,
documents%2Freport1.pdf).Comments: The CSV file cannot contain comment lines.
CSV file examples
Versioning not enabled
my-bucket,documents%2Freport1.pdf my-bucket,documents%2Freport2.pdf my-bucket,images%2Fphoto1.jpgVersioning enabled
my-bucket,important%2Fdata.json,3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo my-bucket,config%2Fsettings.xml,null
Step 3: Create a job
Batch replace tags
The replace operation deletes all existing tags on an object. A single object can have up to 10 tags. The total length of all tag keys and values cannot exceed 1 KB. Tag keys are case-sensitive and must be unique.
If a lifecycle rule depends on this operation, review the final job report. A job's final status can be Running, Complete, Failed, Paused, or Cancelled. Some objects may be processed successfully while others fail. Check the report to confirm that the number of successful and failed tasks meets your expectations.
ossutil 2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.comBucket inventory file
<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>Prefix
<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 manifest file
<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>Response example
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>ODRiZWQ5Njc5ZTE0NDE5NTlmNjJmZDlkMTk2ODI2NDU=</JobId>
</CreateJobResult>After the job is created, it enters the Suspended state. You can view the job status to confirm that the configuration is correct, and then manually confirm the pending job.
API
Call the CreateJob API to create a batch job. In the XML configuration, specify the <PutObjectTagging> operation type in the <Operation> node. Define the new set of tags in the <TagSet> to completely replace the object's existing tags.
Batch add tags
The batch add tags operation adds new tags to an object's existing tags, preserving all original tags. This is useful for adding supplementary tags. Note that if the key of a new tag is the same as an existing tag's key, the new tag's value overwrites the existing value. Because this is not an atomic operation, there is a risk of tag loss in high-concurrency scenarios. Avoid running this operation concurrently with other tag operations to ensure data consistency.
If a lifecycle rule depends on this operation, review the final job report. A job's final status can be Running, Complete, Failed, Paused, or Cancelled. Some objects may be processed successfully while others fail. Check the report to confirm that the number of successful and failed tasks meets your expectations.
ossutil 2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.comBucket inventory file
<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>Prefix
<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 manifest file
<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>Response example
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>Nzg5ZjE3ZTU5OGMxNDZjZDk0YjJiODMzZDZiZjA0ZmU=</JobId>
</CreateJobResult>After the job is created, it enters the Suspended state. You can view the job status to confirm that the configuration is correct, and then manually confirm the pending job.
API
Call the CreateJob API to create a batch job. In the XML configuration, specify the <AddObjectTagging> operation type in the <Operation> node. Define the new tags in the <TagSet>. The system adds the new tags while preserving the existing ones.
Batch delete tags
The batch delete tags operation removes all tags from the specified objects. After the operation, the objects will have no tags. This is useful for cleaning up tags.
This operation is irreversible. Once executed, the deleted tags cannot be recovered. Test this operation in a staging environment before you run it in a production environment to ensure it does not affect your business logic.
If a lifecycle rule depends on this operation, review the final job report. A job's final status can be Running, Complete, Failed, Paused, or Cancelled. Some objects may be processed successfully while others fail. Check the report to confirm that the number of successful and failed tasks meets your expectations.
ossutil 2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.comBucket inventory file
<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>Prefix
<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 manifest file
<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>Response example
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>NTVlYmQ4ZmQyOTM0NDJmY2E2NmNjYTUwNjU1ZGRkMGM=</JobId>
</CreateJobResult>After the job is created, it enters the Suspended state. You can view the job status to confirm that the configuration is correct, and then manually confirm the pending job.
API
Call the CreateJob API to create a batch job. In the XML configuration, specify the <DeleteObjectTagging/> operation type (with no additional parameters) in the <Operation> node. The system will delete all tags from the specified objects.
Batch modify permissions
Batch permission modification supports four access control list (ACL) types: private (only the owner can read and write), public-read (anyone can read, but only the owner can write), public-read-write (anyone can read and write), and default (inherits the permissions of the bucket). Permission changes take effect immediately and directly affect object access. Choose the appropriate permission type carefully based on your business needs.
ossutil 2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.comBucket inventory file
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectAcl>
<ObjectAcl>private</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>Prefix
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectAcl>
<ObjectAcl>private</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 private for documents</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>CSV manifest file
<CreateJobRequest>
<ConfirmationRequired>true</ConfirmationRequired>
<Operation>
<PutObjectAcl>
<ObjectAcl>private</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 private for specified objects</Description>
<Priority>10</Priority>
<RoleArn>acs:ram::<your-account-uid>:role/BatchRole</RoleArn>
</CreateJobRequest>Response example
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>YWNsR29iMTIzNDU2Nzg5MA==</JobId>
</CreateJobResult>After a job is created, it enters the Suspended state. View the job status to confirm that the configuration is correct, and then manually confirm the pending job.
API
Call the CreateJob API to create a batch job. In the XML configuration, specify the <PutObjectAcl> operation type in the <Operation> node and set the target permission (private/public-read/public-read-write/default) using the <ObjectAcl> parameter.
Batch data restore
The batch restore operation supports objects in the Archive, ColdArchive, and DeepColdArchive storage classes. Restoring Archive objects typically completes within one hour, and the restored objects remain accessible for 1 to 7 days. The ColdArchive storage class supports Standard mode (2 to 5 hours) and Bulk mode (5 to 12 hours). The DeepColdArchive storage class only supports Standard mode, which takes up to 48 hours to complete. You can set the number of days that the restored object remains accessible to a value from 1 to 365.
If the storage class of an object does not match the specified restore mode or number of days, the operation for that object will fail.
ossutil 2.0
ossutil api invoke-operation --op-name create-job --method POST --parameters batchJob --body file:///path/to/config.xml --endpoint oss-cn-hangzhou.aliyuncs.comBucket inventory file
<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>Prefix
<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 manifest file
<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>Response example
<?xml version="1.0" encoding="UTF-8"?>
<CreateJobResult>
<JobId>cmVzdG9yZUpvYjEyMzQ1Njc4OTA=</JobId>
</CreateJobResult>After a job is created, its status is set to Suspended. You can view the job status to confirm that the configuration is correct, and then manually confirm the job to be executed.
API
Call the CreateJob API to create a batch job. In the XML configuration, specify the <RestoreObject> operation in the <Operation> node. Set the number of days the restored object is accessible (1 to 365) using the <Days> parameter and the restore mode (Standard or Bulk) using the <Tier> parameter.
Step 4: Job management and O&M
View job status
After creating a job, you can monitor and confirm its status by querying its details. The job details provide a complete overview of the job's status, including its execution progress and configuration parameters.
A job status of 'Complete' does not guarantee that all objects were processed successfully. You must view the detailed report to confirm the final results.
ossutil 2.0
ossutil api invoke-operation --op-name describe-job --method GET --parameters batchJob --parameters batchJobId=<JobId> --endpoint oss-cn-hangzhou.aliyuncs.comSample response
<?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>Status description:
ConfirmationRequired: true- Confirmation is required.Status: Suspended- The job is paused and waiting for user confirmation.TotalNumberOfTasks: 3- The job will process 3 objects.NumberOfTasksSucceeded: 0- The job has not started.ElapsedTimeInActiveSeconds: -1- The running time is -1 because the job has not started.
API
You can call the DescribeJob API to retrieve detailed information about a specific job, including its execution status, progress statistics, configuration parameters, and error messages.
Confirm a pending job
You can change the job status from Suspended to Ready to place it in the execution queue. If a job is not confirmed within 14 days, its status automatically changes to Failed.
ossutil 2.0
ossutil api invoke-operation --op-name update-job-status --method POST --parameters batchJobStatus --parameters batchJobId=<JobId> --parameters requestedJobStatus=Ready --endpoint oss-cn-hangzhou.aliyuncs.comResponse example
<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobStatusResult>
<JobId>NGFhNmFmZDRlNTcxNDE2OGFhY2FjYWQyNDcxYjc3YzM=</JobId>
<Status>Ready</Status>
</UpdateJobStatusResult>API
You can call the UpdateJobStatus API to confirm a job for execution. This changes the job status from Suspended to Ready and places it in the execution queue.
List jobs in batches
You can view all jobs and use the batch query feature to filter the list by status and creation time range. You can also limit the number of results and use paged queries to manage many jobs. By default, results are sorted by creation time in descending order, with the most recent jobs appearing first.
ossutil 2.0
ossutil api invoke-operation --op-name list-jobs --method GET --parameters batchJob --parameters maxKeys=100 --endpoint oss-cn-hangzhou.aliyuncs.comResponse example
<?xml version="1.0" encoding="UTF-8"?>
<ListJobsResult>
<Jobs>
<Job>
<JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
<Status>Complete</Status>
<CreationTime>1761666548</CreationTime>
</Job>
</Jobs>
</ListJobsResult>API
Call the ListJobs API to query the list of batch jobs in your account. This lets you filter by status and time range and use paged queries for easier job management and monitoring.
Adjust job priority
The priority value ranges from 0 to 2147483647, where a higher value indicates a higher priority. Job priority does not guarantee a strict execution order. Instead, OSS attempts to allocate more resources to higher-priority jobs.
ossutil 2.0
ossutil api invoke-operation --op-name update-job-priority --method POST --parameters batchJobPriority --parameters batchJobId=<JobId> --parameters priority=1000 --endpoint oss-cn-hangzhou.aliyuncs.comResponse example
<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobPriorityResult>
<JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
<Priority>1000</Priority>
</UpdateJobPriorityResult>API
You can call the UpdateJobPriority API to adjust the execution priority of a job. This is useful for resource scheduling and processing urgent jobs.
Cancel a job
You can terminate a job that is running or waiting to run. Completed operations on objects cannot be rolled back.
ossutil 2.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.comResponse example
<?xml version="1.0" encoding="UTF-8"?>
<UpdateJobStatusResult>
<JobId>OTE5ZGU1NWMxNjkyNGFkMjhkYTNmOGEzNTU2YmJiOWE=</JobId>
<Status>Cancelled</Status>
</UpdateJobStatusResult>API
You can call the UpdateJobStatus API to set the job status to Cancelled, which stops the job and releases its resources.
View a job report
After a job is complete, the system generates a detailed execution report in the specified path. The report contains two key files: a manifest named manifest.json and a detailed report in CSV format. These files provide the processing status, HTTP response code, and failure reason for each object, which you can use for troubleshooting and result validation.
Regardless of a job's status (Running, Complete, Failed, Paused, or Cancelled), it may still contain both successfully processed and failed objects. Always check the detailed report to confirm the actual execution results.
Report storage location
Report files are stored in the path that you specify in the <Report> node when you create a job. The path format is:
<Bucket>/<Prefix>/<JobId>/results/For example, if you set the following when you create the job:
<Report>
<Bucket>my-bucket</Bucket>
<Prefix>batch-reports/</Prefix>
<ReportScope>AllTasks</ReportScope>
</Report>The report files are then stored in the following path: my-bucket/batch-reports/<JobId>/results/
Report file structure
The report consists of two parts:
1. Report manifest file (manifest.json)
This is a JSON file that contains the report metadata and the location of the CSV report file.
Manifest file example for a successful job:
{
"Format": "Report_CSV_20250901",
"ReportCreationDate": "2025-10-31T07:18:56Z",
"Results": [
{
"TaskExecutionStatus": "succeeded",
"Bucket": "test-bucket",
"MD5Checksum": "\"424356315f4a82c1b6a4c190dbed15d9\"",
"Key": "reports/prefix-job-0/job-MTRiZGI1NDFiMTI2NDFiNDg0YWQyYTM2YmY1NzNjNDM=/results/report-0.csv"
}
],
"ReportSchema": "Bucket,Key,VersionId,HTTPStatus,Error"
}Manifest file example for a failed job:
{
"Format": "Report_CSV_20250901",
"ReportCreationDate": "2025-10-31T07:37:56Z",
"Results": [
{
"TaskExecutionStatus": "failed",
"Bucket": "test-bucket",
"MD5Checksum": "\"85749f22b5b62b161daf00b4adcf6da7\"",
"Key": "reports/prefix-job-0/job-M2E4MDkwNGJmNmQzNDgwYmE4ODI1YjdjNDgyNjk5NmM=/results/report-0.csv"
}
],
"ReportSchema": "Bucket,Key,VersionId,HTTPStatus,Error"
}Field descriptions:
Format: The version of the report format. The value is fixed toReport_CSV_20250901.ReportCreationDate: The time when the report was generated, in UTC.TaskExecutionStatus: The overall execution status of the job. A value ofsucceededindicates that all tasks were successful, and a value offailedindicates that all tasks failed.ReportSchema: The column definitions for the CSV report file.
2. CSV detailed report file
This file contains the detailed processing results for each object and includes the following columns:
Bucket: The bucket where the object is located.Key: The object name, which is URL-encoded.VersionId: The version ID of the object. This field is empty if versioning is not enabled for the bucket.HTTPStatus: The HTTP response status code. A value of 200 indicates success.Error: A description of the error. This field is empty if the task was successful.
CSV report example for successful tasks:
test-bucket,batchOperation%2F1761895099%2Fobject-1.txt,,200,
test-bucket,batchOperation%2F1761895099%2Fobject-9.txt,,200,
test-bucket,batchOperation%2F1761895099%2Fobject-4.txt,,200,
test-bucket,batchOperation%2F1761895099%2Fobject-8.txt,,200,
test-bucket,batchOperation%2F1761895099%2Fobject-3.txt,,200,CSV report example for failed tasks:
test-bucket,batchOperation%2F1761896253%2Fobject-0.txt,,403,"Error returned by Service. {""EC"":""0003-00000001"",""Error Code"":""AccessDenied"",""Http Status Code"":403,""Message"":""You have no right to access this object."",""Request Endpoint"":""PUT http://test-bucket.oss-cn-hangzhou-internal.aliyuncs.com/batchOperation/1761896253/object-0.txt?tagging"",""Request Id"":""690467520D9F2E3232004FFD"",""Timestamp"":""2025-10-31T07:37:54Z""}"
test-bucket,batchOperation%2F1761896253%2Fobject-7.txt,,403,"Error returned by Service. {""EC"":""0003-00000001"",""Error Code"":""AccessDenied"",""Http Status Code"":403,""Message"":""You have no right to access this object."",""Request Endpoint"":""PUT http://test-bucket.oss-cn-hangzhou-internal.aliyuncs.com/batchOperation/1761896253/object-7.txt?tagging"",""Request Id"":""69046752A016113937EB7029"",""Timestamp"":""2025-10-31T07:37:54Z""}"Download and analyze the report
Locate the report file: Call the DescribeJob API to retrieve the job details. The report path is in the
<Report>node of the response.Download manifest.json: Download the manifest file from the report path. Check the
TaskExecutionStatusandResultsnodes to determine the overall execution status.Download the CSV report: Download the detailed CSV report file from the path specified in the
Results[ ].Keyfield of the manifest.json file.Analyze the execution results:
Check the
HTTPStatuscolumn: A 2xx status code indicates success, while 4xx and 5xx status codes indicate failure.For failed records, check the
Errorcolumn for the error code and error details.Count the number of successful and failed objects and compare these counts to the
ProgressSummaryreturned by the DescribeJob operation to verify the results.
Example: Download a report using ossutil
# Download the report manifest file
ossutil cp oss://my-bucket/batch-reports/<JobId>/results/manifest.json ./
# Download the detailed CSV report
ossutil cp oss://my-bucket/batch-reports/<JobId>/results/report-0.csv ./Common error codes
HTTP status code | Error code | Description | Solution |
403 |
| Insufficient permissions to access the object. | Check the permission configuration of the IAM role |
404 |
| The object does not exist. | Confirm that the object path in the manifest file is correct. |
400 |
| An invalid argument was provided. | Check the operation parameters, such as the tag format or ACL type. |
409 |
| The object's state does not meet the operation's requirements. | Confirm that the object's storage class matches the operation type. |
Notes
Report files consume storage space and incur storage fees. Clean up historical reports regularly.
CSV report files for large-scale jobs can be large. Consider your network bandwidth before downloading them.
If you set
ReportScopetoFailedTasksOnly, the report includes only the failed objects.
Going live
Best practices
Job planning strategies
Scale control: Limit the number of objects in a single job to fewer than 100 million to ensure stable execution. Split large-scale data processing into multiple jobs to mitigate single points of failure.
Priority management: Set reasonable job priorities to prevent important jobs from being blocked. Estimate execution times to schedule maintenance windows appropriately.
Notes on concurrent operations: When multiple jobs operate on the same batch of objects concurrently, the execution order is not guaranteed. Avoid performing concurrent operations on the same object.
Performance optimization measures
Manifest file optimization: Organize the manifest file structure to avoid creating excessively large single files, which can slow down parsing.
QPS quota utilization: Take full advantage of the independent QPS quota to ensure that business API calls are not affected. Batch operations do not consume your QPS quota.
Concurrency control: Limit the number of concurrently running jobs to three or fewer to avoid resource competition.
Hot spot avoidance: If hot spots, such as a lexicographically ordered prefix, exist in the operation range, the execution speed of the batch operation can be affected. In severe cases, this may cause some file operations to fail.
Error handling mechanisms
Detailed reports: Enable detailed reports (ReportScope=AllTasks) to obtain complete execution results for troubleshooting.
Retry mechanism: In rare cases, if a batch operation encounters a problem during execution, it automatically retries several times. The final API request charges are based on the total number of API calls made.
Failure threshold: If the failure rate for tasks in a job exceeds 20%, the entire job fails immediately and stops running.
Status confirmation anomalies: In rare cases, some operations may succeed but be recorded as failed in the execution report. Double-check any items recorded as failed.
Key points for result confirmation
Execution integrity verification: A job can have one of the following statuses: Running, Complete, Failed, Paused, or Cancelled. Some objects may have been processed successfully, while others may have failed. Check the number of successful and failed tasks in the report to ensure the results meet your expectations.
Suggestions for handling failures:
A Complete status indicates only that the job has finished, not that all objects were processed successfully. You must check the execution report for details.
Analyze the cause of failed tasks and retry them. For jobs with partial failures, you can create a retry job based on the failure report.
For jobs with a Cancelled, Paused, or Failed status, some objects may have already been processed successfully. You must verify the results.
Notes on manifest files
Execution order and data consistency
Execution order: Batch operations are performed on the items in the manifest list, but the execution order is not guaranteed.
File updates: If an object is updated before the action is performed, the job operates on the updated file. Do not modify files while a batch job is running.
Limitations of the prefix method: If you use a prefix to provide the input manifest, the batch operation cannot detect files that are added or deleted during its execution. Do not add or delete files under the prefix while a batch job is running.
Manifest file format requirements
URL encoding: Object keys in the CSV manifest file must be URL-encoded. Otherwise, parsing may fail.
Handling duplicate keys: If the manifest file contains duplicate keys, the batch operation is performed multiple times, but the order of operations is not guaranteed.
Resource scheduling mechanism
Priority scheduling
Job priorities are supported, with values ranging from 0 to 2147483647.
Concurrency control
A single account can run a maximum of six concurrent jobs. Additional jobs are placed in a waiting queue.
Job status transitions
A Complete status indicates only that the job process is finished. It does not mean all objects were processed successfully.
For jobs with a Cancelled, Paused, or Failed status, some objects may have already been processed successfully.
Always check the number of successful and failed tasks in the execution report to confirm the actual results.
Status | Description | User actions |
New | The job has been created and its parameters are being verified. | None |
Preparing | The system is parsing the manifest, verifying parameters, and counting the total number of files. | Cancel the job. |
Suspended | The job is suspended and waiting for user confirmation. It automatically fails if not confirmed within 14 days. | Confirm or cancel the job. |
Ready | The job is in the queue, waiting for resource scheduling. | Cancel the job. |
Active | The job is running. This status includes: | Cancel the job. |
Pausing | The job is being paused due to resource constraints. | Cancel the job. |
Paused | The job is paused and will resume when resources are available. | Cancel the job. |
Complete | The job is complete. Note: This does not mean all objects were processed successfully. | View the report. |
Cancelling | A cancellation has been initiated. The system is cleaning up running tasks. | None |
Cancelled | The job has been cancelled. | View the report. |
Failing | The job is being terminated due to invalid parameters or a failure rate exceeding 20%. | None |
Failed | The job failed. | View the report. |
Cleaning | Job data is being cleaned up. This status is not visible to users. | None |
Cleaned | Job data cleanup is complete. This status is not visible to users. | None |
Fault tolerance strategies
Permission validation
Validate the access permissions for the source path before you create a job to prevent execution interruptions.
Ensure that the IAM role has all the required permissions for the target operation.
Rotate the AccessKeys for IAM roles regularly to enhance security.
Data protection
Create a data snapshot or backup before you perform batch delete or overwrite operations.
Enable versioning for important data to ensure multi-version protection.
Verify the operation logic in a staging environment before you execute it in a production environment.
Monitoring and alerting
Configure event notifications for job status changes to stay informed of the execution progress.
Monitor job execution times to detect abnormally long-running jobs.
Set up threshold alerts for failure rates to respond quickly to anomalies.
Cost control
Billing method
This feature uses a pay-as-you-go model and charges CNY 1 per 1 million objects processed.
No fees are charged for job creation or management. You pay only for the number of objects that are processed.
This can reduce operation costs by over 90% compared with calling APIs for each object individually.
Optimization suggestions
Make full use of the six-concurrent-job limit to prevent resource idling.
Regularly delete historical job reports to reduce storage costs.
Promptly clean up test jobs to avoid unnecessary expenses.
Quotas and limits
Item | Limit |
Concurrent jobs per account | 6 |
Queued jobs per account | Typically 1,000 per region |
Maximum objects per job | 10 billion |
Maximum manifest file size | 10 TB |
Objects processed per account per day | Typically 1 billion per region |
Job history retention period | Typically 30 days or 10,000 records |
Billing description
OSS Batch Operations is a pay-as-you-go service. You are charged CNY 1 for every 1 million objects processed, with no additional fees for job creation, management, or data transfer.
Standard OSS API fees also apply to operations on objects. For example, a tagging operation incurs a PUT request fee.
Billing examples:
Batch tagging 5 million objects: 5 million / 1 million × CNY 1 = CNY 5
Large-scale data processing of 5 billion objects: 5 billion / 1 million × CNY 1 = CNY 5,000
Cost optimization suggestions: Consolidate related batch operations into a single job to reduce management overhead. Use precise prefixes or manifest files to avoid processing unnecessary objects. Schedule non-urgent batch operations during off-peak business hours.
FAQ
Why is my job stuck in the Preparing state for a long time?
Possible reasons include the following:
The manifest file is too large and takes a long time to parse.
The prefix scan covers many objects.
The system load is high and the processing queue is busy.
To resolve this, you can split large jobs into smaller ones or use a pre-generated manifest file.
What should I do if some objects fail to process?
Follow these steps:
Download the job execution report and analyze the cause of the failure.
Create a new retry job based on the list of failed objects.
Verify that the permission configuration is correct and that the IAM role has full permissions.
How do I cancel a running job?
You can use the following command:
POST /?batchJobStatus&batchJobId=<JobId>&requestedJobStatus=Cancelled&statusUpdateReason=User cancelled HTTP/1.1
Host: oss-cn-hangzhou.aliyuncs.com
Authorization: <Signature information>Why do I get a permission denied error?
Check the following permission configurations:
Ensure the RAM user has the
oss:CreateBatchJobpermission.Verify that the IAM role has the required permissions for the operation.
Verify the permission settings of the destination bucket for cross-bucket operations.
IAM Role Configuration Requirements?
The IAM role must include the following:
Read and write permissions for OSS resources.
Permissions to call Batch Operations APIs.
Write permissions for the report storage bucket.
Example trust policy:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": ["oss.aliyuncs.com"]
}
}
]
}How can I improve the execution speed of batch operations?
Optimization recommendations:
Structure your manifest files to avoid creating single files that are too large.
Avoid running large jobs during peak business hours.
Assign job priorities to ensure important jobs are executed first.
Avoid including too many objects in a single job to prevent long runtimes. We recommend a limit of 100 million objects per job.
Avoid splitting a large job into too many smaller jobs, such as splitting 1 million objects into 1,000 jobs. This increases the time spent on task scheduling.
Why is the job taking longer than expected to run?
Possible reasons include the following:
Objects are unevenly distributed, which causes some shards to take longer to process.
The source or destination objects have hot spots, which can slow down processing.
Too many jobs are running concurrently, which leads to resource competition.
We recommend adjusting the job scheduling strategy or reducing the number of concurrent jobs.