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.
- Dopo aver navigato nella tua istanza di archiviazione oggetti, fai 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. Invece di essere sovrascritto, al file verrà assegnato un UUID e salvato come versione non corrente dell'oggetto.
- Attiva / disattiva Visualizza versioni per visualizzare e interagire con versioni alternative di oggetti.
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.
| 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.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 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 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 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 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 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
});