Objektsperre

Die Objektsperre bewahrt elektronische Datensätze und verwaltet die Datenintegrität, indem sichergestellt wird, dass einzelne Objektversionen in einer WORM-(Write-Once-Read-Many), nicht löschbaren und nicht wiederbeschreibbaren Art und Weise gespeichert werden. Diese Richtlinie wird bis zu einem angegebenen Datum oder bis zum Entfernen von gesetzlichen Rückstellungen durchgesetzt.

Gründe für die Verwendung der Objektsperre

Mit Object Lock können Kunden Anforderungen an die Datenaufbewahrung und -aufbewahrung steuern, indem sie die Unveränderlichkeit von Daten für ihre Backup-, Disaster-Recovery-und Cyber-Ausfallsicherheit-Workloads durchsetzen.

Die Objektsperre stellt sicher, dass Daten von niemandem gelöscht werden können und es keine Möglichkeit gibt, die Aufbewahrung für ein Objekt auszusetzen. Lesen Sie die Dokumentation sorgfältig, bevor Sie Objekte mit einem Aufbewahrungszeitraum sperren.

Bei Verwendung von Object Lock liegt es in Ihrer Verantwortung sicherzustellen, dass alle Bestimmungen eingehalten werden, denen Sie (Ihr Unternehmen) unterliegen können, wenn es um die Aufbewahrung und Speicherung von Daten für die langfristige Aufbewahrung geht.

Wenn Sie Object Lock verwenden, sind Sie dafür verantwortlich, dass Ihr IBM Cloud Konto gemäß den Richtlinien von IBM Cloud so lange aufrechterhalten wird, wie die Daten einer Aufbewahrungsfrist unterworfen sind. Weitere Informationen hierzu finden Sie im Abschnitt zu den IBM Cloud Service-Bedingungen.

Terminologie

Es gibt zwei Möglichkeiten, die Objektsperre zum Schutz von Daten zu verwenden: Aufbewahrungszeiträume und gesetzliche Aufbewahrungsfristen.

  • Ein Aufbewahrungszeitraum definiert einen Zeitrahmen, in dem ein Objekt nicht geändert oder gelöscht werden kann.
  • Eine Beweislastungsrückstellung verhindert auch, dass ein Objekt geändert wird, bleibt aber nur an seiner Position, bis es explizit aufgehoben wird.

Es ist möglich, eine beliebige Kombination dieser Parameter zu nutzen-eine Objektversion kann eine, beide oder keine haben.

Aufbewahren bis (Aufbewahrungszeitraum)

Wenn Sie eine Objektversion für einen festen Zeitraum schützen müssen, müssen Sie ein Beibehalten bis Datum angeben, das den Zeitraum bestimmt, in dem sie nicht geändert werden kann. Die Objektversion kann nach Ablauf dieses Datums gelöscht werden (vorausgesetzt, es gibt keine gültigen Rückstellungen für die Objektversion). Bei Objekten im GOVERNANCE-Modus können autorisierte Benutzer mit der entsprechenden bypass-governance-retention Berechtigung die Objektversion vor dem Aufbewahrungsdatum löschen.

Der Aufbewahrungszeitraum für neue Objekte kann vom Standardwert übernommen werden, der für das Bucket festgelegt ist, oder er kann beim Schreiben des Objekts explizit definiert werden, indem ein Wert für Retain Until Dateangegeben wird.

Wenn Sie die Standardeinstellungen für Buckets verwenden, geben Sie kein Datum für 'Beibehalten bis' an. Stattdessen geben Sie eine Dauer in Tagen oder Jahren an, für die jede im Bucket platzierte Objektversion geschützt werden soll. Wenn Sie ein Objekt in das Bucket stellen, wird für die Objektversion ein Aufbewahrungsdatum berechnet, indem die angegebene Dauer zur Zeit des Objektschreibvorgangs addiert wird.

Wenn Ihre Anforderung, eine Objektversion in ein Bucket zu stellen, einen expliziten Aufbewahrungsmodus und die Einstellung 'Bis Datum beibehalten' enthält, überschreiben diese Einstellungen alle Bucketstandardeinstellungen für diese Objektversion.

Wie alle anderen Einstellungen für Objektsperren gilt auch die Einstellung 'Zurückbehalten bis' für einzelne Objektversionen. Unterschiedliche Versionen eines einzelnen Objekts können unterschiedliche Aufbewahrungsmodi und -zeiträume haben.

Stellen Sie sich ein Objekt vor, das 60 Tage in einem 90-Tage-Aufbewahrungszeitraum ist, und Sie überschreiben dieses Objekt mit demselben Namen und einem Aufbewahrungszeitraum von zwei Jahren. Die Operation wird erfolgreich ausgeführt und eine neue Version des Objekts mit einem zweijährigen Aufbewahrungszeitraum wird erstellt. In der Zwischenzeit kann die Originalversion nach 30 Tagen gelöscht werden.

Aufbewahrungszeitraum verlängern

Um den Aufbewahrungszeitraum eines Objekts zu verlängern, senden Sie einfach eine Anforderung zum Festlegen eines neuen, längeren Aufbewahrungszeitraums. Der alte Wert wird mit dem neuen überschrieben, vorausgesetzt, der Anforderer hat die Aktionen cloud-object-storage.object.put_object_lock_retention und cloud-object-storage.object.put_object_lock_retention_version.

Verkürzung der Aufbewahrungsfrist

Für Objekte, die im GOVERNANCE-Modus geschützt sind, können autorisierte Benutzer die Aufbewahrungsfrist auf einen früheren Zeitpunkt verkürzen, sofern sie den x-amz-bypass-governance-retention Header in die Anfrage aufnehmen und über die entsprechenden Berechtigungen (cloud-object-storage.object.bypass_governance_retention, cloud-object-storage.object.put_object_lock_retention und cloud-object-storage.object.put_object_lock_retention_version) verfügen.

Objekte im COMPLIANCE-Modus können vor Ablauf des Aufbewahrungsdatums nicht verkürzt oder entfernt werden.

Erste Schritte mit Object Lock

Für den Einstieg gibt es einige Voraussetzungen:

  • Sie benötigen die Plattformrolle Writer oder Manager für ein Bucket oder eine angepasste Rolle mit den entsprechenden zugewiesenen Aktionen (z. B. cloud-object-storage.bucket.put_object_lock_configuration).
  • Objektversionierung muss aktiviert sein
  • Sie müssen den Standardpreistarif verwenden. Weitere Informationen finden Sie unter Preisstruktur.
  • Sie müssen einen Bereich auswählen, in dem die Objektsperre unterstützt wird. Details hierzu finden Sie unter Integrierte Services.
  • Ein maximaler Standardaufbewahrungszeitraum von 100 Jahren (oder 36500 Tagen) wird unterstützt.
  • Bei Verwendung der Konsole ist es auch möglich, zusätzlich zu Tagen oder Jahren ein Datum für 'Beibehalten bis' in Monaten festzulegen.

Im COMPLIANCE-Modus kann die Aufbewahrungsfrist für ein Objekt nicht verkürzt werden. Im GOVERNANCE-Modus können autorisierte Benutzer mit der Berechtigung „ BypassGovernanceRetention “ die Aufbewahrungsfrist bei Bedarf verkürzen oder aufheben. Für Validierungstests wird empfohlen, eine kürzere Standardaufbewahrungsdauer (z. B. 1 Tag) zu verwenden und diese nach Bedarf anzupassen.

Neues Bucket für die Verwendung mit Objektsperre erstellen und einrichten

  1. Navigieren Sie zur gewünschten Object Storage-Instanz und verwenden Sie Bucket erstellen mit Bucketoption anpassen .
  2. Geben Sie die erforderlichen Bucketkonfigurationsdetails gemäß Ihren Anwendungsfallanforderungen ein.
  3. Navigieren Sie zum Abschnitt Objektversionierung (Object Versioning) und setzen Sie ihn auf Aktiviert.
  4. Suchen Sie nach Unveränderlichkeit und klicken Sie unter "Objektsperre" auf Hinzufügen.
  5. Objektsperre auf Aktiviert setzen
  6. Legen Sie optional einen Standardaufbewahrungszeitraum fest.
  7. Klicken Sie auf Speichern.
  8. Fahren Sie mit den übrigen Konfigurationseinstellungen fort und klicken Sie auf Bucket erstellen.

Aktivieren der Objektsperre für ein vorhandenes Bucket:

Ein Bucket kann für die Verwendung der Objektsperre wie folgt festgelegt werden:

  1. Navigieren Sie zum Abschnitt Konfiguration Ihres Buckets.
  2. Klicken Sie auf Objektversionierung.
  3. Klicken Sie im Abschnitt Objektversionierung (Object Versioning) auf Bearbeiten und setzen Sie die Konfigurationsoption auf Aktiviert und Speichern.
  4. Navigieren Sie zum Abschnitt Objektsperre und klicken Sie auf Hinzufügen.
  5. Setzen Sie Objektsperre auf Aktiviert.
  6. Legen Sie optional einen Standardaufbewahrungszeitraum fest.
  7. Klicken Sie auf Speichern

Hinzufügen eines Retain Until Date oder Legal Hold zu einem Objekt

  1. Zum Bucket mit dem Zielobjekt navigieren
  2. Versionen anzeigen ein-/ausschalten
  3. Zu den Details der Zielversion wechseln
  4. Fügen Sie einen Aufbewahrungszeitraum hinzu und/oder schalten Sie eine gesetzliche Rückstellung ein.

Verwendung der Objektsperre für Business-Continuity und Disaster-Recovery

Die Objektsperre kann verwendet werden, um die Kontinuität des Service im Falle einer Ransomware-Attacke bereitzustellen, da geschützte Daten nicht geändert oder gelöscht werden können.

Konsistenz und Datenintegrität

Während IBM Cloud Object Storage starke Konsistenz für alle Daten-IO-Operationen bietet, ist die Bucket-Konfiguration schließlich konsistent. Nach dem Aktivieren, Ändern oder Löschen eines Standardaufbewahrungszeitraums für ein Bucket kann es einen Moment dauern, bis die Konfiguration im System weitergegeben wird. Operationen für Objekte, wie z. B. das Hinzufügen einer Beweisaufnahme, sind sofort konsistent.

Nutzung und Abrechnung

Gesperrte Objekte (und ihre Versionen) tragen wie alle anderen Daten zur Nutzung bei und Sie sind für die Nutzungskosten verantwortlich, solange das Objekt mit einem Aufbewahrungszeitraum gesperrt bleibt.

Interaktionen

Die Objektsperre kann in Kombination mit mehreren Objektspeicherfunktionen gemäß Ihren Anwendungsfallanforderungen verwendet werden.

Versionssteuerung

Versionssteuerung aktivieren ist eine Voraussetzung für die Aktivierung der Objektsperre. Wenn ein Bucket mit dem Header x-amz-bucket-object-lock-enabled erstellt wird, wird die Versionssteuerung automatisch aktiviert.

Durch das Löschen eines versionsgesteuerten Objekts wird eine _Löschmarkierung_erstellt. Das Objekt scheint gelöscht zu sein, aber wenn das Objekt geschützt ist, kann die geschützte Version im COMPLIANCE-Modus nicht gelöscht werden. Löschmarkierungen selbst sind nicht geschützt. Bei Objekten, die im GOVERNANCE-Modus gesperrt sind, können autorisierte Benutzer mit der entsprechenden bypass-governance-retention Berechtigung das Objekt jedoch vor Ablauf der Aufbewahrungsfrist löschen, sofern keine gesetzliche Aufbewahrungspflicht für das Objekt besteht.

Replikation

Objektsperre kann nicht für den Quell-Eimer verwendet werden für die Replikation, nur auf dem Ziel. Den Objekten wird die Standardaufbewahrungsfrist zugewiesen.

Schlüsselmanagementsysteme

Geschützte Objekte werden mit dem Rootschlüssel des Buckets verschlüsselt. Wenn die Objektsperre für ein Bucket aktiviert ist, ist der Rootschlüssel, der von Key Protect oder Hyper Protect Crypto Services gehostet wird, vor dem Löschen geschützt, solange für ein zugehöriges Bucket die Objektsperre aktiviert ist. Dies verhindert das Schreddern geschützter Objekte durch Verschlüsselung.

Lebenszykluskonfigurationen

Es ist möglich, Lebenszyklusrichtlinien zu aktivieren, die gesperrte Objekte archivieren, aber natürlich nicht solche, die Objekte als verfallen definieren unter Aufbewahrungsdauer oder gesetzlicher Sperre (ungeschützte Objekte im Bucket können weiterhin als verfallen definiert werden).

Immutable Object Storage (IOS)

Die Objektsperre ist eine Alternative zu den Aufbewahrungsrichtlinien, die bei Verwendung von Immutable Object Storageverfügbar sind. Da die Objektsperre die Versionssteuerung erfordert und Immutable Object Storage nicht mit der Versionssteuerung kompatibel ist, ist es nicht möglich, beide WORM-Lösungen in demselben Bucket zu aktivieren. Es ist möglich, eine Mischung aus Buckets in einer Serviceinstanz zu verwenden, die jeweils entweder Immutable Object Storage oder Object Lock verwenden.

Objekttagging

Es gibt keine Einschränkungen beim Hinzufügen oder Ändern von Tags für ein geschütztes Objekt.

Andere Interaktionen

Es sollte keine nachteiligen Wechselwirkungen geben, wenn Object Lock mit anderen Funktionen von Object Storage verwendet wird, wie z. B. der Einstellung von CORS Richtlinien, der Einstellung von IP-Firewalls oder bedingungsbasierten Einschränkungen, Bucket-Quoten oder Code Engine.

IAM-Aktionen

Der Objektsperre sind neue IAM-Aktionen zugeordnet.

IAM-Aktionen
IAM-Aktion Rolle
cloud-object-storage.bucket.get_object_lock_configuration Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.bucket.put_object_lock_configuration Manager, Schreibberechtigter
cloud-object-storage.object.get_object_lock_retention Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.put_object_lock_retention Manager, Schreibberechtigter
cloud-object-storage.object.get_object_lock_retention_version Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.put_object_lock_retention_version Manager, Schreibberechtigter
cloud-object-storage.object.get_object_lock_legal_hold Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.put_object_lock_legal_hold Manager, Schreibberechtigter
cloud-object-storage.object.get_object_lock_legal_hold_version Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.put_object_lock_legal_hold_version Manager, Schreibberechtigter
cloud-object-storage.object.bypass_governance_retention Manager, Schreibberechtigter

Beachten Sie, dass Benutzer mit der Rolle 'Schreibberechtigter' in der Lage sind, Objekte über viele Jahre (möglicherweise tausend Jahre) nicht löschbar zu machen. Seien Sie vorsichtig und überlegen Sie, benutzerdefinierte Rollen zu erstellen, die es den meisten Benutzern nicht erlauben, ein Aufbewahrungsdatum festzulegen.

Activity Tracker-Ereignisse

Die Objektsperre generiert zusätzliche Ereignisse.

  • 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

Für cloud-object-storage.bucket-object-lock.create-Ereignisse enthalten die folgenden Felder zusätzliche Informationen:

Feld Beschreibung
requestData.object_lock_configuration.enabled Gibt an, dass die Objektsperre für das Bucket aktiviert ist.
requestData.object_lock_configuration.defaultRetention.mode Zeigt an, dass der COMPLIANCE Modus GOVERNANCE oder aktiv ist.
object_lock_configuration.defaultRetention.years Der Standardaufbewahrungszeitraum in Jahren
object_lock_configuration.defaultRetention.days Der Standardaufbewahrungszeitraum in Tagen

Nur object_lock_configuration.defaultRetention.years oder object_lock_configuration.defaultRetention.days sind vorhanden, aber nicht beide gleichzeitig.

Für Operationen für geschützte Objekte können die folgenden Felder vorhanden sein:

Feld Beschreibung
requestData.object_lock_protection.legal_hold Gibt an, dass eine Beweissperre für die Objektversion in Kraft ist.
requestData.object_lock_protection.retention.mode Zeigt COMPLIANCE an, dass GOVERNANCE der Modus auf der Objektversion aktiv ist.
requestData.object_lock_protection.retention.retain_until_date Gibt das Datum an, an dem die Objektversion gelöscht werden kann. Nach diesem Datum wird das Objekt nicht mehr auf der Basis eines Aufbewahrungszeitraums gelöscht.

REST-API-Beispiele

Die folgenden Beispiele werden zur Vereinfachung der Verwendung von cURL gezeigt. Umgebungsvariablen werden verwendet, um benutzerspezifische Elemente wie $BUCKET, $TOKEN und $REGION darzustellen. Beachten Sie, dass $REGION auch alle Netztypspezifikationen enthält. Das Senden einer Anforderung an ein Bucket in us-south über das private Netz erfordert, dass die Variable auf private.us-south gesetzt wird.

Objektsperre für Bucket aktivieren

Die Konfiguration der Objektsperre wird als XML im Hauptteil der Anforderung bereitgestellt. Neue Anforderungen überschreiben alle vorhandenen Replikationsregeln, die im Bucket vorhanden sind.

Eine Objektsperrkonfiguration muss eine Regel enthalten.

Optionale Überschrift
Überschrift Typ Beschreibung
Content-MD5 Zeichenfolge Der base64 verschlüsselte 128-Bit-Hash MD5 der Nutzdaten, der als Integritätsprüfung verwendet wird, um sicherzustellen, dass die Nutzdaten während der Übertragung nicht verändert wurden.
x-amz-checksum-crc32 Zeichenfolge Dieser Header ist die Base64 kodierte, 32-Bit CRC32 Prüfsumme des Objekts.
x-amz-checksum-crc32c Zeichenfolge Dieser Header ist die Base64 kodierte, 32-Bit CRC32C Prüfsumme des Objekts.
x-amz-checksum-crc64nvme Zeichenfolge Dieser Header ist die Base64 kodierte, 64-Bit CRC64NVME Prüfsumme des Objekts. Die Prüfsumme CRC64NVME ist immer eine vollständige Objektprüfsumme.
x-amz-checksum-sha1 Zeichenfolge Dieser Header ist der Base64 verschlüsselte 160-Bit-Digest des Objekts SHA1.
x-amz-checksum-sha256 Zeichenfolge Dieser Header ist der Base64 kodierte, 256-Bit SHA256 Digest des Objekts.
x-amz-sdk-checksum-algorithm Zeichenfolge Gibt den Algorithmus an, der bei Verwendung des SDK zur Erstellung der Prüfsumme für das Objekt verwendet wird.
x-amz-bypass-governance-retention Zeichenfolge Dieser Header ermöglicht es autorisierten Benutzern, die Aufbewahrungseinstellungen im GOVERNANCE-Modus zu überschreiben, um ein Objekt vor Ablauf seiner Aufbewahrungsfrist zu löschen oder zu ändern.

Ein Content-MD5-Header oder ein checksum-Header (einschließlich x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 oder x-amz-checksum-sha256) ist als Integritätsprüfung für die Nutzdaten erforderlich.

Der Hauptteil der Anforderung muss einen XML-Block mit dem folgenden Schema enthalten:

Element Typ Untergeordnete Elemente Vorfahre Einschränkung
ObjectLockConfiguration Container ObjectLockEnabled, Rule Keine Erforderlich Grenzwert 1.
ObjectLockEnabled Zeichenfolge Keine ObjectLockConfiguration Erforderlich Der einzige gültige Wert ist Enabled (Groß-/Kleinschreibung beachten).
Rule Container DefaultRetention ObjectLockConfiguration Grenzwert 1
DefaultRetention Container Days, Mode, Years Rule Grenzwert 1.
Days Integer Keine DefaultRetention Die Anzahl Tage, die Sie für den Standardaufbewahrungszeitraum angeben wollen Kann nicht mit Years kombiniert werden.
Mode Zeichenfolge Keine DefaultRetention COMPLIANCE oder GOVERNANCE (Groß-/Kleinschreibung beachten).
Years Integer Keine DefaultRetention Die Anzahl Jahre, die Sie für den Standardaufbewahrungszeitraum angeben wollen Kann nicht mit Days kombiniert werden.

In diesem Beispiel werden alle neuen Objekte für mindestens 30 Tage aufbewahrt.

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

Eine erfolgreiche Anforderung gibt eine 200-Antwort zurück.

Anzeigen der Objektsperrkonfiguration für einen Bucket

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

Dadurch wird ein XML-Antworthauptteil mit dem entsprechenden Schema zurückgegeben:

<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <ObjectLockEnabled>string</ObjectLockEnabled>
  <Rule>
      <DefaultRetention>
        <Days>30</Days>
        <Mode>COMPLIANCE</Mode>
      </DefaultRetention>
  </Rule>
</ObjectLockConfiguration>

Hinzufügen oder Erweitern eines Aufbewahrungszeitraums für ein Objekt

Die Konfiguration der Objektsperre wird als XML im Hauptteil der Anforderung bereitgestellt. Neue Anfragen überschreiben alle vorhandenen Replikationsregeln für das Objekt, vorausgesetzt, das RetainUntilDate liegt weiter in der Zukunft als der aktuelle Wert oder das Objekt ist im GOVERNANCE-Modus gesperrt und der Anfragende verfügt über die bypass-governance-retention Berechtigung.

Optionale Header
Überschrift Typ Beschreibung
Content-MD5 Zeichenfolge Der base64 verschlüsselte 128-Bit-Hash MD5 der Nutzdaten, der als Integritätsprüfung verwendet wird, um sicherzustellen, dass die Nutzdaten während der Übertragung nicht verändert wurden.
x-amz-checksum-crc32 Zeichenfolge Dieser Header ist die Base64 kodierte, 32-Bit CRC32 Prüfsumme des Objekts.
x-amz-checksum-crc32c Zeichenfolge Dieser Header ist die Base64 kodierte, 32-Bit CRC32C Prüfsumme des Objekts.
x-amz-checksum-crc64nvme Zeichenfolge Dieser Header ist die Base64 kodierte, 64-Bit CRC64NVME Prüfsumme des Objekts. Die Prüfsumme CRC64NVME ist immer eine vollständige Objektprüfsumme.
x-amz-checksum-sha1 Zeichenfolge Dieser Header ist der Base64 verschlüsselte 160-Bit-Digest des Objekts SHA1.
x-amz-checksum-sha256 Zeichenfolge Dieser Header ist der Base64 kodierte, 256-Bit SHA256 Digest des Objekts.
x-amz-sdk-checksum-algorithm Zeichenfolge Gibt den Algorithmus an, der bei Verwendung des SDK zur Erstellung der Prüfsumme für das Objekt verwendet wird.
x-amz-bypass-governance-retention Zeichenfolge Dieser Header ermöglicht es autorisierten Benutzern, die Aufbewahrungseinstellungen im GOVERNANCE-Modus zu überschreiben, um ein Objekt vor Ablauf seiner Aufbewahrungsfrist zu löschen oder zu ändern.

Ein Content-MD5-Header oder ein checksum-Header (einschließlich x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 oder x-amz-checksum-sha256) ist als Integritätsprüfung für die Nutzdaten erforderlich.

Optional können Sie die Version angeben, auf die die RetainUntilDate angewendet werden soll.

Optionale Abfrageparameter

Parameter Erforderlich? Typ Beschreibung
versionID Optionale Zeichenfolge Versions-ID.

Der Hauptteil der Anforderung muss einen XML-Block mit dem folgenden Schema enthalten:

Element Typ Untergeordnete Elemente Vorfahre Einschränkung
Retention Container Mode, RetainUntilDate Keine Erforderlich Grenzwert 1.
Mode Zeichenfolge Keine Retention **Erforderlich **COMPLIANCE oder GOVERNANCE (Groß-/Kleinschreibung beachten).
RetainUntilDate Zeichenfolge Keine Retention Erforderlich Das Datum, nach dem ein Objekt zum Löschen auswählbar ist, im Datums-/Zeitformat ISO8601.

In diesem Beispiel werden alle neuen Objekte mindestens bis zum 12. März 2023 aufbewahrt.

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

Eine erfolgreiche Anforderung gibt eine 200-Antwort zurück.

Wenn die RetainUntilDate-Werte nicht über einen vorhandenen Wert hinausgehen, schlägt die Operation mit 403 Access Denied fehl.

Dieses Beispiel verkürzt die Aufbewahrungsfrist für eine vorhandene Objektversion, die im GOVERNANCE-Modus geschützt ist. Der Antragsteller muss über die Berechtigung „Bypass-Governance-Aufbewahrung“ verfügen.

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

Eine erfolgreiche Anfrage gibt eine 200 OK-Antwort zurück. Wenn der Anforderer nicht über die bypass-governance-retention Berechtigung verfügt oder der Header weggelassen wird, schlägt der Vorgang mit einem 403 Access Denied fehl.

Beweissperre für ein Objekt hinzufügen oder entfernen

Die Konfiguration der Objektsperre wird als XML im Hauptteil der Anforderung bereitgestellt. Neue Anforderungen überschreiben alle vorhandenen Replikationsregeln, die für das Objekt vorhanden sind, vorausgesetzt, RetainUntilDate liegt weiter in der Zukunft als der aktuelle Wert.

Optionale Header
Überschrift Typ Beschreibung
Content-MD5 Zeichenfolge Der base64 verschlüsselte 128-Bit-Hash MD5 der Nutzdaten, der als Integritätsprüfung verwendet wird, um sicherzustellen, dass die Nutzdaten während der Übertragung nicht verändert wurden.
x-amz-checksum-crc32 Zeichenfolge Dieser Header ist die Base64 kodierte, 32-Bit CRC32 Prüfsumme des Objekts.
x-amz-checksum-crc32c Zeichenfolge Dieser Header ist die Base64 kodierte, 32-Bit CRC32C Prüfsumme des Objekts.
x-amz-checksum-crc64nvme Zeichenfolge Dieser Header ist die Base64 kodierte, 64-Bit CRC64NVME Prüfsumme des Objekts. Die Prüfsumme CRC64NVME ist immer eine vollständige Objektprüfsumme.
x-amz-checksum-sha1 Zeichenfolge Dieser Header ist der Base64 verschlüsselte 160-Bit-Digest des Objekts SHA1.
x-amz-checksum-sha256 Zeichenfolge Dieser Header ist der Base64 kodierte, 256-Bit SHA256 Digest des Objekts.
x-amz-sdk-checksum-algorithm Zeichenfolge Gibt den Algorithmus an, der bei Verwendung des SDK zur Erstellung der Prüfsumme für das Objekt verwendet wird.

Ein Content-MD5-Header oder ein checksum-Header (einschließlich x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 oder x-amz-checksum-sha256) ist als Integritätsprüfung für die Nutzdaten erforderlich.

Der Hauptteil der Anforderung muss einen XML-Block mit dem folgenden Schema enthalten:

Element Typ Untergeordnete Elemente Vorfahre Einschränkung
legal-hold Container Status Keine Grenzwert 1.
Status Zeichenfolge Keine legal-hold Unterstützte Werte sind ON oder OFF (Groß-/Kleinschreibung muss beachtet werden)

In diesem Beispiel werden alle neuen Objekte mindestens bis zum 12. März 2023 aufbewahrt.

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

Eine erfolgreiche Anforderung gibt eine 200-Antwort zurück.

SDK-Beispiele

Die folgenden Beispiele verwenden die COS SDKs „ IBM “ für Python, Node.js, Java und Go sowie ein Terraform-Skript, obwohl die Implementierung der Objektversionierung vollständig kompatibel mit jeder S3-compatible-Bibliothek oder jedem Tool sein sollte, das die Einstellung benutzerdefinierter Endpunkte ermöglicht. Die Verwendung von Tools von Drittanbietern erfordert HMAC-Anmeldedaten zur Berechnung von AWS V4 Signaturen.

Python

Die Aktivierung der Objektsperre mit dem IBM COS SDK für Python kann mit der Syntax low level client erfolgen.

Verwendung eines Clients:

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

Aktivieren der Versionssteuerung mit dem 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);
    }

}

Los

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
}