Versionierungsobjekte

Bei der Versionssteuerung können mehrere Revisionen eines einzelnen Objekts in demselben Bucket vorhanden sein. Jede Version eines Objekts kann abgefragt, gelesen, aus einem archivierten Status wiederhergestellt oder gelöscht werden. Die Aktivierung der Versionssteuerung für ein Bucket kann den Datenverlust durch Benutzerfehler oder versehentliches Löschen mindern. Wenn ein Objekt überschrieben wird, wird eine neue Version erstellt und die vorherige Version des Objekts wird automatisch beibehalten. Daher können in einem für die Versionssteuerung aktivierten Bucket Objekte, die durch versehentliches Löschen oder Überschreiben gelöscht wurden, einfach wiederhergestellt werden, indem eine vorherige Version des Objekts wiederhergestellt wird. Wenn ein Objekt gelöscht wird, wird es durch eine Löschmarkierung ersetzt und die vorherige Version wird gespeichert (nichts wird dauerhaft gelöscht). Zum dauerhaften Löschen einzelner Versionen eines Objekts muss eine Löschanforderung eine _Versions-ID_angeben. Eine GET-Anforderung für ein Objekt ruft die zuletzt gespeicherte Version ab. Wenn die aktuelle Version eine Löschmarkierung ist, gibt IBM COS einen Fehler 404 Not Found zurück.

Nachdem ein Bucket die Versionssteuerung aktiviert hat, sind alle Objekte im Bucket versionsgesteuert. Alle neuen Objekte (die nach dem Aktivieren der Versionssteuerung für ein Bucket erstellt werden) erhalten eine permanent zugeordnete Versions-ID. Objekten, die vor der Aktivierung der Versionssteuerung (für das Bucket) erstellt wurden, wird eine Version von null zugeordnet. Wenn ein Objekt mit einer null-Versions-ID überschrieben oder gelöscht wird, wird ihm eine neue Versions-ID zugewiesen. Das Aussetzen der Versionssteuerung ändert keine vorhandenen Objekte, sondern ändert die Art und Weise, wie zukünftige Anforderungen von IBM COS verarbeitet werden. Nach der Aktivierung kann die Versionssteuerung nur ausgesetzt und nicht vollständig inaktiviert werden. Daher kann ein Bucket drei Status haben, die sich auf die Versionssteuerung beziehen: 1. Standard (nicht versionsgesteuert), 2 Aktiviert oder 3. Ausgesetzt.

Einführung in die Versionssteuerung

Erstellen Sie zunächst ein neues Bucket mit aktivierter Objektversionierung.

  1. Klicken Sie nach der Navigation zu Ihrer Objektspeicherinstanz auf Bucket erstellen.
  2. Wählen Sie eine Region und Ausfallsicherheit aus, suchen Sie dann nach Objektversionierung und schalten Sie den Selektor auf Aktiviert um.

Freigabe der Versionierung
Freigabe der Versionierung

Erstellen Sie anschließend ein versionsgesteuertes Objekt.

  1. Navigieren Sie zu Ihrem neuen Bucket und laden Sie eine Datei hoch, indem Sie sie in das Browserfenster ziehen.
  2. Nachdem das Objekt erfolgreich hochgeladen wurde, laden Sie ein weiteres Objekt mit demselben Namen hoch. Anstatt überschrieben zu werden, wird der Datei eine UUID zugeordnet und als nicht aktuelle Version des Objekts gespeichert.
  3. Wählen Sie Versionen anzeigen aus, um alternative Versionen von Objekten anzuzeigen und mit ihnen zu interagieren.

Versionen anzeigen
Versionen anzeigen

die Funktion "Versionen anzeigen" muss eingeschaltet werden, bevor einzelne Versionen oder Löschmarkierungen sichtbar und zum Löschen ausgewählt werden können.

Terminologie

Löschmarkierung: Ein 'unsichtbares' Objekt, das den Zugriff auf Versionen des gelöschten Objekts ermöglicht.

Versions-ID: Eine Unicode-kodierte, UTF-8-kodierte, URL-sichere, undurchsichtige Zeichenfolge, die eine eindeutige Version eines Objekts und zugehörige Metadaten angibt und dazu verwendet wird, Anfragen an diese bestimmte Version zu richten. Versions-IDs sind maximal 1.024 Byte lang.

'null': Eine spezielle Versions-ID, die Objekten zugeordnet wurde, die vorhanden waren, als die Versionssteuerung für ein Bucket aktiviert wurde.

Konsistenz und Datenintegrität

Während IBM COS eine starke Konsistenz für alle Daten-E/A-Operationen bietet, ist die Bucketkonfiguration letztendlich konsistent. Nach der erstmaligen Aktivierung der Versionssteuerung für ein Bucket kann es einige Augenblicke dauern, bis die Konfiguration über das System weitergegeben wird. Obwohl die Versionsverwaltung scheinbar aktiviert ist, wird empfohlen, nach der Aktivierung 5 Minuten zu warten, bevor Sie Anfragen stellen, die voraussichtlich Versionen erstellen oder Markierungen löschen.

IAM-Aktionen

Der Versionssteuerung sind neue IAM-Aktionen zugeordnet.

IAM-Aktionen im Zusammenhang mit der Versionierung
IAM-Aktion Rolle
cloud-object-storage.bucket.put_versioning Manager, Schreibberechtigter
cloud-object-storage.bucket.get_versioning Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.get_version Manager, Autor, Leser, Inhaltsleser, Objektleser
cloud-object-storage.object.head_version Manager, Autor, Leser, Inhaltsleser, Objektleser
cloud-object-storage.bucket.delete_version Manager, Schreibberechtigter
cloud-object-storage.object.get_versions Manager, Autor, Leser, Inhaltsleser, Objektleser
cloud-object-storage.object.copy_get_version Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.copy_part_get_version Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.restore_version Manager, Schreibberechtigter
cloud-object-storage.object.put_tagging_version Manager, Autor, Objekt-Autor
cloud-object-storage.object.get_tagging_version Manager, Schreibberechtigter, Leseberechtigter
cloud-object-storage.object.delete_tagging_version Manager, Schreibberechtigter

Activity Tracker-Ereignisse

Die Versionssteuerung generiert neue Ereignisse.

  • cloud-object-storage.bucket-versioning.create
  • cloud-object-storage.bucket-versioning.read
  • cloud-object-storage.bucket-versioning.list

Managementereignisse für versionsgesteuerte Buckets enthalten ein Feld requestData.versioning.state, das angibt, ob die Versionssteuerung für ein Bucket aktiviert oder ausgesetzt ist.

Die grundlegenden HEAD-, GET-, PUT-und DELETE-Aktionen, die Versionen von Objekten bearbeiten oder erstellen, enthalten ein Feld target.versionId. Das Feld target.versionId ist auch beim Abschluss eines mehrteiligen Uploads und beim Kopieren von Objekten oder Teilen vorhanden, wenn aufgrund dieser Aktionen eine neue Version erstellt wird.

Ein Feld responseData.deleteMarker.created ist vorhanden, wenn ein Objekt gelöscht und eine Löschmarkierung erstellt wird.

Nutzung und Abrechnung

Alle Versionen werden so gemessen, als wären sie gleiche Objekte. Dies bedeutet, dass, wenn ein Bucket ein einzelnes Objekt mit fünf Vorgängerversionen enthält, das Feld object_count, das von der Ressourcenkonfigurations-API zurückgegeben wird, 6 lautet, obwohl es so angezeigt wird, als gäbe es nur ein einziges Objekt im Bucket. Ebenso tragen kumulierte Versionen zur Gesamtnutzung bei und sind fakturierbar. Zusätzlich zum Feld object_count, das von der API Read Bucket Metadata zurückgegeben wird, enthält der API-Antworthauptteil mehrere neue Felder, die der Versionssteuerung zugeordnet sind:

  • noncurrent_object_count: Anzahl der nicht aktuellen Objektversionen im Bucket im Format int64.
  • noncurrent_bytes_used: Gesamtgröße aller nicht aktuellen Objektversionen im Bucket im Format int64.
  • delete_marker_count: Gesamtzahl der Löschmarkierungen im Bucket im Format int64.

Wie bereits erwähnt, kann die Versionssteuerung nur aktiviert oder ausgesetzt werden. Wenn aus irgendeinem Grund die Versionssteuerung vollständig inaktiviert werden soll, ist es erforderlich, den Inhalt des Buckets in ein neues Bucket zu migrieren, für das die Versionssteuerung nicht aktiviert ist.

Interaktionen

Die IBM COS-Implementierung der S3 APIs für die Versionierung ist identisch mit den AWS S3 APIs für die Versionierung, mit ein paar Unterschieden.

Versionsgesteuerte Objekte archivieren und als verfallen speichern

Lebenszykluskonfigurationen sind in einem für die Version aktivierten Bucket zulässig. Im Gegensatz zu Amazon S3unterliegen neue Versionen jedoch der Archivierungsregel auf dieselbe Weise wie reguläre Objekte. Objekte erhalten ein Übergangsdatum, wenn sie erstellt werden, und werden an ihrem individuellen Übergangsdatum archiviert, unabhängig davon, ob sie aktuelle oder nicht aktuelle Versionen sind. Das Überschreiben eines Objekts hat keine Auswirkungen auf das Übergangsdatum der vorherigen Version und der neuen (aktuellen) Version wird ein Übergangsdatum zugewiesen.

Es ist nicht möglich, NoncurrentVersionTransition-Regeln zu verwenden, um nur nicht aktuelle Versionen von Objekten in einer Lebenszykluskonfiguration zu archivieren.

Unveränderlich Object Storage (WORM)

Die IBM COS-Implementierung von Immutable Object Storage (d. h. Aufbewahrungsrichtlinien) ist in Buckets mit aktivierter Versionssteuerung nicht zulässig. Versuche, eine Aufbewahrungsrichtlinie zu erstellen, schlagen ebenso fehl wie Versuche, die Versionssteuerung für ein Bucket mit einer Aufbewahrungsrichtlinie zu aktivieren.

Unterstützte S3-APIs

Die folgende Gruppe von REST-APIs kann mit der Versionssteuerung interagieren:

  • GET Object
  • HEAD Object
  • DELETE Object
  • GET Object ACL
  • PUT Object ACL
  • Upload Part Copy
  • Restore Object
  • DELETE Objects
  • List Object Versions
  • PUT Bucket Versioning
  • GET Bucket Versioning
  • PUT Object
  • POST Object
  • Copy Object
  • Complete Multipart Upload
  • PUT Object Tagging
  • GET Object Tagging
  • DELETE Object Tagging
  • PUT Bucket Lifecycle
  • GET Bucket Lifecycle
  • DELETE Bucket Lifecycle

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.

Versionssteuerung für Bucket aktivieren

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: 8qj8HSeDu3APPMQZVG06WQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<VersioningConfiguration>
            <Status>Enabled</Status>
          </VersioningConfiguration>'

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

Versionssteuerung für ein Bucket aussetzen

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: hxXDWuCDWB72Be0LG4XniQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<VersioningConfiguration>
            <Status>Suspended</Status>
          </VersioningConfiguration>'

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

Versionen von Objekten in einem Bereich auflisten

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

Gibt einen XML-Antworthauptteil zurück:

<ListVersionsResult>
   <IsTruncated>boolean</IsTruncated>
   <KeyMarker>string</KeyMarker>
   <VersionIdMarker>string</VersionIdMarker>
   <NextKeyMarker>string</NextKeyMarker>
   <NextVersionIdMarker>string</NextVersionIdMarker>
   <Version>
      <ETag>string</ETag>
      <IsLatest>boolean</IsLatest>
      <Key>string</Key>
      <LastModified>timestamp</LastModified>
      <Owner>
         <DisplayName>string</DisplayName>
         <ID>string</ID>
      </Owner>
      <Size>integer</Size>
      <StorageClass>string</StorageClass>
      <VersionId>string</VersionId>
   </Version>
   ...
   <DeleteMarker>
      <IsLatest>boolean</IsLatest>
      <Key>string</Key>
      <LastModified>timestamp</LastModified>
      <Owner>
         <DisplayName>string</DisplayName>
         <ID>string</ID>
      </Owner>
      <VersionId>string</VersionId>
   </DeleteMarker>
   ...
   <Name>string</Name>
   <Prefix>string</Prefix>
   <Delimiter>string</Delimiter>
   <MaxKeys>integer</MaxKeys>
   <CommonPrefixes>
      <Prefix>string</Prefix>
   </CommonPrefixes>
   ...
   <EncodingType>string</EncodingType>
</ListVersionsResult>

delimiter: Ein Trennzeichen ist ein Zeichen, das Sie angeben, um Schlüssel zu gruppieren. Alle Schlüssel, die dieselbe Zeichenfolge zwischen dem Präfix und dem ersten Vorkommen des Begrenzers enthalten, werden unter einem einzelnen Ergebniselement in CommonPrefixes gruppiert. Diese Gruppen werden als ein Ergebnis für die Begrenzung der maximalen Anzahl von Schlüsseln gezählt. Diese Schlüssel werden nicht an anderer Stelle in der Antwort zurückgegeben.

encoding-type: Fordert COS zum URL-Codieren der Objektschlüssel in der Antwort an. Objektschlüssel können beliebige Unicode-Zeichen enthalten. Einige Zeichen, wie z. B. Zeichen mit einem ASCII-Wert von 0 bis 10, können jedoch vom XML 1.0-Parser nicht syntaktisch analysiert werden. Für Zeichen, die in XML 1.0nicht unterstützt werden, können Sie diesen Parameter hinzufügen, um anzufordern, dass COS die Schlüssel in der Antwort codiert. Gültiger Wert: url.

key-marker: Gibt den Schlüssel an, mit dem bei der Auflistung von Objekten in einem Bereich begonnen werden soll.

max-keys: Legt die maximale Anzahl der in der Antwort zurückgegebenen Schlüssel fest. Standardmäßig gibt die API bis zu 1.000 Schlüsselnamen zurück. Die Antwort enthält möglicherweise weniger Schlüssel, aber nie mehr.

prefix: Verwenden Sie diesen Parameter, um nur die Schlüssel auszuwählen, die mit dem angegebenen Präfix beginnen.

version-id-marker: Gibt die Objektversion an, bei der die Auflistung beginnen soll.

Versionen von Objekten in einem Bucket löschen

Ein regulärer Aufruf von ListObjects oder ListObjectsV2 gibt keine Versions-IDs zurück. Um die Versions-IDs zu erhalten, die für einen Löschvorgang benötigt werden, müssen Sie ListObjectVersions verwenden: eine GET-Anfrage mit dem Abfrageparameter ?versions. Dies gibt auch die Löschmarkierungen und ihre Versions-IDs zurück. Ohne diesen Schritt ist keiner der folgenden Löschvorgänge möglich.

curl Beispiel:

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

IBM Cloud CLI-Beispiel:

ibmcloud cos object-versions --bucket $BUCKET

Python-Beispiel:

pythonresponse = cosClient.list_object_versions(Bucket=BUCKET)
for version in response.get('Versions', []):
    print(version['Key'], version['VersionId'])
for marker in response.get('DeleteMarkers', []):
    print(marker['Key'], marker['VersionId'], '(delete marker)')

CLI- und SDK-Beispiele für das Löschen einer bestimmten Version.

IBM Cloud CLI-Beispiel:

ibmcloud cos object-delete --bucket $BUCKET --key $OBJECT_KEY --version-id $VERSION_ID

Python-Beispiel:

pythoncosClient.delete_object(
    Bucket=BUCKET,
    Key='my-object.txt',
    VersionId='L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo'
)
Node.js:
javascriptawait cos.deleteObject({
  Bucket: 'my-versioning-bucket',
  Key: 'my-object.txt',
  VersionId: 'L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo'
}).promise();

Beim Löschen aktueller Versionen über die Benutzeroberfläche müssen zuerst die nicht aktuellen Objekte gelöscht werden.

Entfernen einer Löschmarkierung

Das Entfernen einer Löschmarkierung entspricht dem Arbeitsablauf bei der Wiederherstellung eines versehentlich gelöschten Objekts: Sie erhalten die Versions-ID der Löschmarkierung von ListObjectVersions und löschen sie dann anhand dieser Versions-ID.

ID der ungültigen Version löschen

Vorversionen von Objekten erhalten eine Versions-ID von Null, und um diese Version zu löschen, übergeben Sie versionId=null in der Anfrage.

curl Beispiel:

curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT_KEY?versionId=null" \
  -H 'Authorization: bearer $TOKEN'

Python-Beispiel:

cosClient.delete_object(
    Bucket=BUCKET,
    Key='my-object.txt',
    VersionId='null'
)

Operationen für bestimmte Versionen von Objekten

Mehrere APIs verwenden einen neuen Abfrageparameter (?versionId=<VersionId>), der angibt, welche Version des Objekts Sie anfordern. Dieser Parameter wird auf dieselbe Weise zum Lesen, Löschen, Überprüfen von Metadaten und Tags und Wiederherstellen archivierter Objekte verwendet. Um beispielsweise eine Version eines Objekts foo mit der Versions-ID L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo zu lesen, könnte die Anforderung wie folgt aussehen:

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

Das Löschen dieses Objekts erfolgt auf dieselbe Weise.

curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

Für Anforderungen, die bereits einen Abfrageparameter verwenden, kann der Parameter versionId am Ende hinzugefügt werden.

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?tagging&versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

Das serverseitige Kopieren von Objektversionen wird unterstützt, verwendet jedoch eine geringfügig andere Syntax. Der Abfrageparameter wird nicht zur URL URL selbst hinzugefügt, sondern an den x-amz-copy-source Header angehängt. Dies ist dieselbe Syntax wie die Erstellung eines Teils für einen mehrteiligen Teil aus einem Quellenobjekt.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/<new-object-key>"
 -H "Authorization: bearer $TOKEN"
 -H "x-amz-copy-source: /<source-bucket>/<object-key>?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo"

CLI-Beispiele

Sie können die Befehlszeilenschnittstelle IBM Cloud mit dem cos-Plug-in verwenden, um die Versionssteuerung für ein Bucket zu aktivieren.

cos bucket-versioning-put --bucket $BUCKET --versioning-configuration file://vers.json

In diesem Fall ist vers.json ein einfaches Dokument:

{
    "Status": "Enabled"
}

SDK-Beispiele

In den folgenden Beispielen werden die IBM COS-SDKs für Python und Node.jsverwendet, obwohl die Implementierung der Objektversionierung mit jeder S3-compatible Bibliothek oder jedem Tool, die bzw. das die Einstellung angepasster Endpunkte ermöglicht, vollständig kompatibel sein sollte. Die Verwendung von Tools anderer Anbieter erfordert HMAC-Berechtigungsnachweise für die Berechnung von AWS V4-Signaturen. Weitere Informationen zu HMAC-Berechtigungsnachweisen finden Sie in der Dokumentation.

Python

Die Aktivierung der Versionssteuerung mit dem IBM COS SDK für Python kann entweder mit der Syntax der übergeordneten Ressource oder der Low-Level-Clientsyntax erfolgen.

Ressource verwenden:

#!/usr/bin/env python3

import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError

#Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')

BUCKET = "my-versioning-bucket" # The bucket that will enable versioning.

#Create resource client with configuration info pulled from environment variables.
cos = ibm_boto3.resource("s3",
                         ibm_api_key_id=API_KEY,
                         ibm_service_instance_id=SERVICE_INSTANCE,
                         config=Config(signature_version="oauth"),
                         endpoint_url=ENDPOINT
                         )

versioning = cos.BucketVersioning(BUCKET)

versioning.enable()

Die Versionssteuerung für das Bucket kann dann mit versioning.suspend() ausgesetzt werden.

Bei Verwendung derselben cos-Ressource können alle Versionen von Objekten wie folgt aufgelistet werden:

versions = s3.Bucket(BUCKET).object_versions.filter(Prefix=key)

for version in versions:
    obj = version.get()
    print(obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'))

Verwendung eines Clients:

#!/usr/bin/env python3

import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError

#Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')

BUCKET = "my-versioning-bucket" # The bucket that will enable versioning.

#Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
                         ibm_api_key_id=API_KEY,
                         ibm_service_instance_id=SERVICE_INSTANCE,
                         config=Config(signature_version="oauth"),
                         endpoint_url=ENDPOINT
                         )

response = cosClient.put_bucket_versioning(
    Bucket=BUCKET,
    VersioningConfiguration={
        'Status': 'Enabled'
    }
)

Auflisten der Versionen eines Objekts mit demselben Client:

resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)

Löschen Sie die Versionen eines Objekts, die denselben Mandanten verwenden:

Die APIs von Python sind sehr flexibel, und es gibt viele verschiedene Möglichkeiten, die gleiche Aufgabe zu erfüllen.

Node.js

Aktivieren der Versionssteuerung mit dem IBM COS SDK for Node.js:

const IBM = require('ibm-cos-sdk');

var config = {
    endpoint: '<endpoint>',
    apiKeyId: '<api-key>',
    serviceInstanceId: '<resource-instance-id>',
};

var cos = new IBM.S3(config);

var params = {
    Bucket: 'my-versioning-bucket', /* required */
    VersioningConfiguration: { /* required */
    Status: 'Enabled'
   },
};

s3.putBucketVersioning(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});