삭제되거나 대체된 객체를 검색할 수 있도록 Cloud Storage는 객체 버전 관리 기능을 제공합니다. 이 페이지는 이 기능 및 함께 사용할 수 있는 옵션을 설명합니다.
서비스 중인 객체 버전이 대체되거나 삭제될 때 객체 버전 관리는 이전 객체 버전을 보존합니다. 객체 버전 관리를 사용 설정하면 스토리지 비용이 증가할 수 있지만 이전 객체 버전을 삭제하도록 객체 수명 주기 관리를 구성하면 비용을 다소 줄일 수 있습니다.
소개
버킷에 대한 객체 버전 관리를 사용 설정합니다. 사용 설정되면
서비스 중인 버전의 세대 번호를 지정하지 않는 한 서비스 중인 객체 버전을 대체하거나 삭제할 때마다 Cloud Storage는 이전 객체 버전을 보존합니다.
이전 버전에서는 객체 이름을 보존하지만 세대 번호로 고유하게 식별됩니다.
이전 버전은 포함할 객체 버전을 명시적으로 요청하는 경우에만 나타납니다.
삭제 요청에 세대 번호를 포함하거나 객체 수명 주기 관리를 사용하여 객체 버전을 영구적으로 삭제합니다.
객체의 이전 버전은 서비스 중인 버전과는 독립적으로 존재합니다.
언제든지 버킷의 버전 관리를 설정하거나 해제할 수 있습니다. 버전 관리를 중지하면 기존 객체 버전은 남지만 버킷에서는 객체의 새로운 이전 버전을 더 이상 보존하지 않습니다.
객체 버전 관리 세부정보
Cloud Storage는 객체 버전을 식별하는 데 2가지 속성을 사용합니다. 한 가지 속성은 객체 데이터의 버전을 식별하고, 또 다른 속성은 객체의 메타데이터 버전을 식별합니다. 이러한 속성은 객체 버전 관리 사용이 설정되지 않았어도 항상 모든 객체 버전에 존재합니다. 이러한 속성은 업데이트 순서의 강제 배열을 위한 조건부 업데이트의 전제 조건으로 사용될 수 있습니다.
Cloud Storage는 다음 속성을 사용하여 모든 객체를 표시합니다.
속성 | 설명 |
---|---|
generation |
콘텐츠(데이터) 세대를 식별하고 객체 콘텐츠를 대체할 때 업데이트됩니다. 객체가 같은 버킷에 있더라도 관련 없는 객체의 세대 번호 사이에는 관계가 없습니다. |
metageneration |
메타데이터 세대를 식별하고 주어진 콘텐츠 세대의 메타데이터가 업데이트될 때마다 증가합니다. 객체의 새 generation 마다 metageneration 은 1 로 재설정됩니다. metageneration 속성은 generation 속성 없이는 의미가 없으며 이와 연결해서만 사용되어야 합니다. 다시 말해서, 데이터 세대가 서로 다른 2가지 버전의 메타데이터 세대를 비교하는 것은 의미가 없습니다. |
현재 보관 정책이 설정되어 있는 버킷에는 객체 버전 관리를 사용 설정할 수 없습니다.
이전 객체 메타데이터
객체의 이전 버전에는 자체 메타데이터가 있으며, 이는 서비스 중인 버전의 메타데이터와 다를 수 있습니다. 가장 중요한 점은 이전 버전이 ACL을 유지하며, 서비스 중인 버전과 반드시 동일한 권한을 갖지는 않는다는 것입니다.
서비스 중인 버전이나 이전 버전에 관계없이 각 버전에는 하나의 메타데이터 집합이 있으며, 오직 최신 메타 세대 번호만 메타데이터를 참조합니다. 이전 메타 세대 번호는 이후에 변경된 메타데이터 액세스에 사용될 수 없습니다.
요청에 generation
을 지정하여 이전 객체 버전의 메타데이터를 업데이트할 수 있습니다. 안전한 읽기-수정-쓰기 시맨틱스를 보장하기 위해 메타 세대 일치 전제 조건을 사용할 수 있습니다. 메타데이터를 읽은 시점과 업데이트를 보낸 시점 간에 업데이트하려는 메타데이터가 변경된 경우, 이 전제 조건을 사용하면 업데이트에 실패합니다.
객체 버전 관리 예시
이 예시에서는 객체 버전 관리가 사용 설정된 상태에서 파일을 대체, 업데이트, 삭제할 때 버킷의 cat.jpg
파일에 무슨 일이 발생하는지 보여줍니다.
- 새 이미지 업로드
우선
cat.jpg
를 Cloud Storage에 업로드하면generation
번호와metageneration
번호가 수신됩니다. 이 예시에서 세대 번호는1360887697105000
입니다. 객체가 새 객체이므로metageneration
번호는1
입니다.객체 버전 관리가 사용 설정되지 않아도
cat.jpg
는generation
및metageneration
번호를 받습니다. gsutil에서stat
명령어를 사용하여 이러한 번호를 볼 수 있습니다. 해당 안내는 객체 메타데이터 보기를 참조하세요.- 객체 버전 관리 사용 설정
이 시점에서 버킷에 객체 버전 관리를 사용하기로 결정합니다. 이렇게 해도
cat.jpg
의generation
또는metageneration
번호는 영향을 받지 않습니다.- 이미지의 메타데이터 변경
cat.jpg
의 메타데이터는 커스텀 메타데이터를 추가하여 업데이트할 수 있습니다.color:black
. 메타데이터를 업데이트하면cat.jpg
의metageneration
값이 증가합니다(이 경우1
에서2
로). 하지만 객체 자체는 변경되지 않으므로, Cloud Storage는 계속해서 한 버전의cat.jpg
만 보관하며 버전의generation
번호는 계속1360887697105000
입니다.- 새로운 버전의 이미지 업로드
Cloud Storage 버킷에
cat.jpg
의 새 버전을 업로드합니다. 이때 객체 버전 관리가 기존cat.jpg
객체를 이전 상태로 옮깁니다. 이전 버전은 이전과 동일한 스토리지 클래스와 메타데이터를 유지합니다. 이전 버전은 사용자가 버전 관리된 목록 나열을 수행하는 경우에만 나타나며, 일반적인 목록 나열 명령어에는 나타나지 않습니다. 이제 이전 버전은cat.jpg#1360887697105000
으로 참조됩니다.한편 새로 업로드된
cat.jpg
는 서비스 중인 객체 버전이 됩니다. 이 새로운cat.jpg
는 고유한generation
번호를 가지며, 이 예시에서는1360887759327000
입니다. 또한 새 버전은 고유 메타데이터를 가지며metageneration
번호는1
입니다. 즉, 사용자가 지정할 때까지color:black
메타데이터는 포함되지 않습니다.cat.jpg,
에 액세스하거나 수정하는 경우 이 버전이 사용됩니다. 또는generation
번호를 사용하여 이cat.jpg
버전을 참조할 수 있습니다. 예를 들어 gsutil 도구를 사용하면 이를cat.jpg#1360887759327000
으로 참조합니다.- 이미지의 서비스 중인 버전 삭제
이제
cat.jpg
를 삭제합니다. 이때 세대 번호가1360887759327000
이었던 버전이 이전 버전이 됩니다. 이제 버킷에는cat.jpg
의 2가지 이전 버전이 있으며 서비스 중인 버전은 없습니다.generation
번호를 사용하여 어떤 이전 버전이든 계속 참조할 수 있지만generation
없이cat.jpg
액세스를 시도할 경우 오류가 발생합니다.마찬가지로, 버킷의 일반 객체 목록은
cat.jpg
를 버킷의 객체 중 하나로 표시하지 않습니다. 객체의 이전 버전 나열에 대한 자세한 내용은 이전 객체 버전 나열을 참조하세요.- 객체 버전 관리 중지
객체 버전 관리를 중지하면 객체가 이전 버전이 되지 않습니다. 객체의 기존 이전 버전은 Cloud Storage에 남아 있습니다. 객체 버전 관리가 중지되더라도
cat.jpg#1360887697105000
과cat.jpg#1360887759327000
은 사용자가 수동으로 또는 객체 수명 주기 관리를 사용하여 삭제할 때까지 버킷에 저장되어 있습니다.- 이전 버전 중 하나 복원
객체 버전 관리를 사용하지 않더라도 사본을 만들어 기존의 이전 버전 중 하나를 복원할 수 있습니다. 만드는 복사본 이름을
cat.jpg
로 지정하면 됩니다. 그러면 버킷에는 이전 버전 2개와 복사본을 만들면서 생긴 서비스 중인 버전 등 3가지 버전의cat.jpg
가 있습니다.
객체 버전 관리 참조
이 참조 표는 객체 버전 관리로 특정 작업을 수행할 때 발생하는 결과를 보여줍니다.
객체 버전 관리 상태 | 작업 | 결과 |
---|---|---|
사용 중지됨 | ||
dog.png 를 새 버전으로 대체합니다. |
새 버전이 서비스 중인 버전을 대체하며 새로운 세대 번호를 받습니다. 이전의 서비스 중인 버전이 완전히 삭제됩니다. | |
서비스 중인 버전에 dog.png 의 이전 버전을 복사합니다.1 |
이전 버전의 사본이 서비스 중인 버전을 대체하고 새로운 세대 번호를 받습니다. 이전의 서비스 중인 버전이 완전히 삭제됩니다. | |
dog.png 를 삭제합니다. |
dog.png 가 완전히 삭제됩니다. |
|
세대 번호를 지정하여 dog.png 의 이전 버전을 삭제합니다.1 |
이전 버전이 완전히 삭제됩니다. | |
사용 설정됨 | ||
dog.png 를 새 버전으로 대체합니다. |
새 버전이 서비스 중인 버전을 대체하며 새로운 세대 번호를 받습니다. 이전의 서비스 중인 버전이 이전 버전이 되며 동일한 세대 번호를 유지합니다. | |
dog.png 의 이전 버전을 서비스 중인 버전에 복사합니다. |
이전 버전의 사본이 서비스 중인 버전을 대체하고 새로운 세대 번호를 받습니다. 이전의 서비스 중인 버전이 이전 버전이 되며 동일한 세대 번호를 유지합니다. | |
세대 번호를 지정하지 않고 dog.png 의 서비스 중인 버전을 삭제합니다. |
서비스 중인 버전은 이전 버전이 되며 동일한 세대 번호를 유지합니다. | |
세대 번호를 지정하여 dog.png 의 서비스 중인 버전을 삭제합니다. |
서비스 중인 버전이 완전히 삭제됩니다. | |
세대 번호를 지정하여 dog.png 의 이전 버전을 삭제합니다. |
이전 버전이 완전히 삭제됩니다. |
1 이전에 버킷에서 객체 버전 관리를 사용 설정한 경우 이전 버전이 존재할 수 있습니다.
팁
이 섹션은 객체 버전 관리를 보다 효과적으로 사용하는 데 유용한 팁을 설명합니다.
gsutil 사용
- gsutil 도구는 버전 관리된 객체로 작업 시 객체 버전 관리와 관련된 수많은 작업을 수월하게 해주는 포괄적 지원을 제공합니다. 예를 들어 객체 이름에
#
및generation
번호를 추가하여 객체의 이전 버전으로 작업할 수 있습니다. 객체 버전 관리와 함께 gsutil 사용에 대한 자세한 내용은 객체 버전 관리 및 동시 실행 제어를 참조하세요.
ETag 피하기
- 조건부 업데이트에 ETag 대신
generation
및metageneration
번호를 사용하는 것이 좋습니다.generation
과metageneration
번호는 메타데이터 변경을 포함하여 모든 객체 업데이트를 추적하므로, ETag보다 강력한 보장을 제공합니다.
파일 복원 동작 이해
현재 서비스 중인 버전에 객체의 이전 버전을 복사할 수 있습니다. 객체의 이전 버전을 복사하는 방법에 대한 단계별 안내는 이전 객체 버전 복사를 참조하세요.
객체 버전 관리가 사용 설정된 상태로 이 작업을 수행할 경우 버킷에 객체의 서비스 중인 버전이 있으면 Cloud Storage가 기존의 서비스 중인 버전을 대체하지만 새로운 이전 버전으로 보존합니다. 이러한 경우 이후 버킷에는 대체된 객체(현재 이전 버전)와 이전에 이전 버전이었던 객체 복사본 두 개(서비스 중인 복사본 한 개와 여전히 이전 버전인 복사본 한 개)가 포함되며 이들 모두에 대한 스토리지 비용이 청구됩니다. 불필요한 청구를 방지하려면 현재 서비스 중인 버전의 복사본을 만들 때 사용한 이전 버전을 삭제합니다.
서비스 중인 객체 버전 변형 시 세대 일치 전제 조건 사용
세대 번호를 사용하면 이름과 세대 번호가 있는 객체가 존재하는 한, 서비스 중인 버전인지 또는 이전 버전인지 여부에 관계없이 요청이 성공합니다. 이러한 객체가 없으면 Cloud Storage는
404 Not Found
를 반환합니다.세대 일치 전제 조건을 사용하면 요청된 객체의 실시간 버전에 지정된 세대 번호가 있는 경우에만 요청이 성공합니다. 이러한 객체가 존재하지 않거나 이전 버전인 경우 Cloud Storage는
412 Precondition Failed
를 반환합니다.객체 이름에서 세대 번호와 함께 세대 일치 전제 조건을 사용하지 마세요. 2가지를 모두 사용하는데 번호가 일치하면 전제 조건 사용이 중복됩니다. 번호가 일치하지 않으면 요청이 항상 실패합니다.
세대 일치 전제 조건과 함께 동시 실행 변형 요청을 여러 개 제출하면 Cloud Storage가 strong consistency를 가지므로 해당 요청 중 하나만 성공합니다. 이 기능은 객체가 여러 소스에서 업데이트되었고 사용자가 실수로 객체를 대체하지 않도록 해야 하는 경우에 유용합니다.
객체를 업로드할 때 generation-match 전제 조건을
0
으로 설정하면 Cloud Storage는 객체의 서비스 중인 버전이 없는 경우에만 지정된 요청을 수행합니다. 예를 들어PUT
요청을 XML API를 사용하여x-goog-if-generation-match:0
헤더가 포함된 새 객체를 만들면 객체가 존재하지 않거나 객체의 이전 버전만 있는 경우에 해당 요청이 성공합니다. 실시간 버전의 객체가 있으면 Cloud Storage는412 Precondition Failed
상태 코드를 사용하여 업데이트를 취소합니다.
다음 단계
- 객체 버전 관리 사용 방법을 알아보세요.
- 객체 버전을 자동으로 관리할 수 있는 객체 수명 주기 관리에 대해 알아보세요.