Blocco oggetti
Object Lock conserva i record elettronici e mantiene l'integrità dei dati assicurando che le singole versioni degli oggetti siano memorizzate in modo WORM (Write - Once - Read - Many), non cancellabile e non riscrivibile. Questa politica viene applicata fino a una data specificata o alla rimozione di eventuali conservazioni legali.
Perché utilizzare il blocco oggetto?
Object Lock aiuta i clienti a gestire i requisiti di conservazione e conservazione dei dati applicando l'immutabilità dei dati per i carichi di lavoro di backup, disaster recovery e cyber resiliency.
Il blocco dell'oggetto garantisce che i dati non possano essere eliminati da nessuno e che non sia possibile sospendere la conservazione su un oggetto. Leggere attentamente la documentazione prima di bloccare gli oggetti con un periodo di conservazione.
Quando si utilizza Object Lock, è responsabilità dell'utente garantire la conformità a tutte le normative a cui l'utente (la propria organizzazione) può essere soggetto quando si tratta di conservazione e archiviazione dei dati per la conservazione a lungo termine.
Quando si utilizza Object Lock, è responsabilità dell'utente garantire che il proprio account IBM Cloud sia mantenuto in regola con le politiche e le linee guida di IBM Cloud per tutto il periodo in cui i dati sono soggetti a un periodo di conservazione. Per ulteriori informazioni, vedi i termini del servizio di IBM Cloud.
Terminologia
Esistono due modi per utilizzare il blocco oggetto per proteggere i dati: periodi di conservazione e conservazioni legali.
- Un periodo di conservazione definisce un intervallo di tempo durante il quale un oggetto non può essere modificato o eliminato.
- Un blocco legale impedisce inoltre la modifica di un oggetto, ma rimane attivo solo fino a quando non viene esplicitamente sollevato.
È possibile utilizzare qualsiasi combinazione di questi parametri - una versione oggetto può averne uno, entrambi o nessuno.
Data di fine conservazione (periodo di conservazione)
Se è necessario proteggere la versione di un oggetto per un periodo di tempo fisso, è necessario specificare una Conserva fino alla data che determina il periodo in cui non può essere modificato. La versione dell'oggetto può essere
eliminata dopo che questa data è trascorsa (supponendo che non vi siano conservazioni legali sulla versione dell'oggetto). Per gli oggetti in modalità GOVERNANCE, gli utenti autorizzati con il bypass-governance-retention permesso
possono eliminare la versione dell'oggetto prima della data di conservazione.
Il periodo di conservazione per i nuovi oggetti può essere ereditato dal valore predefinito impostato sul bucket oppure può essere definito esplicitamente durante la scrittura dell'oggetto specificando Conservare fino alla data.
Quando utilizzi le impostazioni predefinite del bucket, non specifichi una data di fine conservazione. Invece, si specifica una durata, in giorni o anni, per cui ogni versione dell'oggetto collocata nel bucket deve essere protetta. Quando si posiziona un oggetto nel bucket, viene calcolata una conservazione fino alla data per la versione dell'oggetto aggiungendo la durata specificata all'ora di scrittura dell'oggetto.
Se la propria richiesta di inserire una versione dell'oggetto in un bucket contiene una modalità di conservazione esplicita e Conservazione fino alla data, tali impostazioni sovrascrivono le impostazioni predefinite del bucket per tale versione dell'oggetto.
Come tutte le altre impostazioni di blocco dell'oggetto, il campo Conserva fino alla data si applica alle singole versioni dell'oggetto. Diverse versioni di un singolo oggetto possono avere diverse modalità di conservazione e periodi.
Immagina un oggetto di 60 giorni in un periodo di conservazione di 90 giorni e sovrascrivi tale oggetto con lo stesso nome e un periodo di conservazione di due anni. L'operazione avrà esito positivo e verrà creata una nuova versione dell'oggetto con un periodo di conservazione di due anni. Nel frattempo, dopo altri 30 giorni la versione originale è idonea per l'eliminazione.
Estensione di un periodo di conservazione
Per estendere il periodo di conservazione di un oggetto, è sufficiente inviare una richiesta per impostare un nuovo periodo di conservazione più lungo. Il vecchio valore verrà sovrascritto con il nuovo, presumendo che il richiedente abbia
le azioni cloud-object-storage.object.put_object_lock_retention e cloud-object-storage.object.put_object_lock_retention_version.
Riduzione del periodo di conservazione
Per gli oggetti protetti in modalità GOVERNANCE, gli utenti autorizzati possono ridurre il periodo di conservazione a una data precedente, a condizione che includano x-amz-bypass-governance-retention l'intestazione nella richiesta
e dispongano delle autorizzazioni appropriate (cloud-object-storage.object.bypass_governance_retention, cloud-object-storage.object.put_object_lock_retention e cloud-object-storage.object.put_object_lock_retention_version).
Gli oggetti in modalità CONFORMITÀ non possono avere il periodo di conservazione ridotto o rimosso prima della scadenza della data di conservazione.
Conservazione legale
Un blocco legale è simile a un periodo di conservazione in quanto impedisce la sovrascrittura o l'eliminazione di una versione dell'oggetto. Tuttavia, le conservazioni legali sono più flessibili e non hanno una componente temporale
definita. Invece rimangono semplicemente in vigore fino a quando non vengono rimossi. Le conservazioni legali possono essere liberamente posizionate e rimosse da qualsiasi utente che abbia le azioni cloud-object-storage.object.put_object_lock_legal_hold e cloud-object-storage.object.put_object_lock_legal_hold_version.
Le conservazioni legali hanno il vantaggio aggiuntivo di agire come metodo per applicare la conservazione a tempo indeterminato su un oggetto.
Le conservazioni legali e i periodi di conservazione operano in modo indipendente. Le conservazioni legali non hanno alcun impatto sui periodi di conservazione e viceversa.
Immagina un oggetto con una conservazione legale e un periodo di conservazione. Quando il periodo di conservazione termina, la versione dell'oggetto rimane protetta fino a quando non viene rimosso il blocco legale. Se si rimuove un blocco legale mentre una versione oggetto è soggetta a un periodo di conservazione, questo rimane protetto fino al completamento del periodo di conservazione.
Gli oggetti bloccati e memorizzati con un periodo di conservazione non possono essere eliminati fino a quando non scade il periodo di conservazione e non viene rimossa qualsiasi conservazione legale associata. Tuttavia, per gli oggetti bloccati
in modalità GOVERNANCE, gli utenti autorizzati con il bypass-governance-retention permesso possono eliminare l'oggetto prima della scadenza del periodo di conservazione, a condizione che non sia attivo alcun blocco legale sull'oggetto.
Guida introduttiva a Object Lock
Per iniziare, ci sono alcuni prerequisiti:
- Avrai bisogno del ruolo della piattaforma
WriteroManagersu un bucket o di un ruolo personalizzato con le azioni appropriate (comecloud-object-storage.bucket.put_object_lock_configuration) assegnate. - La versione dell'oggetto deve essere abilitata
- Dovrai usare il piano dei prezzi standard, vedi prezzi per i dettagli.
- Sarà necessario selezionare una regione in cui è supportato il blocco oggetto, fare riferimento a Servizi integrati per i dettagli.
- È supportato un periodo di conservazione massimo predefinito di 100 anni (o 36500 giorni).
- Quando si utilizza la console, è anche possibile impostare un periodo di conservazione fino alla data in mesi, oltre a giorni o anni.
In modalità COMPLIANCE, il periodo di conservazione di un oggetto non può essere ridotto. In modalità GOVERNANCE, gli utenti autorizzati con il permesso BypassGovernanceRetention possono ridurre o rimuovere la conservazione, se necessario. Per i test di convalida, si consiglia di utilizzare una conservazione predefinita più breve (ad esempio, 1 giorno) e di regolarla secondo necessità.
Creazione e impostazione del tuo nuovo bucket da utilizzare con Object Lock
- Passa alla tua istanza Object Storage desiderata e utilizza Create Bucket con Customize your bucket option
- Immettere i dettagli di configurazione del bucket richiesti per i requisiti del caso di utilizzo
- Passare alla sezione Versione oggetto e impostarla su Abilitato
- Ricercare Immutabilità, e in Blocco oggetto fare clic su Aggiungi
- Imposta blocco oggetto su Abilitato
- Facoltativamente, impostare un periodo di conservazione predefinito.
- Fare clic su Salva
- Procedere con il resto delle impostazioni di configurazione e fare clic su Crea bucket
Abilitazione del blocco oggetto su un bucket esistente:
Un bucket può essere impostato per l'utilizzo del blocco oggetto come segue:
- Passa alla sezione Configurazione del tuo bucket
- Fare clic su Controllo versione oggetto
- Nella sezione Versione oggetto , fare clic su Modifica, impostare l'opzione di configurazione su Abilitato e Salva
- Passare alla sezione Blocco oggetto , fare clic su Aggiungi
- Impostare Blocco oggetto su Abilitato
- Facoltativamente, impostare un periodo di conservazione predefinito.
- Fai clic su " Salva "
Aggiunta di una conservazione fino alla data o di un blocco legale a un oggetto
- Passare al bucket con l'oggetto di destinazione
- Attiva / disattiva Visualizza versioni
- Vai ai dettagli della versione di destinazione
- Aggiungere un periodo di conservazione e / o attivare / disattivare un blocco legale.
Utilizzo di Object Lock per business continuity e disaster recovery
Object Lock può essere utilizzato per fornire continuità di servizio in caso di attacco ransomware, in quanto i dati protetti non possono essere modificati o distrutti.
Coerenza e integrità dei dati
Mentre IBM Cloud Object Storage offre una forte coerenza per tutte le operazioni di IO dei dati, la configurazione dei bucket è eventualmente coerente. Dopo aver abilitato, modificato o eliminato un periodo di conservazione predefinito su un bucket, la propagazione della configurazione nel sistema potrebbe richiedere alcuni minuti. Le operazioni sugli oggetti, come l'aggiunta di un blocco legale, sono immediatamente congruenti.
Utilizzo e contabilità
Gli oggetti bloccati (e le loro versioni) contribuiscono all'utilizzo come qualsiasi altro dato e sarai responsabile dei costi di utilizzo per tutto il periodo di tempo in cui l'oggetto rimane bloccato con un periodo di conservazione.
Interazioni
Object Lock può essere utilizzato in combinazione con diverse funzioni di archiviazione oggetti in base ai requisiti del tuo caso di utilizzo.
Gestione versioni
L' abilitazione del controllo delle versione è un prerequisito per l'abilitazione del blocco oggetto. Se un bucket viene creato utilizzando l'intestazione x-amz-bucket-object-lock-enabled,
il controllo delle versioni verrà abilitato automaticamente.
L'eliminazione di un oggetto con versione crea un indicatore di eliminazione. L'oggetto può sembrare cancellato, ma se è protetto è impossibile cancellare la versione protetta in modalità COMPLIANCE. Gli indicatori di eliminazione
non sono protetti. Tuttavia, per gli oggetti bloccati in modalità GOVERNANCE, gli utenti autorizzati con il bypass-governance-retention permesso possono eliminare l'oggetto prima della scadenza del periodo di conservazione,
a condizione che non sia attivo alcun blocco legale sull'oggetto.
Replica
Object Lock può essere utilizzato con la replica. Se Object Lock è abilitato sia nel bucket di origine che in quello di destinazione della replica, tutti gli stati di Object Lock relativi alle versioni degli oggetti di origine verranno replicati nel bucket di destinazione. Ciò include qualsiasi aggiornamento di Object Lock che comporti l'aggiramento dei controlli di governance. Per ulteriori informazioni, consultare la sezione " Replica degli oggetti ".
Sistemi di gestione delle chiavi
Gli oggetti protetti verranno codificati utilizzando la chiave root del bucket. Quando il blocco dell'oggetto è abilitato su un bucket, la chiave root ospitata da Key Protect o Hyper Protect Crypto Services è protetta dall'eliminazione finché un bucket associato ha il blocco dell'oggetto abilitato. Ciò impedisce la distruzione crittografica degli oggetti protetti.
Configurazioni del ciclo di vita
È possibile abilitare le politiche del ciclo di vita che archiviano gli oggetti bloccati, ma naturalmente non quelle che fanno scadere gli oggetti sotto conservazione o conservazione legale (gli oggetti non protetti nel bucket possono ancora essere scaduti).
Immutable Object Storage
Object Lock è un'alternativa alle politiche di conservazione disponibili quando si utilizza Object Storageimmodificabile. Poiché il blocco dell'oggetto richiede che sia abilitato il controllo delle versioni e l' Object Storage non è compatibile con il controllo delle versioni, è impossibile abilitare entrambe le soluzioni WORM sullo stesso bucket. È possibile avere una combinazione di bucket in un'istanza del servizio, ognuno dei quali utilizza Immutable Object Storage o Object Lock.
Tag oggetto
Non vi sono limitazioni per l'aggiunta o la modifica di tag su un oggetto protetto.
Altre interazioni
Non dovrebbero esserci interazioni negative quando si usa Object Lock con altre funzioni di Object Storage, come l'impostazione dei criteri di CORS, l'impostazione di firewall IP o restrizioni basate su condizioni, quote di bucket o Code Engine.
Azioni IAM
Sono presenti nuove azioni IAM associate al blocco oggetto.
| Azione IAM | Ruolo |
|---|---|
cloud-object-storage.bucket.get_object_lock_configuration |
Gestore, scrittore, lettore |
cloud-object-storage.bucket.put_object_lock_configuration |
Gestore, Scrittore |
cloud-object-storage.object.get_object_lock_retention |
Gestore, scrittore, lettore |
cloud-object-storage.object.put_object_lock_retention |
Gestore, Scrittore |
cloud-object-storage.object.get_object_lock_retention_version |
Gestore, scrittore, lettore |
cloud-object-storage.object.put_object_lock_retention_version |
Gestore, Scrittore |
cloud-object-storage.object.get_object_lock_legal_hold |
Gestore, scrittore, lettore |
cloud-object-storage.object.put_object_lock_legal_hold |
Gestore, Scrittore |
cloud-object-storage.object.get_object_lock_legal_hold_version |
Gestore, scrittore, lettore |
cloud-object-storage.object.put_object_lock_legal_hold_version |
Gestore, Scrittore |
cloud-object-storage.object.bypass_governance_retention |
Gestore, Scrittore |
Tenere presente che gli utenti con il ruolo Scrittore sono in grado di rendere gli oggetti non eliminabili per molti anni (forse migliaia di anni). Prestare attenzione e considerare la creazione di ruoli personalizzati che non consentono alla maggior parte degli utenti di impostare una data di conservazione.
Eventi Activity Tracker
Object Lock genera ulteriori eventi.
cloud-object-storage.bucket-object-lock.createcloud-object-storage.bucket-object-lock.readcloud-object-storage.object-object-lock-legal-hold.createcloud-object-storage.object-object-lock-legal-hold.readcloud-object-storage.object-object-lock-retention.createcloud-object-storage.object-object-lock-retention.read
Per gli eventi cloud-object-storage.bucket-object-lock.create, i seguenti campi forniscono ulteriori informazioni:
| Campo | Descrizione |
|---|---|
requestData.object_lock_configuration.enabled |
Indica che il blocco oggetto è abilitato nel bucket |
requestData.object_lock_configuration.defaultRetention.mode |
Indica che la modalità COMPLIANCE``GOVERNANCE o è attiva. |
object_lock_configuration.defaultRetention.years |
Il periodo di conservazione predefinito in anni. |
object_lock_configuration.defaultRetention.days |
Il periodo di conservazione predefinito in giorni. |
Saranno presenti solo object_lock_configuration.defaultRetention.years o object_lock_configuration.defaultRetention.days, ma non entrambi contemporaneamente.
Per le operazioni su oggetti protetti, è possibile che siano presenti i seguenti campi:
| Campo | Descrizione |
|---|---|
requestData.object_lock_protection.legal_hold |
Indica che un blocco legale è in vigore sulla versione dell'oggetto. |
requestData.object_lock_protection.retention.mode |
Indica COMPLIANCE che GOVERNANCE la modalità è attiva sulla versione dell'oggetto. |
requestData.object_lock_protection.retention.retain_until_date |
Indica la data in cui la versione dell'oggetto è idonea per l'eliminazione. Dopo questa data l'oggetto non viene più protetto da eliminazione in base alla data di conservazione. |
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 blocco oggetto su un bucket
La configurazione blocco oggetto viene fornita come XML nel corpo della richiesta. Le nuove richieste sovrascriveranno le regole di replica esistenti presenti nel bucket.
Una configurazione di blocco oggetto deve includere una regola.
| Intestazione | Immettere | Descrizione |
|---|---|---|
Content-MD5 |
Stringa | L' base64 a l'hash a 128 bit del payload, generato con l'algoritmo MD5, che viene utilizzato come controllo di integrità per garantire che il payload non sia stato alterato durante il trasferimento. |
x-amz-checksum-crc32 |
Stringa | Questa intestazione è il checksum Base64 codificato a 32 bit CRC32 dell'oggetto. |
x-amz-checksum-crc32c |
Stringa | Questa intestazione è il checksum Base64 codificato a 32 bit CRC32C dell'oggetto. |
x-amz-checksum-crc64nvme |
Stringa | Questa intestazione è il checksum Base64 codificato a 64 bit CRC64NVME dell'oggetto. Il checksum di CRC64NVME è sempre un checksum completo dell'oggetto. |
x-amz-checksum-sha1 |
Stringa | Questa intestazione è il digest Base64 codificato a 160 bit SHA1 dell'oggetto. |
x-amz-checksum-sha256 |
Stringa | Questa intestazione è il digest Base64 codificato a 256 bit SHA256 dell'oggetto. |
x-amz-sdk-checksum-algorithm |
Stringa | Indica l'algoritmo usato per creare il checksum dell'oggetto quando si usa l'SDK. |
x-amz-bypass-governance-retention |
Stringa | Questa intestazione consente agli utenti autorizzati di ignorare le impostazioni di conservazione in modalità GOVERNANCE per eliminare o modificare un oggetto prima della sua data di conservazione. |
Un'intestazione Content-MD5 o un'intestazione checksum (comprese x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1, o x-amz-checksum-sha256)
è richiesta come controllo di integrità per il payload.
Il corpo della richiesta deve contenere un blocco XML con il seguente schema:
| Elemento | Immettere | Elemento secondario | Predecessore | Vincolo |
|---|---|---|---|---|
ObjectLockConfiguration |
Container | ObjectLockEnabled, Rule |
Nessuno | Obbligatorio Limite 1. |
ObjectLockEnabled |
Stringa | Nessuno | ObjectLockConfiguration |
Obbligatorio L'unico valore valido è Enabled (sensibile al maiuscolo / minuscolo). |
Rule |
Container | DefaultRetention |
ObjectLockConfiguration |
Limite 1 |
DefaultRetention |
Container | Days, Mode, Years |
Rule |
Limite 1. |
Days |
Numero intero | Nessuno | DefaultRetention |
Il numero di giorni che si desidera specificare per il periodo di conservazione predefinito. Non può essere combinato con Years. |
Mode |
Stringa | Nessuno | DefaultRetention |
COMPLIANCE o GOVERNANCE (distinzione tra maiuscole e minuscole). |
Years |
Numero intero | Nessuno | DefaultRetention |
Il numero di anni che si desidera specificare per il periodo di conservazione predefinito. Non può essere combinato con Days. |
Questo esempio conserverà tutti i nuovi oggetti per almeno 30 giorni.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<ObjectLockEnabled>Enabled</ObjectLockEnabled>
<Rule>
<DefaultRetention>
<Days>30</Days>
<Mode>COMPLIANCE</Mode>
</DefaultRetention>
</Rule>
</ObjectLockConfiguration>'
Una richiesta riuscita restituisce una risposta 200.
Visualizza la configurazione del blocco degli oggetti per un bucket
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
-H 'Authorization: bearer $TOKEN'
Restituisce un corpo della risposta XML con lo schema appropriato:
<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<ObjectLockEnabled>string</ObjectLockEnabled>
<Rule>
<DefaultRetention>
<Days>30</Days>
<Mode>COMPLIANCE</Mode>
</DefaultRetention>
</Rule>
</ObjectLockConfiguration>
Aggiungere o estendere un periodo di conservazione per un oggetto
La configurazione blocco oggetto viene fornita come XML nel corpo della richiesta. Le nuove richieste sovrascriveranno tutte le regole di replica esistenti presenti sull'oggetto, a condizione che il RetainUntilDate sia più lontano
nel futuro rispetto al valore corrente, oppure se l'oggetto è bloccato in modalità GOVERNANCE e il richiedente dispone bypass-governance-retention dell'autorizzazione.
| Intestazione | Immettere | Descrizione |
|---|---|---|
Content-MD5 |
Stringa | L' base64 a l'hash a 128 bit del payload, generato con l'algoritmo MD5, che viene utilizzato come controllo di integrità per garantire che il payload non sia stato alterato durante il trasferimento. |
x-amz-checksum-crc32 |
Stringa | Questa intestazione è il checksum Base64 codificato a 32 bit CRC32 dell'oggetto. |
x-amz-checksum-crc32c |
Stringa | Questa intestazione è il checksum Base64 codificato a 32 bit CRC32C dell'oggetto. |
x-amz-checksum-crc64nvme |
Stringa | Questa intestazione è il checksum Base64 codificato a 64 bit CRC64NVME dell'oggetto. Il checksum di CRC64NVME è sempre un checksum completo dell'oggetto. |
x-amz-checksum-sha1 |
Stringa | Questa intestazione è il digest Base64 codificato a 160 bit SHA1 dell'oggetto. |
x-amz-checksum-sha256 |
Stringa | Questa intestazione è il digest Base64 codificato a 256 bit SHA256 dell'oggetto. |
x-amz-sdk-checksum-algorithm |
Stringa | Indica l'algoritmo usato per creare il checksum dell'oggetto quando si usa l'SDK. |
x-amz-bypass-governance-retention |
Stringa | Questa intestazione consente agli utenti autorizzati di ignorare le impostazioni di conservazione in modalità GOVERNANCE per eliminare o modificare un oggetto prima della sua data di conservazione. |
Un'intestazione Content-MD5 o un'intestazione checksum (comprese x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1, o x-amz-checksum-sha256)
è richiesta come controllo di integrità per il payload.
Facoltativamente, è possibile specificare la versione per cui applicare RetainUntilDate.
Parametri di query facoltativi
| Parametro | Obbligatorio? | Immettere | Descrizione |
|---|---|---|---|
versionID |
Facoltativo | stringa | ID versione. |
Il corpo della richiesta deve contenere un blocco XML con il seguente schema:
| Elemento | Immettere | Elemento secondario | Predecessore | Vincolo |
|---|---|---|---|---|
Retention |
Container | Mode, RetainUntilDate |
Nessuno | Obbligatorio Limite 1. |
Mode |
Stringa | Nessuno | Retention |
**Obbligatorio **COMPLIANCE o GOVERNANCE (distinzione tra maiuscole e minuscole). |
RetainUntilDate |
Stringa | Nessuno | Retention |
Obbligatorio La data dopo la quale un oggetto è idoneo per l'eliminazione in formato data/ora ISO8601. |
Questo esempio conserverà tutti i nuovi oggetti per almeno fino al 12 marzo 2023.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?retention" \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-MD5: fT0hYstki6zUvEh7abhcTA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<Retention>
<Mode>COMPLIANCE</Mode>
<RetainUntilDate>2023-03-12T23:01:00.000Z</RetainUntilDate>
</Retention>'
Una richiesta riuscita restituisce una risposta 200.
Se i valori RetainUntilDate non sono superiori ad alcun valore esistente, l'operazione avrà esito negativo con un 403 Access Denied.
Questo esempio riduce il periodo di conservazione di una versione esistente di un oggetto protetta in modalità GOVERNANCE. Il richiedente deve disporre dell'autorizzazione bypass-governance-retention.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT?retention" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-MD5: fT0hYstki6zUvEh7abhcTA==" \
-H "Content-Type: text/plain; charset=utf-8" \
-H "x-amz-bypass-governance-retention: true" \
-d $'<Retention>
<Mode>GOVERNANCE</Mode>
<RetainUntilDate>2023-02-10T23:01:00.000Z</RetainUntilDate>
</Retention>'
Una richiesta riuscita restituisce una risposta 200 OK. Se il richiedente non dispone bypass-governance-retention dell'autorizzazione o l'intestazione è omessa, l'operazione fallirà con un errore 403 Access Denied.
Aggiungere o rimuovere un blocco legale per un oggetto
La configurazione blocco oggetto viene fornita come XML nel corpo della richiesta. Le nuove richieste sovrascriveranno tutte le regole di replica esistenti presenti sull'oggetto, purché RetainUntilDate sia più lontano nel futuro
rispetto al valore corrente.
| Intestazione | Immettere | Descrizione |
|---|---|---|
Content-MD5 |
Stringa | L' base64 a l'hash a 128 bit del payload, generato con l'algoritmo MD5, che viene utilizzato come controllo di integrità per garantire che il payload non sia stato alterato durante il trasferimento. |
x-amz-checksum-crc32 |
Stringa | Questa intestazione è il checksum Base64 codificato a 32 bit CRC32 dell'oggetto. |
x-amz-checksum-crc32c |
Stringa | Questa intestazione è il checksum Base64 codificato a 32 bit CRC32C dell'oggetto. |
x-amz-checksum-crc64nvme |
Stringa | Questa intestazione è il checksum Base64 codificato a 64 bit CRC64NVME dell'oggetto. Il checksum di CRC64NVME è sempre un checksum completo dell'oggetto. |
x-amz-checksum-sha1 |
Stringa | Questa intestazione è il digest Base64 codificato a 160 bit SHA1 dell'oggetto. |
x-amz-checksum-sha256 |
Stringa | Questa intestazione è il digest Base64 codificato a 256 bit SHA256 dell'oggetto. |
x-amz-sdk-checksum-algorithm |
Stringa | Indica l'algoritmo usato per creare il checksum dell'oggetto quando si usa l'SDK. |
Un'intestazione Content-MD5 o un'intestazione checksum (comprese x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1, o x-amz-checksum-sha256)
è richiesta come controllo di integrità per il payload.
Il corpo della richiesta deve contenere un blocco XML con il seguente schema:
| Elemento | Immettere | Elemento secondario | Predecessore | Vincolo |
|---|---|---|---|---|
legal-hold |
Container | Status |
Nessuno | Limite 1. |
Status |
Stringa | Nessuno | legal-hold |
I valori supportati sono ON o OFF (sensibile al maiuscolo / minuscolo) |
Questo esempio conserverà tutti i nuovi oggetti per almeno fino al 12 marzo 2023.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?legal-hold&versionId=$VERSION_ID" \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-MD5: FMh6GxizXUBRaiDuB0vtgQ==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<legal-hold>
<Status>ON</Status>
</legal-hold>'
Una richiesta riuscita restituisce una risposta 200.
Esempi SDK
Gli esempi seguenti utilizzano gli SDK COS di IBM per Python, Node.js, Java e Go, oltre a uno script Terraform, sebbene l'implementazione del versioning degli oggetti dovrebbe 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 calcolare le firme AWS V4.
Python
L'abilitazione del blocco dell'oggetto utilizzando IBM COS SDK for Python può essere eseguita utilizzando la sintassi client di basso livello.
Utilizzo di un client:
import ibm_boto3
from ibm_botocore.client import Config
from ibm_botocore.exceptions import ClientError
from datetime import datetime, timedelta
import time
# Create new bucket with Object Lock enabled.
def create_bucket_with_objectlock(bucket_name):
cos_cli.create_bucket(
Bucket=bucket_name,
ObjectLockEnabledForBucket=True,
)
print("Bucket: {0} created with objectlock enabled".format(bucket_name))
def objectlock_configuration_on_bucket(bucket_name):
# Putting default retenion on the COS bucket.
default_retention_rule = {'DefaultRetention': {'Mode': 'COMPLIANCE', 'Years': 1}}
object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
# Reading the objectlock configuration set on the bucket.
response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
print("Objectlock Configuration for {0} =>".format(bucket_name))
print(response.ObjectLockConfiguration)
def objectlock_configuration_with_governance_mode_on_bucket(bucket_name):
# Putting default retenion on the COS bucket with governance mode.
default_retention_rule = {'DefaultRetention': {'Mode': 'GOVERNANCE', 'Years': 1}}
object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
# Reading the objectlock configuration set on the bucket.
response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
print("Objectlock Configuration for {0} =>".format(bucket_name))
print(response.ObjectLockConfiguration)
def upload_object(bucket_name,object_name,object_content):
cos_cli.put_object(
Bucket=bucket_name,
Key=object_name,
Body=object_content
)
print("Object: {0} uploaded!".format(object_name))
def upload_object_with_governance_mode(bucket_name,object_name,object_content):
cos_cli.put_object(
Bucket=bucket_name,
Key=object_name,
Body=object_content,
ObjectLockMode='GOVERNANCE',
ObjectLockRetainUntilDate=datetime(2025, 11, 15)
)
print("Object: {0} uploaded!".format(object_name))
def objectlock_retention(bucket_name,object_name):
# Put objectlock retenion on the object uploaded to the bucket.
date = datetime.now()+timedelta(seconds=5)
retention_rule = {'Mode': 'COMPLIANCE', 'RetainUntilDate': date}
cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)
# Get objectlock retention of the above object.
response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
print("Objectlock Retention for {0}=>".format(object_name))
print(response.Retention)
def objectlock_retention_with_governance_mode(bucket_name,object_name):
# Put objectlock retenion with governance mode on the object uploaded to the bucket.
date = datetime.now()+timedelta(seconds=5)
retention_rule = {'Mode': 'GOVERNANCE', 'RetainUntilDate': date}
cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)
# Get objectlock retention of the above object.
response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
print("Objectlock Retention for {0}=>".format(object_name))
print(response.Retention)
def objectlock_legal_hold(bucket_name,object_name):
# Setting the objectlock legal-hold status to ON.
cos_cli.put_object_legal_hold(Bucket=bucket_name, Key=object_name, legal_hold={'Status': 'ON'})
# Get objectlock retention of the above object.
response = cos_cli.get_object_legal_hold(Bucket=bucket_name, Key=object_name)
print("Objectlock legal-hold for {0}=>".format(object_name))
print(response.legal_hold)
def delete_object_with_bypass_governance(bucket_name,object_name):
# Deleting an object with retention using bypass governance
cos_cli.delete_object(Bucket=bucket_name, Key=object_name, BypassGovernanceRetention=True)
COS_ENDPOINT = "" #Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints -> Ex:https://s3.us-south.cloud-object-storage.appdomain.cloud
COS_API_KEY_ID = "" #API Key of the cos instance created Ex: W00YixxxxxxxxxxMB-odB-2ySfTrFBIQQWanc--P3byk
COS_RESOURCE_INSTANCE_CRN = "" #API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
# Create client connection
cos_cli = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT,
ibm_service_instance_id=COS_RESOURCE_INSTANCE_CRN,
ibm_auth_endpoint="https://iam.cloud.ibm.com/identity/token"
)
new_bucket_name = "create-example-python12345" # bucket name should be unique gloablly, or else it will throw an error.
new_text_file_name = "cos_object.txt"
new_text_file_contents = "This is a test file from Python code sample!!!"
# *** Main Program ***
def main():
create_bucket_with_objectlock(new_bucket_name) # Create a new cos bucket with object lock enabled.
objectlock_configuration_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
objectlock_configuration_with_governance_mode_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention)with governance mode on COS bucket and get the configuration.
upload_object(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket.
upload_object_with_governance_mode(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket with governance mode.
objectlock_retention(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
objectlock_retention_with_governance_mode(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
objectlock_legal_hold(new_bucket_name,new_text_file_name) # Put objectlock legal-hold on the object and get the legal-hold status.
delete_object_with_bypass_governance(new_bucket_name,new_text_file_name) # Deleting an object with retention with governance mode using bypass governance.
if __name__ == "__main__":
main()
Node.js
Abilitazione della versione utilizzando IBM COS SDK for Node.js:
'use strict';
// Required libraries
const ibm = require('ibm-cos-sdk');
const fs = require('fs');
const crypto = require('crypto');
function logError(e) {
console.log(`ERROR: ${e.code} - ${e.message}\n`);
}
function logDone() {
console.log('DONE!\n');
}
const COS_ENDPOINT = ""; //Choose endpoint from https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints. Ex: https://s3.us-south.cloud-object-storage.appdomain.cloud
const COS_API_KEY_ID = ""; // API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
const COS_AUTH_ENDPOINT = "";
const COS_RESOURCE_INSTANCE_CRN = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a <CREDENTIAL_ID_AS_GENERATED>:<SERVICE_ID_AS_GENERATED>::
// Client Creation.
var config = {
endpoint: COS_ENDPOINT,
apiKeyId: COS_API_KEY_ID,
ibmAuthEndpoint: COS_AUTH_ENDPOINT,
serviceInstanceId: COS_RESOURCE_INSTANCE_CRN,
signatureVersion: 'iam'
};
var cos = new ibm.S3(config);
// Create new bucket with objectlock enabled.
function createBucket(bucketName) {
console.log(`Creating new bucket: ${bucketName}`);
return cos.createBucket({
Bucket: bucketName,
ObjectLockEnabledForBucket: true,
CreateBucketConfiguration: {
LocationConstraint: ''
},
}).promise()
.then((() => {
console.log(`Bucket: ${bucketName} created!`);
}))
.catch((e) => {
console.error(`ERROR: ${e.code} - ${e.message}\n`);
});
}
// Create new text file and upload the object to COS bucket.
function createTextFile(bucketName, itemName, fileText) {
console.log(`Creating new item: ${itemName}`);
return cos.putObject({
Bucket: bucketName,
Key: itemName,
Body: fileText
}).promise()
.then(() => {
console.log(`Item: ${itemName} created!`);
logDone();
})
.catch(logError);
}
function uploadFileWithGovernanceMode(bucketName, itemName, fileText) {
var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
console.log(`Creating new item: ${itemName}`);
return cos.putObject({
Bucket: bucketName,
Key: itemName,
Body: fileText,
ObjectLockMode: "GOVERNANCE",
ObjectLockRetainUntilDate: inFiveSecond,
}).promise()
.then(() => {
console.log(`Item: ${itemName} created!`);
logDone();
})
.catch(logError);
}
function putObjectLockConfigurationOnBucket(bucketName) {
console.log(`Putting Objectlock Configuration on : ${bucketName}`);
// Putting objectlock configuration
var defaultRetention = {Mode: 'COMPLIANCE', Days: 1}
var objectLockRule = {DefaultRetention : defaultRetention}
var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
return cos.putObjectLockConfiguration({
Bucket: bucketName,
ObjectLockConfiguration: param
}).promise()
.then(() => {
console.log(`Object lock Configurtion added!!`);
logDone();
})
.catch(logError);
}
function putObjectLockConfigurationWithGovernanceModeOnBucket(bucketName) {
console.log(`Putting Objectlock Configuration on : ${bucketName}`);
// Putting objectlock configuration
var defaultRetention = {Mode: 'GOVERNANCE', Days: 1}
var objectLockRule = {DefaultRetention : defaultRetention}
var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
return cos.putObjectLockConfiguration({
Bucket: bucketName,
ObjectLockConfiguration: param
}).promise()
.then(() => {
console.log(`Object lock Configurtion with Governance mode added!!`);
logDone();
})
.catch(logError);
}
function getObjectLockConfigurationonBucket(bucketName) {
console.log(`Getting Objectlock Configuration for : ${bucketName}`);
// Getting objectlock configuration
return cos.getObjectLockConfiguration({
Bucket: bucketName,
}).promise()
.then((data) => {
console.log(`objectlock configuration`);
console.log( JSON.stringify(data.ObjectLockConfiguration, null, " ") );
logDone();
})
.catch(logError);
}
function putObjectLockRetention(bucketName,keyName) {
console.log(`Putting Objectlock Retention on : ${keyName}`);
var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
var rule = {Mode: 'COMPLIANCE', RetainUntilDate: inFiveSecond}
// Putting objectlock retention
return cos.putObjectRetention({
Bucket: bucketName,
Key: keyName,
Retention: rule
}).promise()
.then(() => {
console.log(`Object lock Retention added!!`);
logDone();
})
.catch(logError);
}
function putObjectLockRetentionWithGovernanceMode(bucketName,keyName) {
console.log(`Putting Objectlock Retention on : ${keyName}`);
var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
var rule = {Mode: 'GOVERNANCE', RetainUntilDate: inFiveSecond}
// Putting objectlock retention
return cos.putObjectRetention({
Bucket: bucketName,
Key: keyName,
Retention: rule
}).promise()
.then(() => {
console.log(`Object lock Retention with governance mode added!!`);
logDone();
})
.catch(logError);
}
function getObjectLockRetention(bucketName,keyName) {
console.log(`Getting Objectlock Retention for : ${keyName}`);
// Getting objectlock retention
return cos.getObjectRetention({
Bucket: bucketName,
Key: keyName
}).promise()
.then((data) => {
console.log(`Objectlock retention for : ${keyName} `);
console.log( JSON.stringify(data.Retention, null, " ") );
logDone();
})
.catch(logError);
}
function putObjectLocklegalHold(bucketName,keyName) {
console.log(`Putting Objectlock legal-hold status ON for : ${keyName}`);
// Putting objectlock legal-hold status
return cos.putObjectlegalHold({
Bucket: bucketName,
Key: keyName,
LegalHold: {Status: 'ON'}
}).promise()
.then(() => {
console.log(`Object lock legal-hold added!!`);
logDone();
})
.catch(logError);
}
function getObjectLocklegalHold(bucketName,keyName) {
console.log(`Getting Objectlock legal-hold for : ${keyName}`);
// Getting objectlock legal-hold
return cos.getObjectlegal-hold({
Bucket: bucketName,
Key: keyName
}).promise()
.then((data) => {
console.log(`Objectlock legal-hold for : ${keyName} `);
console.log( JSON.stringify(data.legal-hold, null, " ") );
logDone();
})
.catch(logError);
}
function createBucket(bucketName,objectName) {
console.log(`Deleting Object t: ${objectName}`);
return cos.deleteObject({
Bucket: bucketName,
Key: objectName,
BypassGovernanceRetention: true,
}).promise()
.then(() => {
console.log("Object deleted");
})
.catch(err => {
console.error("Error deleting object:", err);
});
}
// Main app
function main() {
try {
var newBucketName = "jscosbucket350";
var newTextFileName = "js_cos_bucket_file.txt";
var newTextFileContents = "This is a test file from Node.js code sample!!!";
createBucket(newBucketName) // Create a new cos bucket with object lock enabled.
.then(() => putObjectLockConfigurationOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) on COS bucket.
.then(() => putObjectLockConfigurationWithGovernanceModeOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
.then(() => getObjectLockConfigurationonBucket(newBucketName)) // Read objectlock configuration on COS bucket.
.then(() => createTextFile(newBucketName, newTextFileName, newTextFileContents)) // Upload an object with governance mode to cos bucket.
.then(() => uploadFileWithGovernanceMode(newBucketName, newTextFileName, newTextFileContents)) // Upload an object to cos bucket.
.then(() => putObjectLockRetention(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) on the object.
.then(() => putObjectLockRetentionWithGovernanceMode(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) with governance mode on the object.
.then(() => getObjectLockRetention(newBucketName, newTextFileName)) // Get the configured retention.
.then(() => putObjectLocklegalHold(newBucketName,newTextFileName)) // Put objectlock legal-hold on the object.
.then(() => getObjectLocklegalHold(newBucketName,newTextFileName))// Get the legal-hold status.
.then(() => deleteObjectWithGovernanceMode(newBucketName,newTextFileName)); // Deleting an object with retention using bypass governance
}
catch(ex) {
logError(ex);
}
}
main();
```### Java
{: #ol-sdks-java}
```java {: codeblock}
mport com.ibm.cloud.objectstorage.ClientConfiguration;
import com.ibm.cloud.objectstorage.SDKGlobalConfiguration;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder;
import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;
public class JavaExampleSDK {
private static AmazonS3 _cosClient;
private static String api_key;
private static String service_instance_id;
private static String endpoint_url;
private static String location;
private static String auth_endpoint;
public static void main(String[] args) throws IOException
{
// Constants for IBM COS values
auth_endpoint = ""; // auth endpoint
api_key = "";// example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
service_instance_id = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a/xx999cd94a0dda86fd8eff3191349999:9999b05b-x999-4917-xxxx-9d5b326a1111::
endpoint_url = ""; // example: https://s3.us-south.cloud-object-storage.appdomain.cloud
location = "";// example: us-south-standard
// Create client connection details
// _cosClient = createClient(api_key, service_instance_id, endpoint_url, location);
// String bucketName = "java.bucket" + UUID.randomUUID().toString().replace("-","");
// String itemName = UUID.randomUUID().toString().replace("-","") + "_java_file.txt";
// String fileText = "This is a test file from the Java code sample!!!";
// // create a new bucket
// createBucket(bucketName, _cosClient);
// // Put objectlock configuration(i.e. default retention) on COS bucket.
// putObjectLockConfiguration(bucketName , _cosClient);
// // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
// putObjectLockConfigurationWithGovernanceMode(bucketName , _cosClient);
// // create a new text file & upload
// createTextFileAndUpload(bucketName, itemName, fileText);
// // Upload an object with governance mode to cos bucket.
// uploadFileWithGovernanceMode(bucketName, itemName, fileText);
// // Put objectlock retention(i.e. retain until date) on the object.
// putObjectLockRetention(bucketName, itemName, _cosClient);
// // Put objectlock retention(i.e. retain until date) with governance mode on the object.
// putObjectLockRetentionWithGovernanceMode(bucketName, itemName, _cosClient);
// // remove the object with bypass governance
// deleteObjectWithBypassGovernance(bucketName);
}
// Create client connection
public static AmazonS3 createClient(String api_key, String service_instance_id, String endpoint_url, String location)
{
AWSCredentials credentials;
credentials = new BasicIBMOAuthCredentials(api_key, service_instance_id);
ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
clientConfig.setUseTcpKeepAlive(true);
AmazonS3 cosClient = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint_url, location)).withPathStyleAccessEnabled(true)
.withClientConfiguration(clientConfig).build();
return cosClient;
}
// Create a new bucket
public static void createBucket(String bucketName, AmazonS3 _cosClient)
{
_cosClient.createBucket(bucketName);
System.out.printf("Bucket: %s created!\n", bucketName);
}
// Put objectlock configuration(i.e. default retention) on COS bucket.
public static void putObjectLockConfiguration(String bucketName, AmazonS3 _cosClient)
{
DefaultRetention defRet = new DefaultRetention()
.withMode(ObjectLockRetentionMode.COMPLIANCE)
.withDays(1);
ObjectLockRule objRule = new ObjectLockRule()
.withDefaultRetention(defRet);
ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
.withObjectLockEnabled(ObjectLockEnabled.ENABLED)
.withRule(objRule);
SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
.withBucketName(BUCKET_NAME)
.withObjectLockConfiguration(objConfig);
_cosClient.setObjectLockConfiguration(objSet);
System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
ObjectLockRule objGetRule = objLckConfig.getRule();
System.out.printf("ObjectLock Configuration : %s\n", objGetRule);
}
// Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
public static void putObjectLockConfigurationWithGovernanceMode(String bucketName, AmazonS3 _cosClient)
{
DefaultRetention defRet = new DefaultRetention()
.withMode(ObjectLockRetentionMode.GOVERNANCE)
.withDays(1);
ObjectLockRule objRule = new ObjectLockRule()
.withDefaultRetention(defRet);
ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
.withObjectLockEnabled(ObjectLockEnabled.ENABLED)
.withRule(objRule);
SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
.withBucketName(BUCKET_NAME)
.withObjectLockConfiguration(objConfig);
_cosClient.setObjectLockConfiguration(objSet);
System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
ObjectLockRule objGetRule = objLckConfig.getRule();
System.out.printf("ObjectLock Configuration : %s\n", objGetRule);
}
// Create file and upload to new bucket
public static void createTextFileAndUpload(String bucketName, String itemName, String fileText) {
System.out.printf("Creating new item: %s\n", itemName);
InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileText.length());
PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata);
_cosClient.putObject(req);
System.out.printf("Item: %s created!\n", itemName);
}
// Upload an object with governance mode to cos bucket.
public static void uploadFileWithGovernanceMode(String bucketName, String itemName, String fileText) {
System.out.printf("Creating new item: %s\n", itemName);
LocalDate date = LocalDate.of(2025, 11, 11);
InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileText.length());
PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata)
.withObjectLockMode("GOVERNANCE")
.withObjectLockRetainUntilDate(date);
_cosClient.putObject(req);
System.out.printf("Item: %s created!\n", itemName);
}
// Put objectlock retention(i.e. retain until date) on the object.
public static void putObjectLockRetention(String bucketName,String itemName, AmazonS3 _cosClient)
{
LocalDate date = LocalDate.of(2025, 11, 11);
ObjectLockRetention objRet = new ObjectLockRetention()
.withMode("COMPLIANCE")
.withRetainUntilDate(date);
SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName)
.withRetention(objRet);
.withBypassGovernanceRetention(true);
_cosClient.setObjectRetention(objSet);
System.out.printf("Successfully added object retention on : %s\n", itemName);
GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName);
GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
ObjectLockRetention objRet1 = objRes1.getRetention();
System.out.printf("Retention : %s\n", objRet1);
}
// Put objectlock retention(i.e. retain until date) with governance mode on the object.
public static void putObjectLockRetentionWithGovernanceMode(String bucketName,String itemName, AmazonS3 _cosClient)
{
LocalDate date = LocalDate.of(2025, 11, 11);
ObjectLockRetention objRet = new ObjectLockRetention()
.withMode("GOVERNANCE")
.withRetainUntilDate(date);
SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName)
.withRetention(objRet);
.withBypassGovernanceRetention(true);
_cosClient.setObjectRetention(objSet);
System.out.printf("Successfully added object retention on : %s\n", itemName);
GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName);
GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
ObjectLockRetention objRet1 = objRes1.getRetention();
System.out.printf("Retention : %s\n", objRet1);
}
// Delete object
public static void deleteObjectWithBypassGovernance(String bucketName, String itemName) {
System.out.printf("Deleting item: %s\n", itemName);
DeleteObjectRequest deleteRequest = new DeleteObjectRequest(BUCKET_NAME, Key)
.withBypassGovernanceRetention(true);
_cosClient.deleteObject(deleteRequest);
System.out.printf("Item: %s deleted!\n", itemName);
}
}
Vai
package main
import (
"bytes"
"fmt"
"time"
"github.com/IBM/ibm-cos-sdk-go/aws"
"github.com/IBM/ibm-cos-sdk-go/aws/credentials/ibmiam"
"github.com/IBM/ibm-cos-sdk-go/aws/session"
"github.com/IBM/ibm-cos-sdk-go/service/s3"
)
const (
apiKey = "<apiKey>"
serviceInstanceID = "<serviceInstanceID>"
authEndpoint = "https://iam.cloud.ibm.com/identity/token"
serviceEndpoint = "https://<endpoint>.appdomain.cloud"
)
// Create new bucket with objectlock enabled.
func createBucket(bucketName string, client *s3.S3) {
createBucketInput := new(s3.CreateBucketInput)
createBucketInput.Bucket = aws.String(bucketName)
createBucketInput.ObjectLockEnabledForBucket = aws.Bool(true)
_, e := client.CreateBucket(createBucketInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Bucket Created !!! ")
}
}
func uploadObject(bucketName string, client *s3.S3, fileName string, fileContent string) {
putInput := &s3.PutObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(fileName),
Body: bytes.NewReader([]byte(fileContent)),
}
_, e := client.PutObject(putInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Uploaded!!! ")
}
}
func uploadObjectWithGovernanceMode(bucketName string, client *s3.S3, fileName string, fileContent string) {
retention_date := time.Now().Local().Add(time.Second * 5)
putInput := &s3.PutObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(fileName),
Body: bytes.NewReader([]byte(fileContent)),
ObjectLockMode: aws.String("GOVERNANCE"),
ObjectLockRetainUntilDate: aws.Time(retention_date),
}
_, e := client.PutObject(putInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Uploaded!!! ")
}
}
func objectLockConfiguration(bucketName string, client *s3.S3) {
// Putting default retenion on the COS bucket.
putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
Bucket: aws.String(bucketName),
ObjectLockConfiguration: &s3.ObjectLockConfiguration{
ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
Rule: &s3.ObjectLockRule{
DefaultRetention: &s3.DefaultRetention{
Mode: aws.String("COMPLIANCE"),
Days: aws.Int64(1),
},
},
},
}
_, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)
// Reading the objectlock configuration set on the bucket.
getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
}
}
func objectLockConfigurationwithGovernanceMode(bucketName string, client *s3.S3) {
// Putting default retenion on the COS bucket.
putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
Bucket: aws.String(bucketName),
ObjectLockConfiguration: &s3.ObjectLockConfiguration{
ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
Rule: &s3.ObjectLockRule{
DefaultRetention: &s3.DefaultRetention{
Mode: aws.String("GOVERNANCE"),
Days: aws.Int64(1),
},
},
},
}
_, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)
// Reading the objectlock configuration set on the bucket.
getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
}
}
func objectLockRetention(bucketName string, client *s3.S3, keyName string) {
// Put objectlock retenion on the object uploaded to the bucket.
retention_date := time.Now().Local().Add(time.Second * 5)
putObjectRetentionInput := &s3.PutObjectRetentionInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
Retention: &s3.ObjectLockRetention{
Mode: aws.String("COMPLIANCE"),
RetainUntilDate: aws.Time(retention_date),
},
}
_, e := client.PutObjectRetention(putObjectRetentionInput)
// Get objectlock retention of the above object.
getObjectRetentionInput := new(s3.GetObjectRetentionInput)
getObjectRetentionInput.Bucket = aws.String(bucketName)
getObjectRetentionInput.Key = aws.String(keyName)
response, e := client.GetObjectRetention(getObjectRetentionInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Retention =>", response.Retention)
}
}
func objectLockRetentionWithGovernanceMode(bucketName string, client *s3.S3, keyName string) {
// Put objectlock retenion on the object uploaded to the bucket.
retention_date := time.Now().Local().Add(time.Second * 5)
putObjectRetentionInput := &s3.PutObjectRetentionInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
Retention: &s3.ObjectLockRetention{
Mode: aws.String("GOVERNANCE"),
RetainUntilDate: aws.Time(retention_date),
},
}
_, e := client.PutObjectRetention(putObjectRetentionInput)
// Get objectlock retention of the above object.
getObjectRetentionInput := new(s3.GetObjectRetentionInput)
getObjectRetentionInput.Bucket = aws.String(bucketName)
getObjectRetentionInput.Key = aws.String(keyName)
response, e := client.GetObjectRetention(getObjectRetentionInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Retention =>", response.Retention)
}
}
func objectLocklegalHold(bucketName string, client *s3.S3, keyName string) {
// Setting the objectlock legal-hold status to ON.
putObjectlegalHoldInput := &s3.PutObjectlegalHoldInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
legalHold: &s3.ObjectLocklegalHold{
Status: aws.String("ON"),
},
}
_, e := client.PutObjectlegalHold(putObjectlegalHoldInput)
// Get objectlock retention of the above object.
getObjectlegalHoldInput := new(s3.GetObjectlegalHoldInput)
getObjectlegalHoldInput.Bucket = aws.String(bucketName)
getObjectlegalHoldInput.Key = aws.String(keyName)
response, e := client.GetObjectlegalHold(getObjectlegalHoldInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock legal-hold =>", response.legalHold)
}
}
func deleteObjectWithBypassGovernance(bucketName string, client *s3.S3, fileName string) {
deleteObjectInput := new(s3.DeleteObjectInput)
deleteObjectInput.Bucket = aws.String(bucketName)
deleteObjectInput.Key = aws.String("foo")
deleteObjectInput.BypassGovernanceRetention = aws.Bool(true)
_, e := client.DeleteObject(deleteObjectInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Deleted")
}
}
func main() {
bucketName := "gocosbucket353"
textFileName := "go_cos_bucket_file.txt"
textFileContents := "This is a test file from Node.js code sample!!!"
conf := aws.NewConfig().
WithEndpoint(serviceEndpoint).
WithCredentials(ibmiam.NewStaticCredentials(aws.NewConfig(),
authEndpoint, apiKey, serviceInstanceID)).
WithS3ForcePathStyle(true)
sess := session.Must(session.NewSession())
client := s3.New(sess, conf)
createBucket(bucketName, client) // Create a new cos bucket with object lock enabled.
objectLockConfiguration(bucketName, client) // Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
objectLockConfigurationwithGovernanceMode(bucketName, client) // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket and get the configuration.
uploadObject(bucketName, client, textFileName, textFileContents) // Upload an object to cos bucket.
uploadObjectWithGovernanceMode(bucketName, client, textFileName, textFileContents) // Upload an object with governance mode to cos bucket.
objectLockRetention(bucketName, client, textFileName) // Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
objectLockRetentionWithGovernanceMode(bucketName, client, textFileName) // Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
objectLocklegalHold(bucketName, client, textFileName) // Put objectlock legal-hold on the object and get the legal-hold status.
deleteObjectWithBypassGovernance(bucketName, client, textFileName) // Delete object using governace bypass header
}
Terraform
// Create COS instance.
resource "ibm_resource_instance" "cos_instance" {
name = "cos-instance"
resource_group_id = data.ibm_resource_group.cos_group.id
service = "cloud-object-storage"
plan = "standard"
location = "global"
}
// Create a new bucket with objectlock and object versioning enabled.
resource "ibm_cos_bucket" "bucket" {
bucket_name = var.bucket_name
resource_instance_id = ibm_resource_instance.cos_instance.id
region_location = var.regional_loc
storage_class = var.standard_storage_class
object_versioning {
enable = true
}
object_lock = true
}
// Set object lock configuration on the bucket by providing the crn of the new COS bucket.
resource ibm_cos_bucket_objectlock_configuration "objectlock" {
bucket_crn = ibm_cos_bucket.bucket.crn
bucket_location = var.regional_loc
object_lock_configuration{
objectlockenabled = "Enabled"
objectlockrule{
defaultretention{
mode = "COMPLIANCE"
days = 6
}
}
}
}
// Upload an object to the COS bucket with objectlock retention and objectlock legal-hold.
resource "ibm_cos_bucket_object" "object_object_lock" {
bucket_crn = ibm_cos_bucket.bucket.crn
bucket_location = ibm_cos_bucket.bucket.region_location
content = "Hello World 2"
key = "plaintext5.txt"
object_lock_mode = "COMPLIANCE"
object_lock_retain_until_date = "2023-02-15T18:00:00Z"
object_lock_legal_hold_status = "ON"
force_delete = true
}