IBM Cloud Docs
오브젝트 버전화

오브젝트 버전화

버전화를 사용하면 단일 오브젝트의 여러 개정이 동일한 버킷에 존재할 수 있습니다. 오브젝트의 각 버전을 조회, 읽기, 아카이브 상태에서 복원 또는 삭제할 수 있습니다. 버킷에서 버전화를 사용으로 설정하면 사용자 오류 또는 의도하지 않은 삭제로 인한 데이터 손실을 완화할 수 있습니다. 오브젝트를 겹쳐쓰면 새 버전이 작성되고 오브젝트의 이전 버전이 자동으로 보존됩니다. 따라서 버전화 사용 버킷에서 실수로 삭제되거나 겹쳐쓰기로 인해 삭제된 오브젝트는 이전 버전의 오브젝트를 복원하여 쉽게 복구할 수 있습니다. 오브젝트가 삭제되면 삭제 마커 로 대체되고 이전 버전이 저장됩니다 (영구적으로 삭제되지 않음). 오브젝트의 개별 버전을 영구적으로 삭제하려면 삭제 요청이 _버전 ID_를 지정해야 합니다. 오브젝트에 대한 GET 요청은 가장 최근에 저장된 버전을 검색합니다. 현재 버전이 삭제 마커인 경우 IBM COS는 404 Not Found 오류를 리턴합니다.

버킷이 버전화를 사용으로 설정하면 버킷의 모든 오브젝트가 버전화됩니다. 모든 새 오브젝트 (버킷에서 버전화를 사용으로 설정한 후 작성됨) 는 영구적으로 지정된 버전 ID를 수신합니다. 버킷에서 버전화가 사용으로 설정되기 전에 작성된 오브젝트에는 null 의 버전이 지정됩니다. null 버전 ID가 있는 오브젝트를 겹쳐쓰거나 삭제하면 새 버전 ID가 지정됩니다. 버전화를 일시중단하면 기존 오브젝트가 변경되지 않지만 IBM COS에서 향후 요청을 처리하는 방법이 변경됩니다. 사용으로 설정되면 버전화는 일시중단만 가능하며 완전히 사용 안함으로 설정되지는 않습니다. 따라서 버킷에는 버전화와 관련된 세 가지 상태 (1) 가 있을 수 있습니다. 기본값 (버전화되지 않음), 2. 사용 가능 또는 3. 일시중단됨.

버전화 시작하기

먼저, 오브젝트 버전화가 사용으로 설정된 새 버킷을 작성하십시오.

  1. 오브젝트 스토리지 인스턴스로 이동한 후 버킷 작성을 클릭하십시오.
  2. 지역 및 복원성을 선택한 후 오브젝트 버전화 를 찾아 선택기를 사용으로 토글하십시오.

버전 관리 활성화
버전 관리 활성화
'

그런 다음 버전화된 오브젝트를 작성하십시오.

  1. 새 버킷을 탐색하고 파일을 브라우저 창으로 끌어 파일을 업로드하십시오.
  2. 오브젝트가 업로드되면 동일한 이름의 다른 오브젝트를 업로드하십시오. 겹쳐쓰는 대신 파일에 UUID가 지정되고 오브젝트의 현재 버전이 아닌 버전으로 저장됩니다.
  3. 오브젝트의 대체 버전을 보고 상호작용하려면 버전 보기 를 전환하십시오.

버전 보기
버전 보기

용어

마커 삭제: 삭제된 오브젝트의 버전에 액세스할 수 있는 '표시되지 않는' 오브젝트입니다.

버전 ID: 오브젝트 및 연관된 메타데이터의 고유 버전을 표시하고 해당 특정 버전에 대한 요청을 대상으로 지정하는 데 사용되는 유니코드, UTF-8 인코딩, URL 안전, 오파크 문자열입니다. 버전 ID의 길이는 최대 1,024바이트입니다.

'null': 버킷에서 버전화를 사용할 수 있을 때 존재했던 오브젝트에 지정된 특수 버전 ID입니다.

일관성 및 데이터 무결성

IBM COS가 모든 데이터 IO 조작에 대해 강력한 일관성을 제공하는 반면, 버킷 구성은 결국 일관됩니다. 버킷에서 처음 버전화를 사용으로 설정한 후 구성이 시스템 전체에 전파되는 데 몇 분이 걸릴 수 있습니다. 버전화가 사용 가능한 것으로 나타날 수 있지만 버전을 작성하거나 마커를 삭제할 것으로 예상되는 요청을 작성하기 위해 버전화를 사용 가능하게 한 후 15분정도 기다리는 것이 좋습니다.

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, PUTDELETE 조치에는 target.versionId 필드가 포함됩니다. target.versionId 필드는 다중 파트 업로드를 완료할 때와 오브젝트 또는 파트를 복사할 때 해당 조치로 인해 새 버전이 작성되는 경우에도 표시됩니다.

responseData.deleteMarker.created 필드는 오브젝트가 삭제되고 삭제 마커가 작성될 때 표시됩니다.

사용량 및 계정

모든 버전은 동일한 오브젝트인 것처럼 측정됩니다. 이는 버킷에 5개의 이전 버전이 있는 단일 오브젝트가 있는 경우 버킷에 하나의 오브젝트만 있는 것처럼 표시되더라도 자원 구성 API 에서 리턴되는 object_count 필드가 6 가 됨을 의미합니다. 마찬가지로 누적된 버전은 총 사용량에 기여하며 청구 가능합니다. 버킷 메타데이터 읽기 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)

불변 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 의 단일 결과 요소 아래에 그룹화됩니다. 이러한 그룹은 max-keys 제한사항에 대한 하나의 결과로 계산됩니다. 이러한 키는 응답의 다른 곳에서는 리턴되지 않습니다.

encoding-type: 응답에서 오브젝트 키를 URL 인코딩하기 위해 COS를 요청합니다. 오브젝트 키는 유니코드 문자를 포함할 수 있지만 XML 1.0 구문 분석기는 ASCII값이 0-10인 문자와 같은 일부 문자를 구문 분석할 수 없습니다. XML 1.0에서 지원되지 않는 문자의 경우 이 매개변수를 추가하여 COS가 응답에서 키를 인코딩하도록 요청할 수 있습니다. 올바른 값: url.

key-marker' : 버킷에 개체를 나열할 때 시작할 키를 지정합니다.

max-keys: 응답에서 리턴되는 최대 키 수를 설정합니다. 기본적으로 API는 최대 1,000개의 키 이름을 리턴합니다. 응답은 더 적은 키를 포함할 수 있지만 더 많은 키를 포함하지는 않습니다.

prefix: 지정된 접두부로 시작하는 키만 선택하려면 이 매개변수를 사용하십시오.

version-id-marker: 나열을 시작할 오브젝트 버전을 지정합니다.

오브젝트의 특정 버전에 대한 조작

여러 API가 사용자가 요청하는 오브젝트의 버전을 표시하는 새 조회 매개변수 (?versionId=<VersionId>) 를 사용합니다. 이 매개변수는 메타데이터 및 태그를 읽고, 삭제하고, 확인하고, 아카이브된 오브젝트를 복원하는 데 동일한 방식으로 사용됩니다. 예를 들어, 버전 ID가 L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo 인 오브젝트 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 예제

다음 예제에서는 오브젝트 버전화의 구현이 사용자 정의 엔드포인트의 설정을 허용하는 S3-compatible 라이브러리 또는 도구와 완전히 호환 가능해야 하지만 Python 및 Node.js용 IBM COS SDK를 사용합니다. 써드파티 도구를 사용하려면 AWS V4 서명을 계산하기 위해 HMAC 신임 정보가 필요합니다. HMAC 신임 정보에 대한 자세한 정보는 문서를 참조하십시오.

Python

Python 용 IBM COS 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 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
});