Creación de versiones de objetos
El mantenimiento de versiones permite que existan varias revisiones de un único objeto en el mismo grupo. Cada versión de un objeto puede consultarse, leerse, restaurarse desde un estado archivado o suprimirse. La habilitación del mantenimiento
de versiones en un grupo puede mitigar la pérdida de datos por error de usuario o supresión involuntaria. Cuando se sobrescribe un objeto, se crea una nueva versión y se conserva automáticamente la versión anterior del objeto. Por lo tanto,
en un grupo habilitado para el mantenimiento de versiones, los objetos que se suprimen como resultado de una supresión o sobrescritura accidental se pueden recuperar fácilmente restaurando una versión anterior del objeto. Si se suprime un objeto,
se sustituye por un marcador de supresión y se guarda la versión anterior (no se suprime permanentemente nada). Para suprimir permanentemente versiones individuales de un objeto, una solicitud de supresión debe especificar un ID de versión.
Una solicitud GET para un objeto recuperará la versión almacenada más recientemente. Si la versión actual es un marcador de supresión, IBM COS devuelve un error 404 Not Found.
Después de que un grupo haya habilitado el mantenimiento de versiones, se versionarán todos los objetos del grupo. Todos los objetos nuevos (creados después de habilitar el mantenimiento de versiones en un grupo) recibirán un ID de versión asignado
de forma permanente. A los objetos creados antes de habilitar el mantenimiento de versiones (en el grupo) se les asigna una versión de null. Cuando se sobrescribe o se suprime un objeto con un ID de versión de null,
se le asigna un nuevo ID de versión. La suspensión del mantenimiento de versiones no altera ningún objeto existente, pero cambiará la forma en que IBM COS maneja las solicitudes futuras. Una vez habilitado, el mantenimiento de versiones sólo
se puede suspender y no inhabilitar por completo. Por lo tanto, un grupo puede tener tres estados relacionados con el mantenimiento de versiones: 1. Valor predeterminado (sin versión), 2. Habilitado o 3. Suspendido.
Iniciación al mantenimiento de versiones
En primer lugar, cree un nuevo grupo con el mantenimiento de versiones de objetos habilitado.
- Después de navegar a la instancia de almacenamiento de objetos, pulse Crear grupo.
- Elija una región y resiliencia y, a continuación, busque Creación de versiones de objetos y conmute el selector a Habilitado.
A continuación, cree un objeto con versión.
- Navegue por el nuevo grupo y cargue un archivo arrastrándolo a la ventana del navegador.
- Después de que el objeto se haya cargado correctamente, cargue otro objeto con el mismo nombre. En lugar de sobrescribirse, al archivo se le asignará un UUID y se guardará como una versión no actual del objeto.
- Conmute Ver versiones para ver e interactuar con versiones alternativas de objetos.
la opción "Ver versiones" debe estar activada antes de que las versiones individuales o los marcadores de borrado sean visibles y seleccionables para su eliminación.
Terminología
Suprimir marcador: un objeto 'invisible' que permite acceder a versiones del objeto suprimido.
ID de versión: Una cadena opaca codificada en Unicode, UTF-8 y URL-safe, que indica una versión única de un objeto y los metadatos asociados, y se utiliza para dirigir las solicitudes a esa versión concreta. Los ID de versión tienen una longitud máxima de 1.024 bytes.
'null': un ID de versión especial asignado a los objetos que existían cuando se habilitó el mantenimiento de versiones en un grupo.
Coherencia e integridad de datos
Aunque IBM COS proporciona una fuerte coherencia para todas las operaciones de E/S de datos, la configuración del grupo es finalmente coherente. Después de habilitar el mantenimiento de versiones por primera vez en un grupo, la configuración puede tardar unos instantes en propagarse por el sistema. Aunque el control de versiones pueda parecer habilitado, se recomienda esperar 5 minutos después de habilitarlo para realizar cualquier solicitud que se prevea que cree versiones o elimine marcadores.
Acciones de IAM
Hay nuevas acciones de IAM asociadas con el mantenimiento de versiones.
| Acción IAM | Rol |
|---|---|
| cloud-object-storage.bucket.put_versioning | Gestor, Escritor |
| cloud-object-storage.bucket.get_versioning | Gestor, Escritor, Lector |
| cloud-object-storage.object.get_version | Gestor, Escritor, Lector, Lector de contenido, Lector de objetos |
| cloud-object-storage.object.head_version | Gestor, Escritor, Lector, Lector de contenido, Lector de objetos |
| cloud-object-storage.bucket.delete_version | Gestor, Escritor |
| cloud-object-storage.object.get_versions | Gestor, Escritor, Lector, Lector de contenido, Lector de objetos |
| cloud-object-storage.object.copy_get_version | Gestor, Escritor, Lector |
| cloud-object-storage.object.copy_part_get_version | Gestor, Escritor, Lector |
| cloud-object-storage.object.restore_version | Gestor, Escritor |
| cloud-object-storage.object.put_tagging_version | Gestor, Escritor, Escritor de objetos |
| cloud-object-storage.object.get_tagging_version | Gestor, Escritor, Lector |
| cloud-object-storage.object.delete_tagging_version | Gestor, Escritor |
Sucesos de Activity Tracker
El mantenimiento de versiones generará nuevos sucesos.
cloud-object-storage.bucket-versioning.createcloud-object-storage.bucket-versioning.readcloud-object-storage.bucket-versioning.list
Los sucesos de gestión para grupos con versión contienen un campo requestData.versioning.state, que indica si el mantenimiento de versiones está habilitado o suspendido en un grupo.
Las acciones básicas HEAD, GET, PUT y DELETE que actúan o crean versiones de objetos incluirán un campo target.versionId. El campo target.versionId también está presente
al completar una carga de varias partes y al copiar objetos o partes, si se crea una nueva versión debido a estas acciones.
Un campo responseData.deleteMarker.created está presente cuando se suprime un objeto y se crea un marcador de supresión.
Uso y contabilidad
Todas las versiones se miden como si fueran objetos iguales. Esto significa que si un grupo contiene un único objeto con cinco versiones anteriores, el campo object_count devuelto por la API de configuración de recursos será 6, aunque aparecerá como si sólo hubiera un único objeto en el grupo. Del mismo modo, las versiones acumuladas contribuyen al uso total y son facturables. Además del campo object_count devuelto por la API Leer metadatos de grupo,
el cuerpo de respuesta de la API contiene varios campos nuevos asociados con el mantenimiento de versiones:
noncurrent_object_count: número de versiones de objeto no actuales en el grupo en formatoint64.noncurrent_bytes_used: tamaño total de todas las versiones de objeto no actuales en el grupo en formatoint64.delete_marker_count: número total de marcadores de supresión en el grupo en formatoint64.
Como se ha mencionado, el mantenimiento de versiones sólo se puede habilitar o suspender. Si por alguna razón desea inhabilitar completamente el mantenimiento de versiones, es necesario migrar el contenido del grupo a un nuevo grupo que no tenga habilitado el mantenimiento de versiones.
Interacciones
La implementación en IBM COS de las APIs S3 para el versionado es idéntica a las APIs AWS S3 para el versionado, con algunas diferencias.
Archivado y caducidad de objetos con versión
Las configuraciones de ciclo de vida están permitidas en un grupo habilitado para la versión. Sin embargo, a diferencia de Amazon S3, las nuevas versiones están sujetas a la regla de archivado de la misma forma que los objetos normales. A los objetos se les da una fecha de transición cuando se crean y se archivan en su fecha de transición individual, independientemente de si son versiones actuales o no actuales. La sobrescritura de un objeto no afecta a la fecha de transición de la versión anterior y a la nueva versión (actual) se le asignará una fecha de transición.
No es posible utilizar reglas de NoncurrentVersionTransition para archivar sólo versiones no actuales de objetos en una configuración de ciclo de vida.
Inmutable Object Storage (WORM)
La implementación de IBM COS de Object Storage inmutable (es decir, políticas de retención) no está permitida en grupos con el mantenimiento de versiones habilitado. Los intentos de crear una política de retención fallarán, al igual que los intentos de habilitar el mantenimiento de versiones en un grupo con una política de retención.
API S3 soportadas
El siguiente conjunto de API REST puede interactuar con el mantenimiento de versiones de alguna manera:
GET ObjectHEAD ObjectDELETE ObjectGET Object ACLPUT Object ACLUpload Part CopyRestore ObjectDELETE ObjectsList Object VersionsPUT Bucket VersioningGET Bucket VersioningPUT ObjectPOST ObjectCopy ObjectComplete Multipart UploadPUT Object TaggingGET Object TaggingDELETE Object TaggingPUT Bucket LifecycleGET Bucket LifecycleDELETE Bucket Lifecycle
Ejemplos de API REST
Los ejemplos siguientes se muestran utilizando cURL para facilitar su uso. Las variables de entorno se utilizan para representar elementos específicos del usuario como, por ejemplo, $BUCKET, $TOKEN y $REGION.
Tenga en cuenta que $REGION también incluiría cualquier especificación de tipo de red, por lo que el envío de una solicitud a un grupo en us-south utilizando la red privada requeriría establecer la variable en private.us-south.
Habilitar mantenimiento de versiones en un grupo
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: 8qj8HSeDu3APPMQZVG06WQ==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<VersioningConfiguration>
<Status>Enabled</Status>
</VersioningConfiguration>'
Una solicitud correcta devuelve una respuesta 200.
Suspender mantenimiento de versiones en un grupo
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: hxXDWuCDWB72Be0LG4XniQ==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<VersioningConfiguration>
<Status>Suspended</Status>
</VersioningConfiguration>'
Una solicitud correcta devuelve una respuesta 200.
Listar las versiones de los objetos de un cubo
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versions" \
-H 'Authorization: bearer $TOKEN'
Esto devuelve un cuerpo de respuesta XML:
<ListVersionsResult>
<IsTruncated>boolean</IsTruncated>
<KeyMarker>string</KeyMarker>
<VersionIdMarker>string</VersionIdMarker>
<NextKeyMarker>string</NextKeyMarker>
<NextVersionIdMarker>string</NextVersionIdMarker>
<Version>
<ETag>string</ETag>
<IsLatest>boolean</IsLatest>
<Key>string</Key>
<LastModified>timestamp</LastModified>
<Owner>
<DisplayName>string</DisplayName>
<ID>string</ID>
</Owner>
<Size>integer</Size>
<StorageClass>string</StorageClass>
<VersionId>string</VersionId>
</Version>
...
<DeleteMarker>
<IsLatest>boolean</IsLatest>
<Key>string</Key>
<LastModified>timestamp</LastModified>
<Owner>
<DisplayName>string</DisplayName>
<ID>string</ID>
</Owner>
<VersionId>string</VersionId>
</DeleteMarker>
...
<Name>string</Name>
<Prefix>string</Prefix>
<Delimiter>string</Delimiter>
<MaxKeys>integer</MaxKeys>
<CommonPrefixes>
<Prefix>string</Prefix>
</CommonPrefixes>
...
<EncodingType>string</EncodingType>
</ListVersionsResult>
delimiter: Un delimitador es un carácter que se especifica para agrupar claves. Todas las claves que contienen la misma serie entre el prefijo y la primera aparición del delimitador se agrupan bajo un único elemento
de resultado en CommonPrefixes. Estos grupos se cuentan como un resultado con respecto a la limitación de máximo de claves. Estas claves no se devuelven en ningún otro lugar de la respuesta.
encoding-type: solicita COS para codificar por URL las claves de objeto en la respuesta. Las claves de objeto pueden contener cualquier carácter Unicode; sin embargo, el analizador 1.0 XML no puede analizar algunos
caracteres, como los caracteres con un valor ASCII de 0 a 10. Para los caracteres que no están soportados en XML 1.0, puede añadir este parámetro para solicitar que COS codifique las claves en la respuesta. Valor válido: url.
key-marker: Especifica la clave con la que empezar a listar los objetos de un cubo.
max-keys: establece el número máximo de claves devueltas en la respuesta. De forma predeterminada, la API devuelve hasta 1.000 nombres de clave. La respuesta puede contener menos claves, pero nunca contendrá más.
prefix: utilice este parámetro para seleccionar sólo las claves que empiezan por el prefijo especificado.
version-id-marker: especifica la versión de objeto desde la que desea empezar a listar.
Eliminar versiones de objetos de un cubo
Una llamada normal a ListObjects o ListObjectsV2 no devuelve identificadores de versión. Para obtener los identificadores de versión necesarios para cualquier operación de borrado, debe utilizar ListObjectVersions:
una petición GET con el parámetro de consulta ?versions. También devuelve los marcadores de borrado y sus ID de versión. Sin este paso, no es posible realizar ninguna de las operaciones de borrado que se describen a continuación.
ejemplo de curl:
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versions" \
-H 'Authorization: bearer $TOKEN'
IBM Cloud Ejemplo CLI:
ibmcloud cos object-versions --bucket $BUCKET
Ejemplo de Python:
pythonresponse = cosClient.list_object_versions(Bucket=BUCKET)
for version in response.get('Versions', []):
print(version['Key'], version['VersionId'])
for marker in response.get('DeleteMarkers', []):
print(marker['Key'], marker['VersionId'], '(delete marker)')
Ejemplos de CLI y SDK para borrar una versión específica.
IBM Cloud Ejemplo CLI:
ibmcloud cos object-delete --bucket $BUCKET --key $OBJECT_KEY --version-id $VERSION_ID
Ejemplo de Python:
pythoncosClient.delete_object(
Bucket=BUCKET,
Key='my-object.txt',
VersionId='L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo'
)
Node.js:
javascriptawait cos.deleteObject({
Bucket: 'my-versioning-bucket',
Key: 'my-object.txt',
VersionId: 'L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo'
}).promise();
La eliminación de las versiones actuales mediante la interfaz de usuario requiere la eliminación previa de los objetos no actuales.
Eliminar un marcador de borrado
La eliminación de un marcador de borrado es el flujo de trabajo de recuperación cuando un objeto se borra accidentalmente: se obtiene el ID de versión del marcador de borrado de ListObjectVersions, y luego se borra por ese ID
de versión.
Borrar ID de versión nula
A los objetos pre-versionados se les asigna un ID de versión nulo, y para borrar esa versión, se pasa versionId=null en la petición.
ejemplo de curl:
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT_KEY?versionId=null" \
-H 'Authorization: bearer $TOKEN'
Ejemplo de Python:
cosClient.delete_object(
Bucket=BUCKET,
Key='my-object.txt',
VersionId='null'
)
Operaciones en versiones específicas de objetos
Varias API utilizan un nuevo parámetro de consulta (?versionId=<VersionId>) que indica qué versión del objeto está solicitando. Este parámetro se utiliza de la misma forma para leer, suprimir, comprobar metadatos y etiquetas
y restaurar objetos archivados. Por ejemplo, para leer una versión de un objeto foo con un ID de versión de L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo, la solicitud podría ser similar a la siguiente:
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
-H 'Authorization: bearer $TOKEN'
La supresión de ese objeto se realiza de la misma forma.
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
-H 'Authorization: bearer $TOKEN'
Para las solicitudes que ya utilizan un parámetro de consulta, el parámetro versionId se puede añadir al final.
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?tagging&versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
-H 'Authorization: bearer $TOKEN'
La copia del lado del servidor de versiones de objetos está soportada, pero utiliza una sintaxis ligeramente diferente. El parámetro de consulta no se añade a la propia URL, sino que se añade al x-amz-copy-source encabezado. Esta
es la misma sintaxis que crear una parte para una parte de varias partes a partir de un objeto de origen.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/<new-object-key>"
-H "Authorization: bearer $TOKEN"
-H "x-amz-copy-source: /<source-bucket>/<object-key>?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo"
Ejemplos de CLI
Puede utilizar la CLI de IBM Cloud con el plugin cos para habilitar el mantenimiento de versiones en un grupo.
cos bucket-versioning-put --bucket $BUCKET --versioning-configuration file://vers.json
En este caso, vers.json es un documento simple:
{
"Status": "Enabled"
}
Ejemplos de SDK
Los ejemplos siguientes utilizan los SDK de IBM COS para Python y Node.js, aunque la implementación del mantenimiento de versiones de objetos debe ser totalmente compatible con cualquier biblioteca o herramienta S3-compatible que permita el establecimiento de puntos finales personalizados. El uso de herramientas de terceros requiere credenciales HMAC para calcular las firmas de AWS V4. Para obtener más información sobre las credenciales HMAC, consulte la documentación.
Python
La habilitación del mantenimiento de versiones utilizando el SDK de IBM COS para Python se puede realizar utilizando la sintaxis de recurso de alto nivel o cliente de bajo nivel.
Utilización de un recurso:
#!/usr/bin/env python3
import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError
#Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')
BUCKET = "my-versioning-bucket" # The bucket that will enable versioning.
#Create resource client with configuration info pulled from environment variables.
cos = ibm_boto3.resource("s3",
ibm_api_key_id=API_KEY,
ibm_service_instance_id=SERVICE_INSTANCE,
config=Config(signature_version="oauth"),
endpoint_url=ENDPOINT
)
versioning = cos.BucketVersioning(BUCKET)
versioning.enable()
El mantenimiento de versiones para el grupo se puede suspender utilizando versioning.suspend()
Utilizando ese mismo recurso cos, todas las versiones de objetos podrían listarse utilizando lo siguiente:
versions = s3.Bucket(BUCKET).object_versions.filter(Prefix=key)
for version in versions:
obj = version.get()
print(obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'))
Utilización de un cliente:
#!/usr/bin/env python3
import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError
#Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')
BUCKET = "my-versioning-bucket" # The bucket that will enable versioning.
#Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
ibm_api_key_id=API_KEY,
ibm_service_instance_id=SERVICE_INSTANCE,
config=Config(signature_version="oauth"),
endpoint_url=ENDPOINT
)
response = cosClient.put_bucket_versioning(
Bucket=BUCKET,
VersioningConfiguration={
'Status': 'Enabled'
}
)
Listado de las versiones de un objeto utilizando el mismo cliente:
resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)
Borrar las versiones de un objeto utilizando el mismo cliente:
Las API de Python son muy flexibles y existen muchas formas distintas de realizar la misma tarea.
Node.js
Habilitación del mantenimiento de versiones utilizando IBM COS SDK for Node.js:
const IBM = require('ibm-cos-sdk');
var config = {
endpoint: '<endpoint>',
apiKeyId: '<api-key>',
serviceInstanceId: '<resource-instance-id>',
};
var cos = new IBM.S3(config);
var params = {
Bucket: 'my-versioning-bucket', /* required */
VersioningConfiguration: { /* required */
Status: 'Enabled'
},
};
s3.putBucketVersioning(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});