IBM Cloud® Object Storage におけるオブジェクトのバージョン管理

IBM Cloud® Object Storage バケットのバージョン管理を有効にして、オブジェクトのバージョンを保持し、誤って削除した場合の復旧や、以前のバージョンの復元を行えるようにします。

バージョン管理により、1 つのオブジェクトの複数の改訂が同じバケット内に存在することが可能になります。 オブジェクトの各バージョンは、照会、読み取り、アーカイブ状態からの復元、または削除を行うことができます。 バケットのバージョン管理を有効にすると、ユーザー・エラーや不注意による削除によるデータ損失を軽減できます。 オブジェクトが上書きされると、新しいバージョンが作成され、オブジェクトの前のバージョンが自動的に保持されます。 したがって、バージョン管理が使用可能になっているバケットでは、偶発的な削除または上書きの結果として削除されたオブジェクトは、オブジェクトの前のバージョンを復元することによって容易にリカバリーできます。 オブジェクトが削除されると、そのオブジェクトは 削除マーカー に置き換えられ、前のバージョンが保存されます (完全に削除されるものはありません)。 オブジェクトの個々のバージョンを完全に削除するには、削除要求で _バージョン ID_を指定する必要があります。 オブジェクトの取得 GET リクエストでは、最も最近保存されたバージョンが取得されます。 現在のバージョンが削除マーカーである場合、 IBM Cloud Object Storage は 404 Not Found エラーを返します。

バケットがバージョン管理を有効にすると、バケット内のすべてのオブジェクトがバージョン管理されます。 すべての新しいオブジェクト(バケットでバージョン管理を有効化した後に作成されたもの)には、恒久的に割り当てられたバージョン ID が付与されます。 (バケットで) バージョン管理が有効になる前に作成されたオブジェクトには、 null のバージョンが割り当てられます。 null バージョン ID を持つオブジェクトが上書きまたは削除されると、新しいバージョン ID が割り当てられます。 バージョン管理を一時停止しても、既存のオブジェクトには影響しませんが、 IBM Cloud Object Storage による今後のリクエストの処理方法が変更されます。 一度有効にすると、バージョン管理の中断のみが可能になり、完全に無効にすることはできません。 したがって、バケットには、バージョン管理に関連する 3 つの状態 (1) があります。 デフォルト (バージョンなし)、2. 使用可能、または 3. 中断されました。

バージョン管理の概要

最初に、オブジェクトのバージョン管理を有効にして新規バケットを作成します。

  1. オブジェクトストレージのインスタンスに移動したら、 バケットの作成をクリックします。
  2. リージョンと回復力を選択し、 「オブジェクトのバージョン管理」 を探して、セレクターを 「有効」 に切り替えます。

バージョン管理を有効にする
バージョン管理を有効にする

次に、バージョン付きオブジェクトを作成します。

  1. 新規バケットをナビゲートし、ファイルをブラウザー・ウィンドウにドラッグしてアップロードします。
  2. オブジェクトが正常にアップロードされたら、同じ名前の別のオブジェクトをアップロードします。 ファイルは上書きされるのではなく、UUIDが割り当てられ、オブジェクトの非最新バージョンとして保存されます。
  3. オブジェクトの代替バージョンを表示して対話するには、 「バージョンの表示」 を切り替えます。

バージョン表示
バージョン表示

個々のバージョンや削除マーカーが表示され、削除のために選択可能になる前に、"バージョンを表示 "をオンに切り替える必要があります。

用語

マーカーの削除: 削除されたオブジェクトのバージョンへのアクセスを許可する「不可視」オブジェクト。

バージョンID: オブジェクトとその関連メタデータの一意のバージョンを示す、Unicodeでエンコードされ、 UTF-8 に準拠し、 URL-safeに適合した不透明な文字列。特定のバージョンへのリクエストをターゲットにするために使用される。 バージョン ID の最大長は 1,024 バイトです。

'null': バケットでバージョン管理が有効にされたときに存在していたオブジェクトに割り当てられる特殊なバージョン ID。

整合性とデータ保全性

IBM Cloud Object Storage はすべてのデータI/O操作に対して強力な一貫性を提供しますが、バケットの設定については最終的に一貫性が保たれます。 バケットで初めてバージョン管理を有効にした後、構成がシステム全体に伝搬されるまでにしばらく時間がかかる場合があります。 バージョン管理が有効になっているように見えても、バージョン管理を有効にした後は、バージョンの作成やマーカーの削除を伴うリクエストを実行する前に、5分間待ってください。

IAM アクション

バージョン管理に関連付けられた新しい IAM アクションがあります。

バージョニングに関連するIAMアクション
IAM アクション 役割
cloud-object-storage.bucket.put_versioning 管理者、ライター
cloud-object-storage.bucket.get_versioning 管理者、ライター、リーダー
cloud-object-storage.object.get_version マネージャー、ライター、リーダー、コンテンツ・リーダー、オブジェクト・リーダー
cloud-object-storage.object.head_version マネージャー、ライター、リーダー、コンテンツ・リーダー、オブジェクト・リーダー
cloud-object-storage.bucket.delete_version 管理者、ライター
cloud-object-storage.object.get_versions マネージャー、ライター、リーダー、コンテンツ・リーダー、オブジェクト・リーダー
cloud-object-storage.object.copy_get_version 管理者、ライター、リーダー
cloud-object-storage.object.copy_part_get_version 管理者、ライター、リーダー
cloud-object-storage.object.restore_version 管理者、ライター
cloud-object-storage.object.put_tagging_version マネージャー、ライター、オブジェクト・ライター
cloud-object-storage.object.get_tagging_version 管理者、ライター、リーダー
cloud-object-storage.object.delete_tagging_version 管理者、ライター

Activity Tracker イベント

バージョン管理により、新しいイベントが生成されます。

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

バージョン管理されたバケットの管理イベントには、バケットでバージョン管理が有効になっているか中断されているかを示す requestData.versioning.state フィールドが含まれます。

オブジェクトに対して操作を行ったり、そのバージョンを作成したりする基本的な HEAD、 GET、 PUT、 アクション DELETE には、 フィールド target.versionId が含まれます。 target.versionId フィールドは、マルチパート・アップロードの完了時、およびオブジェクトまたはパートのコピー時に、それらのアクションのために新規バージョンが作成された場合にも表示されます。

オブジェクトが削除され、削除マーカーが作成されると、 responseData.deleteMarker.created フィールドが表示されます。

使用量とアカウンティング

すべてのバージョンは、同等のオブジェクトであるかのように計測されます。 つまり、バケットに 1 つのオブジェクトと、そのオブジェクトの 5 つの以前のバージョンが含まれている場合、バケットには 1 つのオブジェクトしか存在しないように見えても 6、 Resource Configuration API によって返される versions フィールド object_count の値は 5 となります。 同様に、累積バージョンは合計使用量に寄与し、請求可能です。 Read Bucket Metadata API によって返される object_count フィールドに加えて、API 応答本文には、バージョン管理に関連する以下のいくつかの新規フィールドが含まれています。

  • noncurrent_object_count: バケット内の非現行オブジェクト・バージョンの数 ( int64 形式)。
  • noncurrent_bytes_used: バケット内のすべての非現行オブジェクト・バージョンの合計サイズ ( int64 形式)。
  • delete_marker_count: バケット内の削除マーカーの総数 ( int64 形式)。

前述のように、バージョン管理は使用可能または使用停止にしかできません。 何らかの理由でバージョン管理を完全に無効にする必要がある場合は、バージョン管理が有効になっていない新規バケットにバケットの内容をマイグレーションする必要があります。

インタラクション

IBM Cloud Object Storage における S3 APIのバージョン管理機能の実装は、 AWS S3 APIのバージョン管理機能とほぼ同一ですが、いくつかの違いがあります。

バージョン管理されたオブジェクトのアーカイブと有効期限切れ

ライフサイクル構成は、バージョンが有効なバケットで許可されます。 ただし、 Amazon S3とは異なり、新規バージョンは通常のオブジェクトと同じ方法でアーカイブ・ルールに従います。 オブジェクトには、作成時に遷移日が指定され、現行バージョンであるか非現行バージョンであるかに関係なく、個々の遷移日にアーカイブされます。 オブジェクトを上書きしても、以前のバージョンの移行日付けには影響せず、新しい(現在の)バージョンには移行日付けが割り当てられます。

NoncurrentVersionTransition ルールを使用して、ライフサイクル構成内のオブジェクトの非現行バージョン のみ をアーカイブすることはできません。

不変型 Object Storage (WORM)

IBM Cloud Object Storage における不変型 Object Storage (すなわち、保存ポリシー)の実装は、バージョン管理が有効になっているバケットでは使用できません。 保存ポリシーの作成は失敗します。また、保存ポリシーが設定されているバケットでバージョン管理を有効にしようとしても、同様に失敗します。

サポートされる S3 API

以下の REST API のセットは、何らかの方法でバージョン管理と対話できます。

  • 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 の例

以下の例では、使いやすさのために cURL を使用しています。 環境変数は、 $BUCKET、 $TOKEN、および $REGION などのユーザー固有のエレメントを表すために使用されます。 $REGION にはネットワーク・タイプの指定も含まれるため、プライベート・ネットワークを使用して us-south のバケットに要求を送信するには、この変数を private.us-south に設定する必要があることに注意してください。

バケットのバージョン管理を有効にする

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

要求が成功すると、 200 応答が返されます。

バケットのバージョン管理の中断

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

要求が成功すると、 200 応答が返されます。

バケット内のオブジェクトのバージョンを一覧表示する

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

これにより、XML 応答本体が返されます。

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

delimiter: 区切り文字とは、キーをグループ化するために指定する文字のことです。 接頭部と区切り文字の最初のオカレンスの間に同じストリングを含むすべてのキーは、 CommonPrefixes の単一の結果エレメントの下にグループ化されます。 これらのグループは、最大キー制限に対する 1 つの結果としてカウントされます。 これらのキーは、応答内の他の場所には返されません。

encoding-type: レスポンス内のオブジェクトキーをURLエンコードするよう、 Object Storage に要求します。 オブジェクトキーには任意のUnicode文字を含めることができますが、XML 1.0 パーサーでは、ASCII値が0から10までの文字など、一部の文字を解析できません。 XML 1.0 でサポートされていない文字については、このパラメータを追加することで、 Object Storage を使用してレスポンス内のキーをエンコードするよう要求できます。 有効な値: url。

key-marker: バケット内のオブジェクトを一覧表示する際に、最初から指定するキーを指定します。

max-keys: 応答で返されるキーの最大数を設定します。 デフォルトでは、API は最大 1,000 個のキー名を返します。 応答に含まれるキーの数は少なくなる場合がありますが、多くなることは決してありません。

prefix: このパラメーターは、指定された接頭部で始まるキーのみを選択する場合に使用します。

version-id-marker: リストを開始したいオブジェクト・バージョンを指定します。

バケツ内のオブジェクトのバージョンを削除する

通常の ListObjects または ListObjectsV2 の呼び出しは、バージョンIDを返さない。 削除操作に必要なバージョンIDを取得するには、 ListObjectVersions: ?versions クエリーパラメーターを指定したGETリクエストを使用する必要があります。 これは削除マーカーとそのバージョンIDも返す。 このステップを踏まないと、以下の削除操作はどれもできない。

curlの例:

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

IBM Cloud CLI の例:

ibmcloud cos object-versions --bucket $BUCKET

Python の例:

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とSDKの例。

IBM Cloud CLI の例:

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

Python の例:

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();

UIを使用して現在のバージョンを削除するには、まず非現行オブジェクトを削除する必要があります。

削除マーカーの削除

削除マーカーを削除するのは、オブジェクトが誤って削除された場合の回復ワークフローです。 ListObjectVersions から削除マーカーのバージョン ID を取得し、そのバージョン ID で削除します。

NULLバージョンIDの削除

バージョンアップ前のオブジェクトにはNULLのバージョンIDが割り当てられ、そのバージョンを削除するには、リクエストに versionId=null。

curlの例:

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

Python の例:

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

特定のバージョンのオブジェクトに対する操作

いくつかの API は、要求しているオブジェクトのバージョンを示す新しい照会パラメーター (?versionId=<VersionId>) を使用します。 このパラメーターは、メタデータとタグの読み取り、削除、検査、およびアーカイブ・オブジェクトの復元に同じ方法で使用されます。 例えば、 L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo というバージョン ID を持つオブジェクト foo のバージョンを読み取る場合、要求は以下のようになります。

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

そのオブジェクトの削除も同じ方法で行われます。

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

照会パラメーターを既に使用している要求の場合は、 versionId パラメーターを末尾に追加できます。

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

オブジェクト・バージョンのサーバー・サイド・コピーはサポートされていますが、使用する構文は少し異なります。 クエリパラメータは URL 自体には追加されず、代わりに x-amz-copy-source ヘッダーに追加されます。 これは、ソース・オブジェクトから複数パーツ・パーツのパーツを作成するのと同じ構文です。

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 の例

IBM Cloud CLI を cos プラグインとともに使用して、バケットのバージョン管理を有効にすることができます。

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

この場合、 vers.json は単純な文書です。

{
    "Status": "Enabled"
}

SDK の例

以下の例では、 IBM Cloud Object Storage の Python および Node.js 用SDKを使用していますが、オブジェクトのバージョン管理の実装は、カスタムエンドポイントの設定が可能な S3-compatible ライブラリやツールであれば、どれでも完全に互換性があるはずです。 サードパーティ製ツールを使用するには、 AWS V4 署名を計算するためのHMAC認証情報が必要です。 HMAC 資格情報について詳しくは、 資料を参照してください。

Python

Python 用 IBM Cloud Object Storage SDKを使用したバージョン管理の有効化は、 高レベルのリソース 構文または 低レベルのクライアント 構文のいずれかを使用して行うことができます。

リソースの使用:

#!/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()

その後、 versioning.suspend() を使用してバケットのバージョン管理を中断できます。

同じ cos リソースを使用すると、以下を使用してすべてのバージョンのオブジェクトをリストすることができます。

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

クライアントの使用:

#!/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'
    }
)

同じクライアントを使用するオブジェクトのバージョンをリストします。

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

同じクライアントを使用しているオブジェクトのバージョンを削除する:

Python APIは非常に柔軟で、同じタスクを達成するためのさまざまな方法がある。

Node.js

IBM Cloud Object Storage 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
});