オブジェクトのバージョン管理
バージョン管理により、1 つのオブジェクトの複数の改訂が同じバケット内に存在することが可能になります。 オブジェクトの各バージョンは、照会、読み取り、アーカイブ状態からの復元、または削除を行うことができます。 バケットのバージョン管理を有効にすると、ユーザー・エラーや不注意による削除によるデータ損失を軽減できます。 オブジェクトが上書きされると、新しいバージョンが作成され、オブジェクトの前のバージョンが自動的に保持されます。 したがって、バージョン管理が使用可能になっているバケットでは、偶発的な削除または上書きの結果として削除されたオブジェクトは、オブジェクトの前のバージョンを復元することによって容易にリカバリーできます。
オブジェクトが削除されると、そのオブジェクトは 削除マーカー に置き換えられ、前のバージョンが保存されます (完全に削除されるものはありません)。 オブジェクトの個々のバージョンを完全に削除するには、削除要求で _バージョン ID_を指定する必要があります。 オブジェクトに対する GET
要求は、最後に保管されたバージョンを検索します。 現行バージョンが削除マーカーである場合、 IBM COS は 404 Not Found
エラーを返します。
バケットがバージョン管理を有効にすると、バケット内のすべてのオブジェクトがバージョン管理されます。 すべての新規オブジェクト (バケットでバージョン管理を有効にした後に作成されたもの) は、永続的に割り当てられたバージョン ID を受け取ります。 (バケットで) バージョン管理が有効になる前に作成されたオブジェクトには、 null
のバージョンが割り当てられます。 null
バージョン ID を持つオブジェクトが上書きまたは削除されると、新しいバージョン
ID が割り当てられます。 バージョン管理を中断しても、既存のオブジェクトは変更されませんが、 IBM COS による将来の要求の処理方法は変更されます。 一度有効にすると、バージョン管理の中断のみが可能になり、完全に無効にすることはできません。 したがって、バケットには、バージョン管理に関連する 3 つの状態 (1) があります。 デフォルト (バージョンなし)、2. 使用可能、または 3. 中断されました。
バージョン管理の概要
最初に、オブジェクトのバージョン管理を有効にして新規バケットを作成します。
- オブジェクト・ストレージ・インスタンスにナビゲートした後、 「バケットの作成 (Create bucket)」 をクリックします。
- リージョンと回復力を選択し、 「オブジェクトのバージョン管理」 を探して、セレクターを 「有効」 に切り替えます。

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

用語
マーカーの削除: 削除されたオブジェクトのバージョンへのアクセスを許可する「不可視」オブジェクト。
バージョン ID: Unicode、 UTF-8 エンコード、URL セーフ、不透明ストリング。オブジェクトの固有のバージョンと関連メタデータを示し、その特定のバージョンへの要求をターゲットとするために使用されます。 バージョン ID の最大長は 1,024 バイトです。
'null': バケットでバージョン管理が有効にされたときに存在していたオブジェクトに割り当てられる特殊なバージョン ID。
整合性とデータ保全性
IBM COS はすべてのデータ入出力操作に強力な整合性を提供しますが、バケット構成は最終的に整合性があります。 バケットで初めてバージョン管理を有効にした後、構成がシステム全体に伝搬されるまでにしばらく時間がかかる場合があります。 バージョン管理が有効になっているように見える場合がありますが、バージョン管理を有効にしてから 15 分待機して、バージョンの作成またはマーカーの削除が予期される要求を行うことをお勧めします。
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
フィールドが表示されます。
使用量とアカウンティング
すべてのバージョンは、同等のオブジェクトであるかのように計測されます。 つまり、バケットに 5 つ前のバージョンの単一オブジェクトが含まれている場合、 リソース構成 API によって返される object_count
フィールドは、バケット内のオブジェクトが 1 つのみであるかのように表示されますが、 6
になります。 同様に、累積バージョンは合計使用量に寄与し、請求可能です。 Read Bucket Metadata API によって返される object_count
フィールドに加えて、API 応答本文には、バージョン管理に関連する以下のいくつかの新規フィールドが含まれています。
noncurrent_object_count
: バケット内の非現行オブジェクト・バージョンの数 (int64
形式)。noncurrent_bytes_used
: バケット内のすべての非現行オブジェクト・バージョンの合計サイズ (int64
形式)。delete_marker_count
: バケット内の削除マーカーの総数 (int64
形式)。
前述のように、バージョン管理は使用可能または使用停止にしかできません。 何らかの理由でバージョン管理を完全に無効にする必要がある場合は、バージョン管理が有効になっていない新規バケットにバケットの内容をマイグレーションする必要があります。
インタラクション
バージョン管理用の S3 API の IBM COS 実装は、バージョン管理用の AWS S3 API と同じですが、いくつかの違いがあります。
バージョン管理されたオブジェクトのアーカイブと有効期限切れ
ライフサイクル構成は、バージョンが有効なバケットで許可されます。 ただし、 Amazon S3とは異なり、新規バージョンは通常のオブジェクトと同じ方法でアーカイブ・ルールに従います。 オブジェクトには、作成時に遷移日が指定され、現行バージョンであるか非現行バージョンであるかに関係なく、個々の遷移日にアーカイブされます。 オブジェクトを上書きしても、前のバージョンの遷移日付には影響しません。新しい (現行の) バージョンには遷移日付が割り当てられます。
NoncurrentVersionTransition
ルールを使用して、ライフサイクル構成内のオブジェクトの非現行バージョン のみ をアーカイブすることはできません。
不変Object Storage(WORM)
バージョン管理が有効になっているバケットでは、Immutable Object Storage の IBM COS 実装 (つまり、保存ポリシー) は許可されません。 保存ポリシーを使用してバケットでバージョン管理を有効にしようとすると、保存ポリシーを作成しようとしても失敗します。
サポートされる 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 エンコードするように COS に要求します。 オブジェクト・キーには任意の Unicode 文字を含めることができますが、XML 1.0 パーサーは、0 から 10 までの ASCII 値を持つ文字など、一部の文字を構文解析できません。 XML 1.0でサポートされない文字の場合、このパラメーターを追加して、応答内のキーを COS がエンコードするように要求できます。
有効な値: url
。
key-marker
: バケツ内のオブジェクトをリストアップする際に、最初に指定するキーを指定します。
max-keys
: 応答で返されるキーの最大数を設定します。 デフォルトでは、API は最大 1,000 個のキー名を返します。 応答に含まれるキーの数は少なくなる可能性がありますが、それ以上は含まれません。
prefix
: このパラメーターは、指定された接頭部で始まるキーのみを選択する場合に使用します。
version-id-marker
: リストを開始したいオブジェクト・バージョンを指定します。
特定のバージョンのオブジェクトに対する操作
いくつかの 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 COS SDK for Python および Node.jsを使用していますが、オブジェクト・バージョン管理の実装は、カスタム・エンドポイントの設定を可能にする S3-compatible ライブラリーまたはツールと完全に互換性がなければなりません。 サード・パーティー・ツールを使用するには、 AWS V4 署名を計算するための HMAC 資格情報が必要です。 HMAC 資格情報について詳しくは、 資料を参照してください。
Python
IBM COS SDK for Python を使用したバージョン管理の有効化は、 上位リソース または 下位クライアント 構文のいずれかを使用して行うことができます。
リソースの使用:
#!/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 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
});