Gestione delle versioni degli oggetti in IBM Cloud® Object Storage
Attiva il controllo delle versioni per i bucket IBM Cloud® Object Storage per conservare le versioni degli oggetti, recuperare i dati in caso di cancellazione accidentale e ripristinare le versioni precedenti.
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 relativa a un oggetto recupera la versione memorizzata più di recente. Se la versione corrente è un indicatore di eliminazione,
IBM Cloud Object Storage restituisce un errore 404 Not Found.
Dopo che un bucket ha abilitato il controllo delle versioni, tutti gli oggetti nel bucket hanno una versione. A tutti i nuovi oggetti (creati dopo l'attivazione del controllo delle versioni su un bucket) viene assegnato un ID di versione 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 versioning non modifica gli oggetti esistenti, ma cambia il modo in cui IBM Cloud Object Storage gestirà le richieste future. 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.
- Dopo aver effettuato l'accesso alla propria istanza di object storage, fare clic su Crea bucket.
- Scegli una region e una resilienza, quindi cerca Object versioning e attiva il selettore su Enabled.
Quindi, creare un oggetto con versione.
- Naviga nel tuo nuovo bucket e carica un file trascinandolo nella finestra del browser.
- Dopo che l'oggetto è stato caricato correttamente, caricare un altro oggetto con lo stesso nome. Anziché essere sovrascritto, al file viene assegnato un UUID e viene salvato come versione non corrente dell'oggetto.
- Attiva / disattiva Visualizza versioni per visualizzare e interagire con versioni alternative di oggetti.
l'opzione "Visualizza versioni" deve essere attivata prima che le singole versioni o i marcatori di eliminazione siano visibili e selezionabili per l'eliminazione.
Terminologia
Elimina indicatore: un oggetto 'invisibile' che consente di accedere alle versioni dell'oggetto eliminato.
ID versione: stringa Unicode, codificata in UTF-8, sicura per URL, opaca, che indica una versione univoca di un oggetto e dei metadati associati e viene utilizzata per indirizzare le richieste a quella versione specifica. 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
Sebbene IBM Cloud Object Storage garantisca una forte coerenza per tutte le operazioni di I/O dei dati, la configurazione dei bucket è coerente a lungo termine. Dopo aver abilitato il controllo delle versioni per la prima volta su un bucket, la propagazione della configurazione nel sistema potrebbe richiedere alcuni minuti. Sebbene il controllo delle versioni possa sembrare abilitato, attendere 5 minuti dopo averlo abilitato prima di effettuare qualsiasi richiesta che comporti la creazione di versioni o l'eliminazione di marcatori.
Azioni IAM
Esistono nuove azioni IAM associate al controllo delle versioni.
| 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
La gestione delle versioni genera nuovi eventi.
cloud-object-storage.bucket-versioning.createcloud-object-storage.bucket-versioning.readcloud-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 DELETE di base HEAD, GET, PUT, e che agiscono su o creano versioni di oggetti includono 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 delle risorse è 6, anche se sembra che nel bucket sia presente un solo oggetto. 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 formatoint64.noncurrent_bytes_used: dimensione totale di tutte le versioni di oggetti non correnti nel bucket in formatoint64.delete_marker_count: numero totale di indicatori di eliminazione nel bucket in formatoint64.
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 di IBM Cloud Object Storage delle API S3 per il controllo delle versioni è identica a quella delle 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, mentre alla nuova versione (attuale) viene 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.
Object Storage, immutabile (WORM)
L'implementazione di Immutable Object Storage (ovvero le politiche di conservazione) IBM Cloud Object Storage non è consentita nei bucket con il versioning abilitato. I tentativi di creare una politica di conservazione falliscono, così come i tentativi di abilitare il controllo delle 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 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
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 che Object Storage effettui la codifica URL delle chiavi degli oggetti nella risposta. Le chiavi degli oggetti possono contenere qualsiasi carattere Unicode; tuttavia, il parser XML 1.0
non è in grado di analizzare alcuni caratteri, come quelli con un valore ASCII compreso tra 0 e 10. Per i caratteri non supportati in XML 1.0, è possibile aggiungere questo parametro per richiedere che Object Storage codifichi le chiavi
nella risposta. Valore valido url.
key-marker: Specifica la chiave da cui partire per elencare 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 parole chiave, 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.
Eliminare le versioni degli oggetti in un bucket
Una normale chiamata a ListObjects o ListObjectsV2 non restituisce gli ID di versione. Per ottenere gli ID di versione necessari per qualsiasi operazione di cancellazione, è necessario utilizzare ListObjectVersions:
una richiesta GET con il parametro di query ?versions. Restituisce anche i marcatori di cancellazione e i loro ID di versione. Senza questo passaggio, non è possibile eseguire nessuna delle operazioni di cancellazione descritte
di seguito.
esempio di curl:
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versions" \
-H 'Authorization: bearer $TOKEN'
Esempio di CLI di IBM Cloud:
ibmcloud cos object-versions --bucket $BUCKET
Esempio in 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)')
Esempi di CLI e SDK per l'eliminazione di una versione specifica.
Esempio di CLI di IBM Cloud:
ibmcloud cos object-delete --bucket $BUCKET --key $OBJECT_KEY --version-id $VERSION_ID
Esempio in 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();
L'eliminazione delle versioni correnti tramite l'interfaccia utente richiede prima l'eliminazione degli oggetti non correnti.
Rimozione di un marcatore di cancellazione
La rimozione di un marcatore di cancellazione è il flusso di lavoro di recupero quando un oggetto viene accidentalmente cancellato: si ottiene l'ID di versione del marcatore di cancellazione da ListObjectVersions, quindi si
cancella con quell'ID di versione.
Eliminare l'ID di versione nullo
Agli oggetti in fase di pre-versione viene assegnato un ID di versione pari a null; per eliminare tale versione, si deve passare versionId=null nella richiesta.
esempio di curl:
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT_KEY?versionId=null" \
-H 'Authorization: bearer $TOKEN'
Esempio in Python:
cosClient.delete_object(
Bucket=BUCKET,
Key='my-object.txt',
VersionId='null'
)
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, ma viene invece aggiunto x-amz-copy-source all'intestazione. 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
Gli esempi seguenti utilizzano gli SDK IBM Cloud Object Storage per Python e Node.js, sebbene l'implementazione del versioning degli oggetti debba essere pienamente compatibile con qualsiasi libreria o strumento S3-compatible che consenta l'impostazione di endpoint personalizzati. L'utilizzo di strumenti di terze parti richiede credenziali HMAC per il calcolo delle firme AWSV4. Per ulteriori informazioni relative alle credenziali HMAC, consultare la documentazione.
Python
È possibile abilitare il controllo delle versioni utilizzando l'SDK IBM Cloud Object Storage per Python, sia tramite la sintassi di alto livello delle risorse sia tramite quella di basso livello del client.
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)
Elimina le versioni di un oggetto che utilizzano lo stesso client:
Le API di Python sono molto flessibili e ci sono molti modi diversi per eseguire lo stesso compito.
Node.js
Abilitazione del controllo delle versioni utilizzando l'IBM Cloud Object Storage 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
});