Archiving and accessing cold data
IBM Cloud® Object Storage "Archive" and "Accelerated Archive" are low cost options for data that is rarely accessed. You can store data by transitioning from any of the storage tiers (Standard, Vault, Cold Vault and Flex) to long-term offline archive or use the online Cold Vault option. With the new "Accelerated Archive" feature you can quickly access dormant data with restoration occurring in less than two hours.
This feature is not currently supported in Object Storage for Satellite. Learn more.
You can archive objects using the web console, REST API, and 3rd party tools that are integrated with IBM Cloud Object Storage.
For more information about endpoints, see Endpoints and storage locations
Add or manage an archive policy on a bucket
When creating or modifying an archive policy for a bucket, consider the following:
- An archive policy can be added to a new or existing bucket at any time.
- An existing archive policy can be modified or disabled.
- A newly added or modified archive policy applies to new objects uploaded and does not affect existing objects.
Create a bucket in the console after you've logged in, and you can configure your archive policy using the fields shown in Figure 1.
To immediately archive new objects uploaded to a bucket, enter 0 days on the archive policy.
Archive is available in certain regions only. See Integrated Services for more details.
Restore an archived object
In order to access an archived object, you must restore it to the original storage tier. When restoring an object, you can specify the number of days you want the object to be available. At the end of the specified period, the restored copy is deleted.
The restoration process for "Accelerated Archive" takes up to 2 hours, while the restoration process for Archive takes up to 12 hours.
The archived object sub-states are:
- Archived: An object in the archived state has been moved from its online storage tier (Standard, Vault, Cold Vault and Flex) to the offline archive tier based on the archive policy on the bucket.
- Restoring: An object in the restoring state is in the process of generating a copy from the archived state to its original online storage tier.
- Restored: An object in the restored state is a copy of the archived object that was restored to its original online storage tier for a specified amount of time. At the end of the period, the copy of the object is deleted, while maintaining the archived object.
Restoring an object using the AWS CLI
The following examples uses environment variables for clarity. These must be set to the desired values, for example $ENDPOINT
would be set to https://s3.us.cloud-object-storage.appdomain.cloud
, or https://s3.eu-de.private.cloud-object-storage.appdomain.cloud
,
or any other required value.
- Check object status:
aws --endpoint-url $ENDPOINT s3api head-object --bucket $BUCKET --key $KEY
The storage class will be shown as("StorageClass": "GLACIER")
- Restore the object:
aws --endpoint-url $ENDPOINT s3api restore-object ---bucket $BUCKET --key $KEY --restore-request '{"Days":25,"GlacierJobParameters":{"Tier":"Bulk"}}'
- Check the status:
aws --endpoint-url $ENDPOINT s3api head-object --bucket $BUCKET --key $KEY
Limitations
Archive policies are implemented using subset of the PUT Bucket Lifecycle Configuration
S3 API operation.
Supported functionality includes:
- Specifying either a date or the number of days in the future when objects transition to an archived state.
- Setting expiration rules for objects.
Policies specifying a date in the past may take up to a few days to complete.
Unsupported functionality includes:
- Multiple transition rules per bucket.
- Filtering objects to archive using a prefix or object key.
- Tiering between storage classes.
Classic Infrastructure (non-IAM) users are unable to set the transition storage class to ACCELERATED
.
Using the REST API and SDKs
Create a bucket lifecycle configuration
This implementation of the PUT
operation uses the lifecycle
query parameter to set lifecycle settings for the bucket. This operation allows for a single lifecycle policy definition for a given bucket. The policy is
defined as a rule consisting of the following parameters: ID
, Status
, and Transition
.
The transition action enables future objects written to the bucket to an archived state after a defined period of time. Changes to the lifecycle policy for a bucket are only applied to new objects written to that bucket.
Cloud IAM users must have at a minimum the Writer
role to add a lifecycle policy to the bucket.
Classic Infrastructure Users must have Owner Permissions and be able to create buckets in the storage account to add a lifecycle policy to the bucket.
This operation does not make use of additional operation specific query parameters.
Header | Type | Description |
---|---|---|
Content-MD5 |
string | Required: The base64 encoded 128-bit MD5 hash of the payload, used as an integrity check to ensure the payload was not altered in transit. |
The body of the request must contain an XML block with the following schema:
Element | Type | Children | Ancestor | Constraint |
---|---|---|---|---|
LifecycleConfiguration |
Container | Rule |
None | Limit 1. |
Rule |
Container | ID , Status , Filter , Transition |
LifecycleConfiguration |
Limit 1. |
ID |
String | None | Rule |
Must consist of (a-z ,A-Z , 0-9 ) and the following symbols: ! _ . * ' ( ) - |
Filter |
String | Prefix |
Rule |
Must contain a Prefix element |
Prefix |
String | None | Filter |
Must be set to <Prefix/> . |
Transition |
Container |
Days , StorageClass |
Rule |
Limit 1 transition rule, and a maximum of 1000 total rules. |
Days |
Non-negative integer | None | Transition |
Must be a value equal to or greater than 0. |
Date |
Date | None | Transistion |
Must be in ISO 8601 Format and the date must be in the future. |
StorageClass |
String | None | Transition |
GLACIER or ACCELERATED |
Syntax
PUT https://{endpoint}/{bucket}?lifecycle # path style
PUT https://{bucket}.{endpoint}?lifecycle # virtual host style
<LifecycleConfiguration>
<Rule>
<ID>{string}</ID>
<Status>Enabled</Status>
<Filter>
<Prefix/>
</Filter>
<Transition>
<Days>{integer}</Days>
<StorageClass>{StorageClass}</StorageClass>
</Transition>
</Rule>
</LifecycleConfiguration>
Examples
Sample Request
PUT /images?lifecycle HTTP/1.1
Host: s3.us.cloud-object-storage.appdomain.cloud
Date: Wed, 7 Feb 2018 17:50:00 GMT
Authorization: authorization string
Content-Type: text/plain
Content-MD5: 1B2M2Y8AsgTpgAmY7PhCfg==
Content-Length: 305
<LifecycleConfiguration>
<Rule>
<ID>my-archive-policy</ID>
<Filter>
<Prefix/>
</Filter>
<Status>Enabled</Status>
<Transition>
<Days>20</Days>
<StorageClass>ACCELERATED</StorageClass>
</Transition>
</Rule>
</LifecycleConfiguration>
Sample Response
HTTP/1.1 200 OK
Date: Wed, 7 Feb 2018 17:51:00 GMT
Connection: close
var params = {
Bucket: 'STRING_VALUE', /* required */
LifecycleConfiguration: {
Rules: [ /* required */
{
Status: 'Enabled', /* required */
ID: 'STRING_VALUE',
Filter: '', /* required */
Prefix: '',
Transitions: [
{
Date: DATE, /* required if Days not specified */
Days: 0, /* required if Date not specified */
StorageClass: 'STRING_VALUE' /* required */
},
]
},
]
}
};
s3.putBucketLifecycleConfiguration(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
response = client.put_bucket_lifecycle_configuration(
Bucket='string',
LifecycleConfiguration={
'Rules': [
{
'ID': 'string',
'Status': 'Enabled',
'Filter': '',
'Prefix': '',
'Transitions': [
{
'Date': datetime(2015, 1, 1),
'Days': 123,
'StorageClass': 'GLACIER'
},
]
},
]
}
)
public SetBucketLifecycleConfigurationRequest(String bucketName,
BucketLifecycleConfiguration lifecycleConfiguration)
Method Summary
Method | Description |
---|---|
getBucketName() |
Gets the name of the bucket whose lifecycle configuration is being set. |
getLifecycleConfiguration() |
Gets the new lifecycle configuration for the specified bucket. |
setBucketName(String bucketName) |
Sets the name of the bucket whose lifecycle configuration is being set. |
withBucketName(String bucketName) |
Sets the name of the bucket whose lifecycle configuration is being set, and returns this object so that additional method calls may be chained together. |
Retrieve a bucket lifecycle configuration
This implementation of the GET
operation uses the lifecycle
query parameter to retrieve the lifecycle settings for the bucket.
Cloud IAM users must have at a minimum the Reader
role to retrieve a lifecycle for a bucket.
Classic Infrastructure Users must have at minimum Read
permissions on the bucket to retrieve a lifecycle policy for a bucket.
This operation does not make use of additional operation specific headers, query parameters, or payload.
Syntax
GET https://{endpoint}/{bucket}?lifecycle # path style
GET https://{bucket}.{endpoint}?lifecycle # virtual host style
Examples
Sample Request
GET /images?lifecycle HTTP/1.1
Host: s3.us.cloud-object-storage.appdomain.cloud
Date: Wed, 7 Feb 2018 17:50:00 GMT
Authorization: authorization string
Sample Response
HTTP/1.1 200 OK
Date: Wed, 7 Feb 2018 17:51:00 GMT
Connection: close
<LifecycleConfiguration>
<Rule>
<ID>my-archive-policy</ID>
<Filter />
<Status>Enabled</Status>
<Transition>
<Days>20</Days>
<StorageClass>GLACIER</StorageClass>
</Transition>
</Rule>
</LifecycleConfiguration>
var params = {
Bucket: 'STRING_VALUE' /* required */
};
s3.getBucketLifecycleConfiguration(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
response = client.get_bucket_lifecycle_configuration(Bucket='string')
public GetBucketLifecycleConfigurationRequest(String bucketName)
Delete a bucket lifecycle configuration
This implementation of the DELETE
operation uses the lifecycle
query parameter to remove any lifecycle settings for the bucket. Transitions defined by the rules will no longer take place for new objects.
Note: Existing transition rules will be maintained for objects that were already written to the bucket before the rules were deleted.
Cloud IAM users must have at a minimum the Writer
role to remove a lifecycle policy from a bucket.
Classic Infrastructure Users must have Owner
permissions on the bucket to remove a lifecycle policy from a bucket.
This operation does not make use of additional operation specific headers, query parameters, or payload.
Syntax
DELETE https://{endpoint}/{bucket}?lifecycle # path style
DELETE https://{bucket}.{endpoint}?lifecycle # virtual host style
Examples
Sample Request
DELETE /images?lifecycle HTTP/1.1
Host: s3.us.cloud-object-storage.appdomain.cloud
Date: Wed, 7 Feb 2018 18:50:00 GMT
Authorization: authorization string
Sample Response
HTTP/1.1 204 No Content
Date: Wed, 7 Feb 2018 18:51:00 GMT
Connection: close
var params = {
Bucket: 'STRING_VALUE' /* required */
};
s3.deleteBucketLifecycle(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
response = client.delete_bucket_lifecycle(Bucket='string')
public DeleteBucketLifecycleConfigurationRequest(String bucketName)
Temporarily restore an archived object
This implementation of the POST
operation uses the restore
query parameter to request temporary restoration of an archived object. The user must first restore an archived object before downloading or modifying the
object. When restoring an object, the user must specify a period after which the temporary copy of the object will be deleted. The object maintains the storage class of the bucket.
There can be a delay of up to 12 hours before the restored copy is available for access. A HEAD
request can check if the restored copy is available.
To permanently restore the object, the user must copy the restored object to a bucket that does not have an active lifecycle configuration.
Cloud IAM users must have at a minimum the Writer
role to restore an object.
Classic Infrastructure users must have at a minimum Write
permissions on the bucket and Read
permission on the object to restore it.
This operation does not make use of additional operation specific query parameters.
Header | Type | Description |
---|---|---|
Content-MD5 |
string | Required: The base64 encoded 128-bit MD5 hash of the payload, used as an integrity check to ensure the payload was not altered in transit. |
The body of the request must contain an XML block with the following schema:
Element | Type | Children | Ancestor | Constraint |
---|---|---|---|---|
RestoreRequest |
Container | Days , GlacierJobParameters |
None | None |
Days |
Integer | None | RestoreRequest |
Specified the lifetime of the temporarily restored object. The minimum number of days that a restored copy of the object can exist is 1. After the restore period has elapsed, temporary copy of the object will be removed. |
GlacierJobParameters |
String | Tier |
RestoreRequest |
None |
Tier |
String | None | GlacierJobParameters |
Optional, and if left blank will default to the value associated with the storage tier of the policy that was in place when the object was written. If this value is not left blank, it must be set to Bulk if the transition storage class for the bucket's lifecycle policy was set to GLACIER , and must be set to Accelerated if the transition storage class was set to ACCELERATED . |
A successful response returns a 202
if the object is in the archived state and a 200
if the object is already in the restored state. If the object is already in the restored state and a new request to restore the
object is received, the Days
element will update the expiration time of the restored object.
Syntax
POST https://{endpoint}/{bucket}/{object}?restore # path style
POST https://{bucket}.{endpoint}/{object}?restore # virtual host style
<RestoreRequest>
<Days>{integer}</Days>
<GlacierJobParameters>
<Tier>Bulk</Tier>
</GlacierJobParameters>
</RestoreRequest>
Examples
Sample Request
POST /images/backup?restore HTTP/1.1
Host: s3.us.cloud-object-storage.appdomain.cloud
Date: Wed, 7 Feb 2018 19:50:00 GMT
Authorization: {authorization string}
Content-Type: text/plain
Content-MD5: 1B2M2Y8AsgTpgAmY7PhCfg==
Content-Length: 305
<RestoreRequest>
<Days>3</Days>
<GlacierJobParameters>
<Tier>Bulk</Tier>
</GlacierJobParameters>
</RestoreRequest>
Sample Response
HTTP/1.1 202 Accepted
Date: Wed, 7 Feb 2018 19:51:00 GMT
Connection: close
var params = {
Bucket: 'STRING_VALUE', /* required */
Key: 'STRING_VALUE', /* required */
ContentMD5: 'STRING_VALUE', /* required */
RestoreRequest: {
Days: 1, /* days until copy expires */
GlacierJobParameters: {
Tier: 'STRING_VALUE' /* required */
},
}
};
s3.restoreObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
response = client.restore_object(
Bucket='string',
Key='string',
RestoreRequest={
'Days': 123,
'GlacierJobParameters': {
'Tier': 'string'
},
}
)
public RestoreObjectRequest(String bucketName,
String key,
int expirationInDays)
Method Summary
Method | Description |
---|---|
clone() |
Creates a shallow clone of this object for all fields except the handler context. |
getBucketName() |
Returns the name of the bucket containing the reference to the object to restore. |
getExpirationInDays() |
Returns the time in days from an object's creation to its expiration. |
setExpirationInDays(int expirationInDays) |
Sets the time, in days, between when an object is uploaded to the bucket and when it expires. |
Get an object's headers
A HEAD
given a path to an object retrieves that object's headers. This operation does not make use of operation specific query parameters or payload elements.
Syntax
HEAD https://{endpoint}/{bucket-name}/{object-name} # path style
HEAD https://{bucket-name}.{endpoint}/{object-name} # virtual host style
Response headers for archived objects
Header | Type | Description |
---|---|---|
x-amz-restore |
string | Included if the object has been restored or if a restoration is in progress. If the object has been restored, the expiry date for the temporary copy is also returned. |
x-amz-storage-class |
string | Returns GLACIER or ACCELERATED if archived or temporarily restored. |
x-ibm-archive-transition-time |
date | Returns the date and time when the object is scheduled to transition to the archive tier. |
x-ibm-transition |
string | Included if the object has transition metadata and returns the tier and original time of transition. |
x-ibm-restored-copy-storage-class |
string | Included if an object is in the RestoreInProgress or Restored states and returns the storage class of the bucket. |
Sample request
HEAD /images/backup HTTP/1.1
Authorization: {authorization-string}
x-amz-date: 20160825T183244Z
Host: s3.us.cloud-object-storage.appdomain.cloud
Sample response
HTTP/1.1 200 OK
Date: Wed, 7 Feb 2018 19:51:00 GMT
X-Clv-Request-Id: da214d69-1999-4461-a130-81ba33c484a6
Accept-Ranges: bytes
Server: 3.x
X-Clv-S3-Version: 2.5
ETag: "37d4c94839ee181a2224d6242176c4b5"
Content-Type: text/plain; charset=UTF-8
Last-Modified: Thu, 25 Aug 2017 17:49:06 GMT
Content-Length: 11
x-ibm-transition: transition="ARCHIVE", date="Mon, 03 Dec 2018 22:28:38 GMT"
x-amz-restore: ongoing-request="false", expiry-date="Thu, 06 Dec 2018 18:28:38 GMT"
x-amz-storage-class: "GLACIER"
x-ibm-restored-copy-storage-class: "Standard"
response = client.head_object(
Bucket='string',
Key='string'
)
var params = {
Bucket: 'STRING_VALUE', /* required */
Key: 'STRING_VALUE', /* required */
};
s3.headObject(params, function(err,data) {
if (err) console.log(err, err.stack); // an error occurred
else
console.log(data); // successful response
});
public ObjectMetadata()
Method Summary
Method | Description |
---|---|
clone() |
Returns a clone of this ObjectMetadata . |
getRestoreExpirationTime() |
Returns the time at which an object that has been temporarily restored from ARCHIVE will expire, and will need to be restored again in order to be accessed. |
getStorageClass() |
Returns the original storage class of the bucket. |
getIBMTransition() |
Return the transition storage class and time of transition. |
Next Steps
In addition to cold storage, IBM Cloud currently provides several additional object storage classes for different user needs, all of which are accessible through web-based portals and RESTful APIs. Learn more about all storage classes available at IBM Cloud Object Storage.