Updated on 2026-08-14 GMT+08:00

Setting Lifecycle Rules (SDK for Java)

Function

This API is used to configure a lifecycle rule for a bucket to manage objects in it, such as periodically deleting objects or transitioning objects between storage classes. For details about lifecycle rules, see Lifecycle.

This operation configures lifecycle rules that can delete or migrate objects from a bucket at a specified time. Typical application scenarios:

  • Periodically delete log files that are only meant to be retained for a specific period of time (a week or a month).
  • Delete files that are frequently accessed within a certain period of time but are seldom accessed afterward. You can archive these files and then schedule the time for deletion.

You can perform this operation to create or update the lifecycle configuration of a bucket.

To perform this operation, you must have the PutLifecycleConfiguration permission. The bucket owner can perform this operation by default and can grant this permission to others by using a bucket policy or a user policy.

The lifecycle configuration enables OBS to delete objects and transition object storage classes at a scheduled time. To prevent a user from doing so, the following permissions granted to the user must be revoked:

  • DeleteObject
  • DeleteObjectVersion
  • PutLifecycleConfiguration

If you want to forbid a user to set the bucket lifecycle configuration, revoke the PutLifecycleConfiguration permission from the user.

Restrictions

  • There is no limit on the number of lifecycle rules in a bucket, but the total size of XML descriptions about all lifecycle rules in a bucket cannot exceed 20 KB.
  • You can configure up to 20 lifecycle rules for a parallel file system.
  • To configure a lifecycle rule for a bucket, you must be the bucket owner or have the required permission (obs:bucket:PutLifecycleConfiguration in IAM or PutLifecycleConfiguration in a bucket policy). For details, see Introduction to OBS Access Control, IAM Custom Policies, and Creating a Custom Bucket Policy.
  • The mapping between OBS regions and endpoints must comply with what is listed in Regions and Endpoints.
  • Expired objects will be permanently deleted and cannot be recovered.
  • Multi-AZ redundancy is not available for Archive storage. For this reason, buckets or objects with multi-AZ redundancy cannot be transitioned to the Archive storage class based on a lifecycle rule.

Method

obsClient.setBucketLifecycle(final SetBucketLifecycleRequest request)

Request Parameters

Table 1 List of request parameters

Parameter

Type

Mandatory (Yes/No)

Description

request

SetBucketLifecycleRequest

Yes

Explanation:

Request parameters for setting the lifecycle rule. For details, see Table 2.

Table 2 SetBucketLifecycleRequest

Parameter

Type

Mandatory (Yes/No)

Description

bucketName

String

Yes

Explanation:

Bucket name.

Restrictions:

  • A bucket name must be unique across all accounts and regions.
  • A bucket name:
    • Must be 3 to 63 characters long and start with a digit or letter. Lowercase letters, digits, hyphens (-), and periods (.) are allowed.
    • Cannot be formatted as an IP address.
    • Cannot start or end with a hyphen (-) or period (.).
    • Cannot contain two consecutive periods (..), for example, my..bucket.
    • Cannot contain a period (.) and a hyphen (-) adjacent to each other, for example, my-.bucket or my.-bucket.
  • If you repeatedly create buckets of the same name in the same region, no error will be reported and the bucket attributes comply with those set in the first creation request.

Default value:

None

lifecycleConfig

LifecycleConfiguration

Yes

Explanation:

Lifecycle rules for the bucket. For details, see Table 3.

Table 3 LifecycleConfiguration

Parameter

Type

Mandatory (Yes/No)

Description

rules

List<Rule>

No

Explanation:

List of lifecycle rules. For details, see Table 4.

Table 4 Rule

Parameter

Type

Mandatory (Yes/No)

Description

id

String

No

Explanation:

Lifecycle rule ID.

Value range:

The value must contain 1 to 255 characters.

Default value:

None

prefix

String

Yes

Explanation:

Object name prefix. It identifies the objects the rule applies to. You can leave this parameter blank to apply the rule to all objects in the bucket.

Assume that you have the following objects: logs/day1, logs/day2, logs/day3, and ExampleObject.jpg. If you set prefix to ExampleObject.jpg, the rule applies to object ExampleObject.jpg only. If you set prefix to logs/, the rule applies to the three objects with name starting with logs/. If you leave prefix blank, the rule applies to all objects in the bucket.

Value range:

The value must contain 1 to 1,024 characters.

Default value:

None

enabled

boolean

Yes

Explanation:

Whether the rule is enabled.

Value range:

true: The rule is enabled.

false: The rule is disabled.

Default value:

None

expiration

Expiration

No

Explanation:

Expiration time of an object. For details, see Table 6.

Default value:

None

tagSet

TagSet

No

Explanation:

Object tags that identify the objects the rule applies to. For details, see Table 7.

Default value:

None

noncurrentVersionExpiration

NoncurrentVersionExpiration

No

Explanation:

Expiration time of noncurrent object versions. For details, see Table 8.

Restrictions:

  • This parameter is only available for noncurrent object versions.
  • Versioning must be enabled (or suspended after being enabled) for the bucket.

Default value:

None

transitions

List<Transition>

No

Explanation:

Policies for storage class transition, including transition time and the storage class after transition. For details, see Table 9.

Restrictions:

This parameter is only available for the current object version.

Default value:

None

noncurrentVersionTransitions

List<NoncurrentVersionTransition>

No

Explanation:

Policies for storage class transition of noncurrent versions, including transition time and the storage class after transition. For details, see Table 11.

Restrictions:

  • This parameter is only available for noncurrent object versions.
  • Versioning must be enabled (or suspended after being enabled) for the bucket.

Default value:

None

abortIncompleteMultipartUpload

AbortIncompleteMultipartUpload

No

Explanation:

Expiration time for the parts (fragments) that are not assembled in a multipart upload. For details, see Table 12.

Restrictions:

abortIncompleteMultipartUpload does not support filtering by tag.

Default value:

None

Table 5 Tag

Parameter

Type

Mandatory (Yes/No)

Description

key

String

Yes

Explanation:

Name of a tag.

Restrictions:

  • This parameter must not be left blank or contain unprintable ASCII characters (0–31) or the following special characters: *<>\=
  • The tag keys in the same bucket must be unique.
  • The value can be up to 36 characters long.

Default value:

None

value

String

Yes

Explanation:

Tag value.

Restrictions:

  • This parameter can be left blank, but if specified, cannot include unprintable ASCII characters (0–31) and the following special characters: *<>\=
  • The value can be up to 43 characters long.

Default value:

None

Table 6 Expiration

Parameter

Type

Mandatory (Yes/No)

Description

days

Integer

Yes if date is absent during object storage class transition

Yes if date or expiredObjectDeleteMarker is absent during object deletion

Explanation:

Number of days (since the last update was made to the object) after which the lifecycle rule takes effect (the object will be deleted).

Restrictions:

This parameter is only available for the current object version.

Value range:

A positive integer, in days.

Default value:

None

date

Date

Yes if days is absent during object storage class transition.

Yes if days or expiredObjectDeleteMarker is absent during object deletion

Explanation:

The value must conform to the ISO8601 standards and indicate UTC 00:00. For example, 2018-01-01T00:00:00.000Z indicates only objects that were last modified before the specified time are transitioned to the specified storage class or deleted.

Default value:

None

expiredObjectDeleteMarker

Boolean

Yes if days or date is absent

Explanation:

Whether to delete expired delete markers. The value can be true or false. If tags are configured in a lifecycle rule, this element cannot be configured.

Default value:

None

Table 7 TagSet

Parameter

Type

Mandatory (Yes/No)

Description

tags

List<Tag>

Yes

Explanation:

Object tag list. For details, see Table 5.

Table 8 NoncurrentVersionExpiration

Parameter

Type

Mandatory (Yes/No)

Description

days

Integer

Yes

Explanation:

Number of days an object is noncurrent before it expires.

Restrictions:

This parameter is only available for noncurrent object versions.

Value range:

A positive integer, in days.

Default value:

None

Table 9 Transition

Parameter

Type

Mandatory (Yes/No)

Description

days

Integer

This parameter is mandatory if date is not configured.

Explanation:

Number of days after its creation when the object is transitioned.

Restrictions:

This parameter is only available for the current object version.

Value range:

A positive integer, in days.

Default value:

None

date

Date

This parameter is mandatory if days is not configured.

Explanation:

Date when the object will be transitioned.

Default value:

None

storageClass

StorageClassEnum

Yes

Explanation:

Storage class the object is transitioned to.

Restrictions:

Restrictions on storage class transitions:
  • Only transitions from the Standard storage class to the Infrequent Access storage class are supported. To transition objects from Infrequent Access to Standard, you must manually do it.
  • Only transitions from the Standard or Infrequent Access storage class to the Archive storage class are supported. To transition objects from Archive to Standard or Infrequent Access, you must first restore these objects and then manually change their storage classes.
  • Multi-AZ redundancy is not available for Archive storage. For this reason, buckets or objects with multi-AZ redundancy cannot be transitioned to the Archive storage class based on a lifecycle rule.

Value range:

See Table 10.

Default value:

None

Table 10 StorageClassEnum

Constant

Default Value

Description

STANDARD

STANDARD

Standard storage class.

WARM

WARM

Infrequent Access storage class.

COLD

COLD

Archive storage class.

Table 11 NoncurrentVersionTransition

Parameter

Type

Mandatory (Yes/No)

Description

days

Integer

This parameter is mandatory if date is not configured.

Explanation:

Number of days after its creation when the object is transitioned.

Restrictions:

This parameter is only available for noncurrent object versions.

Value range:

A positive integer, in days.

Default value:

None

storageClass

StorageClassEnum

Yes

Explanation:

Storage class the object is transitioned to.

Restrictions:

Restrictions on storage class transitions:
  • Only transitions from the Standard storage class to the Infrequent Access storage class are supported. To transition objects from Infrequent Access to Standard, you must manually do it.
  • Only transitions from the Standard or Infrequent Access storage class to the Archive storage class are supported. To transition objects from Archive to Standard or Infrequent Access, you must first restore these objects and then manually change their storage classes.
  • Multi-AZ redundancy is not available for Archive storage. For this reason, buckets or objects with multi-AZ redundancy cannot be transitioned to the Archive storage class based on a lifecycle rule.

Value range:

See Table 10.

Default value:

None

Table 12 AbortIncompleteMultipartUpload

Parameter

Type

Mandatory (Yes/No)

Description

daysAfterInitiation

int

No

Explanation:

Number of days since the initiation of an incomplete multipart upload that OBS will wait before deleting the parts that were not assembled (fragments).

Value range:

An integer greater than or equal to 0, in days.

Default value:

None

Transitions, Expiration, NoncurrentVersionTransitions, AbortIncompleteMultipartUpload, and NoncurrentVersionExpiration must not be all left blank.

Responses

Table 13 Common response headers

Parameter

Type

Description

statusCode

int

Explanation:

HTTP status code.

Value range:

A status code is a group of digits that can be 2xx (indicating successes) or 4xx or 5xx (indicating errors). It indicates the status of a response.

For more information, see Status Code.

Default value:

None

responseHeaders

Map<String, Object>

Explanation:

HTTP response header list, composed of tuples. In a tuple, the String key indicates the name of the header, and the Object value indicates the value of the header.

Default value:

None

Code Example: Setting an Object Transition Policy

This example configures a transition policy for latest and historical object versions in bucket examplebucket.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.LifecycleConfiguration;
import com.obs.services.model.StorageClassEnum;
public class SetBucketLifecycle001 {
    public static void main(String[] args) {
        // Obtain an AK/SK pair using environment variables or import the AK/SK pair in other ways. Using hard coding may result in leakage.
        // Obtain an AK/SK pair on the management console.
        String ak = System.getenv("ACCESS_KEY_ID");
        String sk = System.getenv("SECRET_ACCESS_KEY_ID");
        // (Optional) If you are using a temporary AK/SK pair and a security token to access OBS, you are advised not to use hard coding, which may result in information leakage.
        // Obtain an AK/SK pair and a security token using environment variables or import them in other ways.
        // Enter the endpoint corresponding to the bucket. CN-Hong Kong is used here as an example. Replace it with the one currently in use.
        String endPoint = "https://obs.ap-southeast-1.myhuaweicloud.com";
        // Obtain an endpoint using environment variables or import it in other ways.
        //String endPoint = System.getenv("ENDPOINT");
        
        // Create an ObsClient instance.
        // Use a permanent AK/SK pair to initialize the client.
        ObsClient obsClient = new ObsClient(ak, sk, endPoint);
        // Use a temporary AK/SK pair and security token to initialize the client.
        // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint);

        try {
            //Set an object transition policy.
            LifecycleConfiguration config = new LifecycleConfiguration();
            LifecycleConfiguration.Rule rule = config.new Rule();
            rule.setEnabled(true);
            rule.setId("rule1");
            rule.setPrefix("prefix");
            // Set the object tag as the condition for the lifecycle rule to take effect.
            // BucketTagInfo.TagSet tagSet = new BucketTagInfo.TagSet();
            // tagSet.addTag("key1", "value1");
            // tagSet.addTag("key2", "value2");
            // rule.setTagSet(tagSet);
            LifecycleConfiguration.Transition transition = config.new Transition();
            // Specify that objects whose names contain the specified prefix will be transitioned 30 days after creation.
            transition.setDays(30);
            // Specify the storage class that the object will be transitioned to.
            transition.setObjectStorageClass(StorageClassEnum.WARM);
            // Specify when the objects whose names contain the specified prefix will expire. To use this method, you need to import java.text.SimpleDateFormat.
            // transition.setDate(new SimpleDateFormat("yyyy-MM-dd").parse("2018-10-31"));
            rule.getTransitions().add(transition);
            LifecycleConfiguration.NoncurrentVersionTransition noncurrentVersionTransition =
                    config.new NoncurrentVersionTransition();
            // Specify that objects whose names contain the specified prefix will be transitioned 30 days after being historical versions.
            noncurrentVersionTransition.setDays(30);
            // Specify the storage class of the historical object version after transition.
            noncurrentVersionTransition.setObjectStorageClass(StorageClassEnum.COLD);
            rule.getNoncurrentVersionTransitions().add(noncurrentVersionTransition);
            // Set the expiration time of fragments.
            LifecycleConfiguration.AbortIncompleteMultipartUpload abortIncompleteMultipartUpload = config.new AbortIncompleteMultipartUpload();
            abortIncompleteMultipartUpload.setDaysAfterInitiation(7);
            rule.setAbortIncompleteMultipartUpload(abortIncompleteMultipartUpload);
            config.addRule(rule);
            obsClient.setBucketLifecycle("examplebucket", config);
            System.out.println("setBucketLifecycle successfully");
        } catch (ObsException e) {
            System.out.println("setBucketLifecycle failed");
            // Request failed. Print the HTTP status code.
            System.out.println("HTTP Code:" + e.getResponseCode());
            // Request failed. Print the server-side error code.
            System.out.println("Error Code:" + e.getErrorCode());
            // Request failed. Print the error details.
            System.out.println("Error Message:" + e.getErrorMessage());
            // Request failed. Print the request ID.
            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("setBucketLifecycle failed");
            // Print other error information.
            e.printStackTrace();
        }
    }
}

Code Example: Setting the Object Expiration Time

This example configures the expiration time of latest and historical object versions in bucket examplebucket.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.LifecycleConfiguration;
public class SetBucketLifecycle002 {
    public static void main(String[] args) {
        // Obtain an AK/SK pair using environment variables or import the AK/SK pair in other ways. Using hard coding may result in leakage.
        // Obtain an AK/SK pair on the management console.
        String ak = System.getenv("ACCESS_KEY_ID");
        String sk = System.getenv("SECRET_ACCESS_KEY_ID");
        // (Optional) If you are using a temporary AK/SK pair and a security token to access OBS, you are advised not to use hard coding, which may result in information leakage.
        // Obtain an AK/SK pair and a security token using environment variables or import them in other ways.
        // String securityToken = System.getenv("SECURITY_TOKEN");
        // Enter the endpoint corresponding to the bucket. CN-Hong Kong is used here as an example. Replace it with the one currently in use.
        String endPoint = "https://obs.ap-southeast-1.myhuaweicloud.com";
        // Obtain an endpoint using environment variables or import it in other ways.
        //String endPoint = System.getenv("ENDPOINT");
        
        // Create an ObsClient instance.
        // Use a permanent AK/SK pair to initialize the client.
        ObsClient obsClient = new ObsClient(ak, sk, endPoint);
        // Use a temporary AK/SK pair and security token to initialize the client.
        // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint);

        try {
            // Set the object expiration time.
            LifecycleConfiguration config = new LifecycleConfiguration();
            LifecycleConfiguration.Rule rule = config.new Rule();
            rule.setEnabled(true);
            rule.setId("rule1");
            rule.setPrefix("prefix");
            LifecycleConfiguration.Expiration expiration = config.new Expiration();
            // Specify that objects whose names contain the specified prefix will expire 60 days after creation.
            expiration.setDays(60);
            // Specify when the objects whose names contain the specified prefix will expire. To use this method, you need to import java.text.SimpleDateFormat.
            // expiration.setDate(new SimpleDateFormat("yyyy-MM-dd").parse("2018-12-31"));
            rule.setExpiration(expiration);
            LifecycleConfiguration.NoncurrentVersionExpiration noncurrentVersionExpiration =
                    config.new NoncurrentVersionExpiration();
            // Specify that objects whose names contain the specified prefix will expire after changing into historical versions for 60 days.
            noncurrentVersionExpiration.setDays(60);
            rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
            config.addRule(rule);
            obsClient.setBucketLifecycle("examplebucket", config);
            System.out.println("setBucketLifecycle successfully");
        } catch (ObsException e) {
            System.out.println("setBucketLifecycle failed");
            // Request failed. Print the HTTP status code.
            System.out.println("HTTP Code:" + e.getResponseCode());
            // Request failed. Print the server-side error code.
            System.out.println("Error Code:" + e.getErrorCode());
            // Request failed. Print the error details.
            System.out.println("Error Message:" + e.getErrorMessage());
            // Request failed. Print the request ID.
            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("setBucketLifecycle failed");
            // Print other error information.
            e.printStackTrace();
        }
    }
}