IBM Cloud Docs
Controllo delle versioni degli oggetti

Controllo delle versioni degli oggetti

Il controllo delle versioni consente a più revisioni di un singolo oggetto di esistere nello stesso bucket. Ciascuna versione di un oggetto può essere interrogata, letta, ripristinata da uno stato archiviato o eliminata. L'abilitazione del controllo delle versioni su un bucket può ridurre la perdita di dati a causa di un errore dell'utente o di un'eliminazione involontaria. Quando un oggetto viene sovrascritto, viene creata una nuova versione e la versione precedente dell'oggetto viene automaticamente conservata. Pertanto, in un bucket abilitato al controllo delle versioni, gli oggetti che vengono eliminati in seguito a eliminazione o sovrascrittura accidentale possono essere facilmente recuperati ripristinando una versione precedente dell'oggetto. Se un oggetto viene eliminato, viene sostituito da un indicatore di eliminazione e la versione precedente viene salvata (nulla viene eliminato in modo permanente). Per eliminare definitivamente le singole versioni di un oggetto, una richiesta di eliminazione deve specificare un ID versione. Una richiesta GET per un oggetto richiamerà la versione memorizzata più recente. Se la versione corrente è un indicatore di eliminazione, IBM COS restituisce un errore 404 Not Found.

Dopo che un bucket ha abilitato il controllo delle versioni, tutti gli oggetti nel bucket hanno una versione. Tutti i nuovi oggetti (creati dopo l'attivazione della versione su un bucket) riceveranno un ID versione assegnato in modo permanente. Agli oggetti creati prima dell'abilitazione del controllo delle versioni (sul bucket) viene assegnata una versione di null. Quando un oggetto con un ID versione null viene sovrascritto o eliminato, gli viene assegnato un nuovo ID versione. La sospensione del controllo delle versioni non modifica alcun oggetto esistente, ma modificherà il modo in cui le richieste future vengono gestite da IBM COS. Una volta abilitata, la versione può essere solo sospesa e non completamente disabilitata. Pertanto, un bucket può avere tre stati correlati al controllo versioni: 1. Valore predefinito (senza versione), 2. Abilitato o 3. Sospeso.

Introduzione al controllo delle versioni

Per prima cosa, crea un nuovo bucket con la versione dell'oggetto abilitata.

  1. Dopo aver navigato nella tua istanza di archiviazione oggetti, fai clic su Crea bucket.
  2. Scegli una region e una resilienza, quindi cerca Object versioning e attiva il selettore su Enabled.

Abilitazione del versionamento
Abilitazione del versionamento

Quindi, creare un oggetto con versione.

  1. Naviga nel tuo nuovo bucket e carica un file trascinandolo nella finestra del browser.
  2. Dopo che l'oggetto è stato caricato correttamente, caricare un altro oggetto con lo stesso nome. Invece di essere sovrascritto, al file verrà assegnato un UUID e salvato come versione non corrente dell'oggetto.
  3. Attiva / disattiva Visualizza versioni per visualizzare e interagire con versioni alternative di oggetti.

Visualizza versioni
Visualizza versioni

Terminologia

Elimina indicatore: un oggetto 'invisibile' che consente di accedere alle versioni dell'oggetto eliminato.

ID versione: una stringa opaca, protetta da URL, codificata UTF-8 Unicode che indica una versione univoca di un oggetto e dei metadati associati e viene utilizzata per indirizzare le richieste a quella particolare versione. Gli ID versione hanno una lunghezza massima di 1.024 byte.

'null': un ID versione speciale assegnato agli oggetti che esistevano quando il controllo versioni era abilitato su un bucket.

Coerenza e integrità dei dati

Mentre IBM COS fornisce una forte congruenza per tutte le operazioni IO dei dati, la configurazione del bucket è eventualmente congruente. Dopo aver abilitato il controllo delle versioni per la prima volta su un bucket, la propagazione della configurazione nel sistema potrebbe richiedere alcuni minuti. Anche se il controllo delle versioni può sembrare abilitato, si consiglia di attendere 15 minuti dopo aver abilitato il controllo delle versioni per effettuare le richieste che si prevede di creare o eliminare i contrassegni.

Azioni IAM

Esistono nuove azioni IAM associate al controllo delle versioni.

Azioni IAM associate al versioning
Azione IAM Ruolo
cloud-object-storage.bucket.put_versioning Gestore, Scrittore
cloud-object-storage.bucket.get_versioning Gestore, scrittore, lettore
cloud-object-storage.object.get_version Manager, Scrittore, Lettore, Lettore di contenuti, Lettore di oggetti
cloud-object-storage.object.head_version Manager, Scrittore, Lettore, Lettore di contenuti, Lettore di oggetti
cloud-object-storage.bucket.delete_version Gestore, Scrittore
cloud-object-storage.object.get_versions Manager, Scrittore, Lettore, Lettore di contenuti, Lettore di oggetti
cloud-object-storage.object.copy_get_version Gestore, scrittore, lettore
cloud-object-storage.object.copy_part_get_version Gestore, scrittore, lettore
cloud-object-storage.object.restore_version Gestore, Scrittore
cloud-object-storage.object.put_tagging_version Gestore, Programma di scrittura, Programma di scrittura oggetti
cloud-object-storage.object.get_tagging_version Gestore, scrittore, lettore
cloud-object-storage.object.delete_tagging_version Gestore, Scrittore

Eventi Activity Tracker

Il controllo versioni genererà nuovi eventi.

  • cloud-object-storage.bucket-versioning.create
  • cloud-object-storage.bucket-versioning.read
  • cloud-object-storage.bucket-versioning.list

Gli eventi di gestione per i bucket con versione contengono un campo requestData.versioning.state, che indica se il controllo delle versioni è abilitato o sospeso su un bucket.

Le azioni di base HEAD, GET, PUT e DELETE che agiscono o creano versioni di oggetti includeranno un campo target.versionId. Il campo target.versionId è presente anche quando si completa un caricamento in più parti e quando si copiano oggetti o parti, se viene creata una nuova versione a causa di tali azioni.

Un campo responseData.deleteMarker.created è presente quando un oggetto viene eliminato e viene creato un indicatore di eliminazione.

Utilizzo e contabilità

Tutte le versioni vengono misurate come se fossero oggetti uguali. Ciò significa che se un bucket contiene un singolo oggetto con cinque versioni precedenti, il campo object_count restituito dall'API di configurazione della risorsa sarà 6, anche se apparirà come se ci fosse solo un singolo oggetto nel bucket. Allo stesso modo, le versioni accumulate contribuiscono all'utilizzo totale e sono fatturabili. Oltre al campo object_count restituito dall'API Read Bucket Metadata, il corpo della risposta API contiene diversi campi nuovi associati al controllo versioni:

  • noncurrent_object_count: numero di versioni di oggetti non correnti nel bucket in formato int64.
  • noncurrent_bytes_used: dimensione totale di tutte le versioni di oggetti non correnti nel bucket in formato int64.
  • delete_marker_count: numero totale di indicatori di eliminazione nel bucket in formato int64.

Come accennato, il controllo delle versioni può essere solo abilitato o sospeso. Se per qualsiasi motivo si desidera disabilitare completamente il controllo delle versioni, è necessario migrare il contenuto del bucket in un nuovo bucket che non ha il controllo delle versioni abilitato.

Interazioni

L'implementazione IBM COS delle API S3 per il controllo delle versioni è identica alle API AWS S3 per il controllo delle versioni, con alcune differenze.

Archiviazione e scadenza degli oggetti con versione

Le configurazioni del ciclo di vita sono consentite in un bucket abilitato alla versione. Tuttavia, a differenza di Amazon S3, le nuove versioni sono soggette alla regola di archivio allo stesso modo degli oggetti normali. Agli oggetti viene fornita una data di transizione quando vengono creati e vengono archiviati nella data di transizione individuale, indipendentemente dal fatto che siano versioni correnti o non correnti. La sovrascrittura di un oggetto non influisce sulla data di transizione della versione precedente e alla nuova versione (corrente) verrà assegnata una data di transizione.

Non è possibile utilizzare le regole NoncurrentVersionTransition per archiviare solo versioni non correnti di oggetti in una configurazione del ciclo di vita.

Immutabile 'Object Storage (WORM)

L'implementazione IBM COS di Object Storage (ossia, le politiche di conservazione) non è consentita nei bucket con il controllo delle versioni abilitato. I tentativi di creare una politica di conservazione avranno esito negativo, così come i tentativi di abilitare le versioni su un bucket con una politica di conservazione.

API S3 supportate

La seguente serie di API REST può interagire con il controllo delle versioni in qualche modo:

  • GET Object
  • HEAD Object
  • DELETE Object
  • GET Object ACL
  • PUT Object ACL
  • Upload Part Copy
  • Restore Object
  • DELETE Objects
  • List Object Versions
  • PUT Bucket Versioning
  • GET Bucket Versioning
  • PUT Object
  • POST Object
  • Copy Object
  • Complete Multipart Upload
  • PUT Object Tagging
  • GET Object Tagging
  • DELETE Object Tagging
  • PUT Bucket Lifecycle
  • GET Bucket Lifecycle
  • DELETE Bucket Lifecycle

Esempi di API REST

I seguenti esempi vengono mostrati utilizzando cURL per facilità d'uso. Le variabili di ambiente vengono utilizzate per rappresentare elementi specifici dell'utente come $BUCKET, $TOKEN e $REGION. Tieni presente che $REGION includerà anche tutte le specifiche del tipo di rete, quindi l'invio di una richiesta a un bucket in us-south utilizzando la rete privata richiederebbe l'impostazione della variabile su private.us-south.

Abilita il controllo delle versioni su un bucket

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 richiesta riuscita restituisce una risposta 200.

Sospendi controllo versioni su un bucket

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 richiesta riuscita restituisce una risposta 200.

Elencare le versioni degli oggetti in un bucket

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versions" \
     -H 'Authorization: bearer $TOKEN'

Viene restituito un corpo della risposta 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 delimitatore è un carattere specificato per raggruppare le chiavi. Tutte le chiavi che contengono la stessa stringa tra il prefisso e la prima ricorrenza del delimitatore sono raggruppate in un singolo elemento del risultato in CommonPrefixes. Questi gruppi vengono contati come un risultato rispetto alla limitazione del numero massimo di chiavi. Queste chiavi non vengono restituite altrove nella risposta.

encoding-type: richiede COS per codificare l'URL delle chiavi dell'oggetto nella risposta. Le chiavi oggetto possono contenere qualsiasi carattere Unicode; tuttavia, il programma di analisi XML 1.0 non può analizzare alcuni caratteri, come i caratteri con un valore ASCII compreso tra 0 e 10. Per i caratteri non supportati in XML 1.0, puoi aggiungere questo parametro per richiedere che COS codifica le chiavi nella risposta. Valore valido url.

key-marker: Specifica la chiave da cui iniziare quando si elencano gli oggetti in un bucket.

max-keys: imposta il numero massimo di chiavi restituite nella risposta. Per impostazione predefinita, l'API restituisce fino a 1.000 nomi chiave. La risposta potrebbe contenere meno chiavi, ma non ne conterrà mai di più.

prefix: utilizzare questo parametro per selezionare solo le chiavi che iniziano con il prefisso specificato.

version-id-marker: specifica la versione dell'oggetto da cui si desidera avviare l'elenco.

Operazioni su versioni specifiche di oggetti

Diverse API utilizzano un nuovo parametro di query (?versionId=<VersionId>) che indica quale versione dell'oggetto si sta richiedendo. Questo parametro viene utilizzato nello stesso modo per leggere, eliminare, controllare metadati e tag e ripristinare oggetti archiviati. Ad esempio, per leggere una versione di un oggetto foo con un ID versione L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo, la richiesta potrebbe essere simile alla seguente:

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

L'eliminazione dell'oggetto viene eseguita nello stesso modo.

curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

Per le richieste che utilizzano già un parametro di query, il parametro versionId può essere aggiunto alla fine.

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?tagging&versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

La copia lato server delle versioni degli oggetti è supportata, ma utilizza una sintassi leggermente differente. Il parametro di query non viene aggiunto all'URL stesso, ma viene aggiunto all'intestazione x-amz-copy-source. Questa è la stessa sintassi della creazione di una parte per una parte multipla da un oggetto di origine.

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"

Esempi CLI

Puoi utilizzare la CLI IBM Cloud con il plug-in cos per abilitare il controllo delle versioni su un bucket.

cos bucket-versioning-put --bucket $BUCKET --versioning-configuration file://vers.json

In questo caso, vers.json è un documento semplice:

{
    "Status": "Enabled"
}

Esempi SDK

I seguenti esempi utilizzano gli SDK COS IBM per Python e Node.js, anche se l'implementazione della versione dell'oggetto deve essere completamente compatibile con qualsiasi libreria o strumento S3-compatible che consente l'impostazione di endpoint personalizzati. L'uso di strumenti di terzi richiede le credenziali HMAC per calcolare le firme AWS V4. Per ulteriori informazioni relative alle credenziali HMAC, consultare la documentazione.

Python

L'abilitazione della versione utilizzando IBM COS SDK for Python può essere eseguita utilizzando la sintassi risorsa di alto livello o client di basso livello.

Utilizzo di una risorsa:

#!/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()

Il controllo delle versioni per il bucket può quindi essere sospeso utilizzando versioning.suspend()

Utilizzando la stessa risorsa cos, è possibile elencare tutte le versioni degli oggetti utilizzando:

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'))

Utilizzo di un client:

#!/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'
    }
)

Elenco delle versioni di un oggetto utilizzando lo stesso client:

resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)

Nota che le API Python sono molto flessibili e ci sono molti modi diversi per eseguire la stessa attività.

Node.js

Abilitazione della versione utilizzando 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
});