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.

Guida introduttiva a Object Lock

Per iniziare, ci sono alcuni prerequisiti:

  • Avrai bisogno del ruolo della piattaforma Writer o Manager su un bucket o di un ruolo personalizzato con le azioni appropriate (come cloud-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

  1. Passa alla tua istanza Object Storage desiderata e utilizza Create Bucket con Customize your bucket option
  2. Immettere i dettagli di configurazione del bucket richiesti per i requisiti del caso di utilizzo
  3. Passare alla sezione Versione oggetto e impostarla su Abilitato
  4. Ricercare Immutabilità, e in Blocco oggetto fare clic su Aggiungi
  5. Imposta blocco oggetto su Abilitato
  6. Facoltativamente, impostare un periodo di conservazione predefinito.
  7. Fare clic su Salva
  8. 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:

  1. Passa alla sezione Configurazione del tuo bucket
  2. Fare clic su Controllo versione oggetto
  3. Nella sezione Versione oggetto , fare clic su Modifica, impostare l'opzione di configurazione su Abilitato e Salva
  4. Passare alla sezione Blocco oggetto , fare clic su Aggiungi
  5. Impostare Blocco oggetto su Abilitato
  6. Facoltativamente, impostare un periodo di conservazione predefinito.
  7. Fai clic su " Salva "

Aggiunta di una conservazione fino alla data o di un blocco legale a un oggetto

  1. Passare al bucket con l'oggetto di destinazione
  2. Attiva / disattiva Visualizza versioni
  3. Vai ai dettagli della versione di destinazione
  4. 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.

Azioni IAM
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.create
  • cloud-object-storage.bucket-object-lock.read
  • cloud-object-storage.object-object-lock-legal-hold.create
  • cloud-object-storage.object-object-lock-legal-hold.read
  • cloud-object-storage.object-object-lock-retention.create
  • cloud-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 opzionale
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.

Intestazioni facoltative
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.

Intestazioni facoltative
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
}