Help Center> Object Storage Service> Java> Lifecycle Management (SDK for Java)> Setting Lifecycle Rules (SDK for Java)
Updated on 2024-01-26 GMT+08:00

Setting Lifecycle Rules (SDK for Java)

Function

This API configures lifecycle rules for a bucket to periodically delete objects in the bucket or transition objects between storage classes. For more information, see Lifecycle Management.

  1. An object will be automatically deleted by the OBS server once it expires.
  2. The time set in the transition policy of an object must be earlier than its expiration time, and the time set in the transition policy of a noncurrent object version must be earlier than its expiration time.
  3. The configured expiration time and transition policy for a noncurrent object version can only take effect when versioning is enabled or suspended for the bucket where that object version is stored.
  • The minimum storage duration is 30 days for Infrequent Access storage, and 90 days for Archive storage. After an object is transitioned to the Archive storage class, if it stays in this storage class for less than 90 days, you still need to pay for a full 90 days.

If you have any questions during development, post them on the Issues page of GitHub.

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.
  • A maximum of 20 lifecycle rules can be configured 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

deleteRequest

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 periods (.) and hyphens (-) 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 to enable the rule.

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 5.

Default value:

None

noncurrentVersionExpiration

NoncurrentVersionExpiration

No

Explanation:

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

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 7.

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 9.

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

Table 5 Expiration

Parameter

Type

Mandatory (Yes/No)

Description

days

Integer

This parameter is mandatory if date is not configured.

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

This parameter is mandatory if days is not configured.

Explanation:

OBS deletes objects that were modified before the specified date.

Default value:

None

Table 6 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 7 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 restore the archived objects first and then manually transition their storage classes.
  • Multi-AZ redundancy does not support 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 8.

Default value:

None

Table 8 StorageClassEnum

Constant

Default Value

Description

STANDARD

STANDARD

Standard storage class

WARM

WARM

Infrequent Access storage class.

COLD

COLD

Archive storage class.

Table 9 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 restore the archived objects first and then manually transition their storage classes.
  • Multi-AZ redundancy does not support 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 8.

Default value:

None

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

Responses

Table 10 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
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.
        // 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 in your actual situation.
        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 the permanent AK/SK pair to initialize the client.
        ObsClient obsClient = new ObsClient(ak, sk,endPoint);
        // Use the 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");
            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 be transitioned.
            // 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 in your actual situation.
        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 the permanent AK/SK pair to initialize the client.
        ObsClient obsClient = new ObsClient(ak, sk,endPoint);
        // Use the 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.
            // 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();
        }
    }
}