Managing delete markers - Amazon Simple Storage Service (original) (raw)
Configuring lifecycle to clean up expired delete markers automatically
An expired object delete marker is one where all object versions are deleted and only a single delete marker remains. If the lifecycle configuration is set to delete current versions, or the ExpiredObjectDeleteMarker
action is explicitly set, Amazon S3 removes the expired object’s delete marker. For an example, see Removing expired object delete markers in a versioning-enabled bucket.
Removing delete markers to make an older version current
When you delete an object in a versioning-enabled bucket, all versions remain in the bucket, and Amazon S3 creates a delete marker for the object. To undelete the object, you must delete this delete marker. For more information about versioning and delete markers, see Retaining multiple versions of objects with S3 Versioning.
To delete a delete marker permanently, you must include its version ID in aDeleteObject versionId
request. The following figure shows how a DeleteObject versionId
request permanently removes a delete marker.
The effect of removing the delete marker is that a simple GET
request will now retrieve the current version ID (121212) of the object.
Note
If you use a DeleteObject
request where the current version is a delete marker (without specifying the version ID of the delete marker), Amazon S3 does not delete the delete marker, but instead PUTs
another delete marker.
To delete a delete marker with a NULL
version ID, you must pass the NULL
as the version ID in the DeleteObject
request. The following figure shows how a simple DeleteObject
request made without a version ID where the current version is a delete marker, removes nothing, but instead adds an additional delete marker with a unique version ID (7498372).
Use the following steps to recover deleted objects that are not folders from your S3 bucket, including objects that are within those folders.
- Sign in to the AWS Management Console and open the Amazon S3 console athttps://console.aws.amazon.com/s3/.
- In the Buckets list, choose the name of the bucket that you want.
- To see a list of the versions of the objects in the bucket, choose the List versions switch. You'll be able to see the delete markers for deleted objects.
- To undelete an object, you must delete the delete marker. Select the check box next to the delete marker of the object to recover, and then choose Delete.
- Confirm the deletion on the Delete objects page.
- For Permanently delete objects? enter
permanently delete
. - Choose Delete objects.
- For Permanently delete objects? enter
To permanently remove a delete marker
- Set
versionId
to the ID of the version to the delete marker you want to remove. - Send a
DELETE Object versionId
request.
Example — Removing a delete marker
The following example removes the delete marker forphoto.gif
version 4857693.
DELETE /photo.gif?versionId=4857693 HTTP/1.1
Host: bucket.s3.amazonaws.com
Date: Wed, 28 Oct 2009 22:32:00 GMT
Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
When you delete a delete marker, Amazon S3 includes the following in the response.
204 NoContent
x-amz-version-id: versionID
x-amz-delete-marker: true
For information about using other AWS SDKs, see the AWSDeveloper Center.
Python
The following Python code example demonstrates how to remove a delete marker from an object and thus makes the most recent non-current version, the current version of the object.
def revive_object(bucket, object_key):
"""
Revives a versioned object that was deleted by removing the object's active
delete marker.
A versioned object presents as deleted when its latest version is a delete marker.
By removing the delete marker, we make the previous version the latest version
and the object then presents as *not* deleted.
Usage is shown in the usage_demo_single_object function at the end of this module.
:param bucket: The bucket that contains the object.
:param object_key: The object to revive.
"""
# Get the latest version for the object.
response = s3.meta.client.list_object_versions(
Bucket=bucket.name, Prefix=object_key, MaxKeys=1
)
if "DeleteMarkers" in response:
latest_version = response["DeleteMarkers"][0]
if latest_version["IsLatest"]:
logger.info(
"Object %s was indeed deleted on %s. Let's revive it.",
object_key,
latest_version["LastModified"],
)
obj = bucket.Object(object_key)
obj.Version(latest_version["VersionId"]).delete()
logger.info(
"Revived %s, active version is now %s with body '%s'",
object_key,
obj.version_id,
obj.get()["Body"].read(),
)
else:
logger.warning(
"Delete marker is not the latest version for %s!", object_key
)
elif "Versions" in response:
logger.warning("Got an active version for %s, nothing to do.", object_key)
else:
logger.error("Couldn't get any version info for %s.", object_key)