

# S3 버전 관리로 여러 버전의 객체 유지
<a name="Versioning"></a>

Amazon S3의 버전 관리는 동일 버킷 내에 여러 개의 객체 변형을 보유하는 수단입니다. S3 버전 관리를 사용하면 버킷에 저장된 모든 버전의 객체를 모두 보존, 검색 및 복원할 수 있습니다. 또한 의도치 않은 사용자 작업 및 애플리케이션 장애로부터 더 쉽게 복구할 수 있습니다. 버킷에 대해 버전 관리를 사용 설정하면 Amazon S3가 동일한 객체에 대해 여러 쓰기 요청을 동시에 수신하는 경우 모든 객체가 저장됩니다.

버전 관리가 사용 설정된 버킷의 경우 실수로 삭제되거나 덮어쓴 객체를 복구할 수 있습니다. 예를 들어 객체를 삭제할 경우 Amazon S3는 객체를 영구적으로 제거하는 대신 삭제 마커를 삽입합니다. 이 삭제 마커가 현재 객체 버전이 됩니다. 객체를 덮어쓴 경우 버킷에 새 객체 버전이 생깁니다. 따라서 언제든지 이전 버전을 복원할 수 있습니다. 자세한 내용은 [버전 관리가 사용 설정된 버킷에서 객체 버전 삭제](DeletingObjectVersions.md) 섹션을 참조하세요.

기본적으로 버킷에는 S3 버전 관리가 사용 중지되어 있으므로 명시적으로 사용 설정해야 합니다. 자세한 내용은 [버킷에 버전 관리 사용 설정](manage-versioning-examples.md) 섹션을 참조하세요.

**참고**  
SOAP API는 S3 버전 관리를 지원하지 않습니다. HTTP를 통한 SOAP 지원은 중단되었지만 HTTPS를 통해 계속해서 사용할 수 있습니다. Amazon S3의 새로운 기능들은 SOAP에서 지원되지 않습니다.
저장되거나 전송된 객체의 모든 버전에는 일반 Amazon S3 요금이 적용됩니다. 각 객체 버전은 이전 버전과의 차이점만이 아닌 완전한 객체입니다. 따라서 세 가지 버전의 객체가 저장된 경우 객체 세 개에 대한 요금이 부과됩니다.

## 버전 관리 미사용 버킷, 버전 관리가 사용 설정된 버킷 및 버전 관리가 일시 중지된 버킷
<a name="versioning-states"></a>

버킷은 다음 3가지 상태 중 하나일 수 있습니다.
+ 버전 관리 미사용(기본값)
+ 버전 관리 사용
+ 버전 관리가 일시 중지됨

버전 관리는 버킷 수준에서 사용 설정하고 일시 중지합니다. 버킷의 버전 관리를 사용 설정한 다음에는 버전 관리 미사용 상태로 돌아갈 수 없습니다. 그러나 해당 버킷에서 버전 관리를 *일시 중지*할 수는 있습니다.

버전 관리 상태는 해당 버킷의 전체 객체에 적용되며 일부에만 적용할 수는 없습니다. 버킷에서 버전 관리를 사용 설정하면 모든 새 객체의 버전이 관리되고 고유한 버전 ID가 부여됩니다. 버전 관리가 사용 설정되었을 때 버킷에 이미 존재했던 객체는 향후 요청에 의해 수정될 때 *항상* 버전이 관리되고 고유한 버전 ID가 부여됩니다. 다음을 참조하세요.
+ 버전 관리 상태로 설정하기 전에 버킷에 저장된 객체의 버전 ID는 `null`이 됩니다. 버전 관리를 사용 설정할 때 버킷의 기존 객체는 변경되지 않습니다. 이후 요청에서는 Amazon S3가 객체를 처리하는 방법만 변경됩니다. 자세한 내용은 [버전 관리가 사용 설정된 버킷의 객체 작업](manage-objects-versioned-bucket.md) 섹션을 참조하세요.
+ 버킷 소유자(또는 적절한 권한을 가진 사용자)는 버전 관리를 일시 중지하여 객체 버전 발생을 중단할 수 있습니다. 버전 관리를 일시 중지할 때 버킷의 기존 객체는 변경되지 않습니다. 이후 요청에서는 Amazon S3가 객체를 처리하는 방법만 변경됩니다. 자세한 내용은 [버전 관리가 일시 중지된 버킷의 객체 작업](VersionSuspendedBehavior.md) 섹션을 참조하세요.

## S3 수명 주기와 함께 S3 버전 관리 사용
<a name="versioning-lifecycle"></a>

데이터 보존 접근 방식을 사용자 지정하고 스토리지 비용을 관리하려면 S3 수명 주기와 함께 객체 버전 관리를 사용합니다. 자세한 내용은 [객체 수명 주기 관리](object-lifecycle-mgmt.md) 섹션을 참조하세요. AWS Management Console, AWS CLI, AWS SDK 또는 REST API를 사용하여 S3 수명 주기 구성을 생성하는 방법에 대한 자세한 내용은 [버킷에서 S3 수명 주기 구성 설정](how-to-set-lifecycle-configuration-intro.md) 섹션을 참조하세요.

**중요**  
버전이 지정되지 않은 버킷에 객체 만료 수명 주기 구성이 있고 버전 관리를 사용할 때 같은 영구 삭제 동작을 유지하고자 하는 경우에는 최신 버전이 아닌 만료 정책을 추가해야 합니다. 최신이 아닌 버전의 만료 수명 주기 구성은 버전 관리가 활성화된 버킷에서 최신이 아닌 객체 버전의 삭제를 관리합니다. 버전 관리가 활성화된 버킷은 하나의 현재 객체 버전과 0개 이상의 최신이 아닌 객체 버전을 유지합니다. 자세한 내용은 [버킷에서 S3 수명 주기 구성 설정](how-to-set-lifecycle-configuration-intro.md) 섹션을 참조하세요.

S3 버전 관리 작업에 대한 자세한 내용은 다음 주제를 참조하세요.

**Topics**
+ [버전 관리 미사용 버킷, 버전 관리가 사용 설정된 버킷 및 버전 관리가 일시 중지된 버킷](#versioning-states)
+ [S3 수명 주기와 함께 S3 버전 관리 사용](#versioning-lifecycle)
+ [S3 버전 관리 작동 방식](versioning-workflows.md)
+ [버킷에 버전 관리 사용 설정](manage-versioning-examples.md)
+ [MFA Delete 구성](MultiFactorAuthenticationDelete.md)
+ [버전 관리가 사용 설정된 버킷의 객체 작업](manage-objects-versioned-bucket.md)
+ [버전 관리가 일시 중지된 버킷의 객체 작업](VersionSuspendedBehavior.md)
+ [버전 관리 문제 해결](troubleshooting-versioning.md)

# S3 버전 관리 작동 방식
<a name="versioning-workflows"></a>

S3 버전 관리를 사용하여 한 버킷에 여러 버전의 객체를 보관함으로써 실수로 삭제되거나 덮어써진 객체를 복원할 수 있습니다. 예를 들어, 버킷에 S3 버전 관리를 적용하는 경우 다음과 같은 변경 사항이 발생합니다.
+ 객체를 영구적으로 제거하는 대신 삭제하는 경우, Amazon S3에서는 삭제 마커를 삽입하며 이는 현재 객체 버전이 됩니다. 따라서 나중에 이전 버전을 복원할 수 있습니다. 자세한 내용은 [버전 관리가 사용 설정된 버킷에서 객체 버전 삭제](DeletingObjectVersions.md) 섹션을 참조하세요.
+ 객체를 덮어쓴 경우 Amazon S3가 버킷에 새 객체 버전을 추가합니다. 이전 버전은 버킷에 남아 있고 현재 버전이 아닌 버전이 됩니다. 이전 버전을 복원할 수 있습니다.

**참고**  
저장되거나 전송된 객체의 모든 버전에는 일반 Amazon S3 요금이 적용됩니다. 각 객체 버전은 이전 버전과의 차이점만 포함된 것이 아닌 완전한 객체입니다. 따라서 세 가지 버전의 객체가 저장된 경우 객체 세 개에 대한 요금이 부과됩니다.

생성한 각 S3 버킷에는 *버전 관리* 하위 리소스가 연결되어 있습니다. (자세한 내용은 [범용 버킷 구성 옵션](UsingBucket.md#bucket-config-options-intro) 섹션을 참조하세요.) 기본적으로 버킷은 *버전 관리 미사용* 상태이며, 버전 관리 하위 리소스는 다음과 같이 빈 버전 관리 구성을 저장합니다.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

버전 관리를 활성화하려면 Amazon S3에 `Enabled` 상태가 포함된 버전 관리 구성을 사용하여 요청을 보내면 됩니다.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

버전 관리를 일시 중지하려면 상태 값을 `Suspended`로 설정합니다.

**참고**  
버킷에서 버전 관리를 처음으로 활성화할 때 변경 사항이 완전히 전파되는 데 시간이 조금 걸릴 수 있습니다. 이 변경 사항이 전파되는 동안 버전 관리를 활성화한 후 생성되거나 업데이트된 객체에 대한 요청에 간헐적인 `HTTP 404 NoSuchKey` 오류가 발생할 수 있습니다. 버전 관리를 활성화하고 나서 15분 정도 기다린 후, 버킷의 객체에 대해 쓰기 작업(`PUT` 또는 `DELETE`)을 실행하는 것이 좋습니다.

버킷 소유자 및 모든 승인된 AWS Identity and Access Management(IAM) 사용자는 버전 관리를 활성화할 수 있습니다. 버킷 소유자는 버킷을 생성한 AWS 계정입니다. 권한에 대한 자세한 내용은 [Amazon S3의 ID 및 액세스 관리](security-iam.md) 섹션을 참조하세요.

AWS Management Console, AWS Command Line Interface(AWS CLI) 또는 REST API를 사용하여 S3 버전 관리를 사용하고 사용 중지하는 방법에 대한 자세한 내용은 [버킷에 버전 관리 사용 설정](manage-versioning-examples.md) 섹션을 참조하세요.

**Topics**
+ [버전 ID](#version-ids)
+ [버전 관리 워크플로](#versioning-workflows-examples)

## 버전 ID
<a name="version-ids"></a>

버킷에 대한 버전 관리를 사용 설정하면 Amazon S3는 저장되는 객체에 대해 고유한 버전 ID를 자동으로 생성합니다. 예를 들어, `photo.gif`(버전 111111) 및 `photo.gif`(버전 121212)와 같이 하나의 버킷에서 키(객체 이름)는 동일하지만 버전 ID가 다른 두 개의 객체를 보유할 수 있습니다.

![\[버전 관리가 활성화되어 있으며 키는 같지만 버전 ID가 다른 객체 두 개가 있는 버킷을 보여 주는 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_Enabled.png)


각 객체에는 S3 버전 관리가 사용되는지 여부에 관계없이 버전 ID가 있습니다. S3 버전 관리를 활성화하지 않으면 Amazon S3가 버전 ID의 값을 `null`로 설정합니다. S3 버전 관리를 사용 설정한 경우 Amazon S3는 객체에 대한 버전 ID 값을 할당합니다. 이 값은 해당 객체를 동일한 키의 다른 버전과 구별해 줍니다.

기존 버킷에 S3 버전 관리를 사용 설정하는 경우 버킷에 이미 저장된 객체는 변경되지 않습니다. 버전 ID(`null`), 콘텐츠, 그리고 권한은 동일하게 유지됩니다. 버전 관리를 활성화하면 버킷에 추가된 각 객체가 동일한 키의 다른 버전과 구별되는 버전 ID를 가져옵니다.

Amazon S3는 버전 ID만 생성하며 버전 ID를 편집할 수 없습니다. 버전 ID는 유니코드, UTF-8 인코딩, URL 지원, 불투명 문자열이며 길이가 1,024바이트를 넘지 않습니다. 다음은 그 한 예입니다.

`3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`

**참고**  
간단한 설명을 위해 이 주제의 다른 예제에서는 훨씬 더 짧은 ID를 사용합니다.



## 버전 관리 워크플로
<a name="versioning-workflows-examples"></a>

버전 관리를 사용하는 버킷에 객체를 `PUT`할 때 비 최신 버전은 덮어쓰지 않습니다. 다음 그림과 같이 동일한 이름의 객체를 이미 보유하고 있는 버킷에 새 버전의 `photo.gif`를 `PUT`할 때 다음과 같은 동작이 발생합니다.
+ 원래 객체(ID = 111111)는 버킷에 남아 있습니다.
+ Amazon S3는 새 버전 ID(121212)를 생성하고 이 최신 버전의 객체를 버킷에 추가합니다.

![\[버전 관리가 활성화된 버킷에 객체를 PUT할 때 S3 버전 관리가 작동하는 방법을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled3.png)


이 기능을 사용하면 객체를 실수로 덮어쓰거나 삭제한 경우 객체의 이전 버전을 검색할 수 있습니다.

객체를 `DELETE`하면 다음 그림과 같이 버킷에 모든 버전이 계속 유지되며 Amazon S3는 삭제 마커를 삽입합니다.

![\[삭제 마커 삽입을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)


삭제 마커가 객체의 최신 버전이 됩니다. 기본적으로 `GET` 요청은 가장 최근에 저장된 버전을 검색합니다. 최신 버전이 삭제 마커일 때 `GET Object` 요청을 수행하면 다음 그림과 같이 `404 Not Found` 오류가 반환됩니다.

![\[404(찾을 수 없음) 오류를 반환하는 삭제 마커에 대한 GetObject 직접 호출을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


하지만 버전 ID를 지정하여 최신 버전이 아닌 객체에 대해 `GET`을 실행할 수 있습니다. 다음 그림에서는 특정 객체 버전인 111111을 `GET`합니다. Amazon S3는 최신 버전이 아닌 해당 버전의 객체를 반환합니다.

자세한 내용은 [버전 관리가 사용 설정된 버킷에서 객체 버전 검색](RetrievingObjectVersions.md) 섹션을 참조하세요.

![\[버전 관리가 활성화된 버킷에 현재 버전이 아닌 객체를 GET할 때 S3 버전 관리가 작동하는 방법을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_GET_Versioned3.png)


삭제하고자 하는 버전을 지정하여 객체를 영구적으로 삭제할 수 있습니다. Amazon S3 버킷 소유자 또는 권한이 부여된 IAM 사용자만이 영구적으로 버전을 삭제할 수 있습니다. `DELETE` 작업이 `versionId`를 지정하는 경우 해당 객체 버전은 영구 삭제되며 Amazon S3가 삭제 마커를 삽입하지 않습니다.

![\[DELETE versionId가 특정 객체 버전을 영구적으로 삭제하는 방법을 보여 주는 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


다중 인증(MFA) 삭제를 활성화하도록 버킷을 구성하여 보안을 강화할 수 있습니다. 버킷에 MFA 삭제를 활성화하는 경우 버킷 소유자는 버전을 삭제하거나 버킷의 버전 관리 상태를 변경하는 모든 요청에 두 가지 형식의 인증을 포함해야 합니다. 자세한 내용은 [MFA Delete 구성](MultiFactorAuthenticationDelete.md) 섹션을 참조하세요.

### 객체의 새 버전은 언제 생성됩니까?
<a name="versioning-workflows-new-versions"></a>

객체의 새 버전은 새 객체에 `PUT` 작업을 수행할 때만 생성됩니다. `CopyObject`와 같은 특정 작업은 `PUT` 작업을 구현하여 작동한다는 점에 유의하세요.

현재 객체를 수정하는 일부 작업에서는 새 객체에 `PUT` 작업을 수행하지 않으므로 새 버전이 생성되지 않습니다. 여기에는 객체의 태그 변경과 같은 작업이 포함됩니다.

**중요**  
S3 버전 관리를 사용하는 버킷에 대한 Amazon S3 객체 `PUT` 또는 `DELETE` 요청에서 받은 HTTP 503(서비스 사용 불가) 응답의 횟수가 크게 증가한다면 버전이 무수히 많은 객체가 하나 이상 버킷에 있을 것으로 추정됩니다. 자세한 내용은 [버전 관리 문제 해결](troubleshooting-versioning.md)의 S3 버전 관리 섹션을 참조하세요.

# 버킷에 버전 관리 사용 설정
<a name="manage-versioning-examples"></a>

S3 버전 관리를 사용하면 한 버킷 내에 여러 개의 객체 버전을 유지할 수 있습니다. 이 섹션에서는 콘솔, REST API, AWS SDK 및 AWS Command Line Interface(AWS CLI)를 사용하여 버킷의 버전 관리를 사용하는 방법에 대한 예를 제공합니다.

**참고**  
버킷에서 버전 관리를 처음으로 활성화하면 변경 사항이 S3 시스템 전체에 완전히 전파되는 데 최대 15분이 걸릴 수 있습니다. 이 기간 동안 버전 관리를 활성화한 후 생성되거나 업데이트된 객체에 대한 `GET` 요청으로 인해 `HTTP 404 NoSuchKey` 오류가 발생할 수 있습니다. 버전 관리를 활성화하고 나서 15분 정도 기다린 후, 버킷의 객체에 대해 쓰기 작업(`PUT` 또는 `DELETE`)을 수행하는 것이 좋습니다. 이 대기 기간은 객체 가시성 및 버전 추적과 관련된 잠재적 문제를 방지하는 데 도움이 됩니다.

S3 버전 관리에 대한 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요. 버전 관리가 사용 설정된 버킷의 객체 작업에 대한 자세한 내용은 [버전 관리가 사용 설정된 버킷의 객체 작업](manage-objects-versioned-bucket.md) 섹션을 참조하세요.

S3 버전 관리를 사용하여 데이터를 보호하는 방법에 대한 자세한 내용은 [Tutorial: Protecting data on Amazon S3 against accidental deletion or application bugs using S3 Versioning, S3 Object Lock, and S3 Replication(자습서: S3 버전 관리, S3 객체 잠금, S3 복제를 사용하여 우발적인 삭제나 애플리케이션 버그로부터 Amazon S3의 데이터 보호)](https://aws.amazon.com/getting-started/hands-on/protect-data-on-amazon-s3/?ref=docs_gateway/amazons3/manage-versioning-examples.html)을 참조하세요.

생성한 각 S3 버킷에는 *버전 관리* 하위 리소스가 연결되어 있습니다. (자세한 내용은 [범용 버킷 구성 옵션](UsingBucket.md#bucket-config-options-intro) 섹션을 참조하세요.) 기본적으로 버킷은 *버전 관리 미사용* 상태이며, 버전 관리 하위 리소스는 다음과 같이 빈 버전 관리 구성을 저장합니다.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

버전 관리를 사용 설정하려면 Amazon S3에 상태가 포함된 버전 관리 구성을 사용하여 요청을 보내면 됩니다.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

버전 관리를 일시 중지하려면 상태 값을 `Suspended`로 설정합니다.

버킷 소유자 및 모든 승인된 사용자는 버전 관리를 사용 설정할 수 있습니다. 버킷 소유자는 버킷을 생성한 AWS 계정(루트 계정)입니다. 권한에 대한 자세한 내용은 [Amazon S3의 ID 및 액세스 관리](security-iam.md) 섹션을 참조하세요.

다음 섹션에서는 콘솔, AWS CLI 및 AWS SDK를 사용하여 S3 버전 관리를 사용하는 방법에 대해 자세히 설명합니다.

## S3 콘솔 사용
<a name="enable-versioning"></a>

다음 단계에 따라 AWS Management Console을 사용하여 S3 버킷의 버전 관리를 사용합니다.

**S3 범용 버킷의 버전 관리 사용 설정 또는 사용 중지**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **범용 버킷**을 선택합니다.

1. 버킷 목록에서 버전 관리를 사용 설정하려는 버킷의 이름을 선택합니다.

1. **속성**을 선택합니다.

1. **버킷 버전 관리(Bucket Versioning)**에서 **편집**을 선택합니다.

1. **일시 중지** 또는 **사용 설정**를 선택한 다음 **변경 사항 저장**을 선택합니다.

**참고**  
버전 관리에 AWS 멀티 팩터 인증(MFA)을 사용할 수 있습니다. 버전 관리에 MFA를 사용하는 경우 객체 버전을 영구적으로 삭제하거나 버전 관리를 일시 중지 또는 다시 사용하려면 계정의 MFA 디바이스에서 유효한 코드와 AWS 계정의 액세스 키를 제공해야 합니다.  
버전 관리에 MFA를 사용하려면 `MFA Delete`를 사용 설정합니다. 그러나 AWS Management Console을 사용하여 `MFA Delete`를 사용할 수 없습니다. AWS Command Line Interface(AWS CLI) 또는 API를 사용해야 합니다. 자세한 내용은 [MFA Delete 구성](MultiFactorAuthenticationDelete.md) 섹션을 참조하세요.

## AWS CLI 사용
<a name="manage-versioning-examples-cli"></a>

다음 예시에서는 S3 범용 버킷의 버전 관리를 활성화합니다.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled
```

다음 예에서는 버킷에서 물리적 MFA 디바이스에 대해 S3 버전 관리 및 다중 인증(MFA) 삭제를 활성화합니다. 물리적 MFA 디바이스의 경우 `--mfa` 파라미터에서 MFA 디바이스 일련번호, 공백 문자 및 인증 디바이스에 표시되는 값의 연결을 전달합니다.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

다음 예에서는 버킷에서 가상 MFA 디바이스에 대해 S3 버전 관리 및 다중 인증(MFA) 삭제를 활성화합니다. 가상 MFA 디바이스의 경우 `--mfa` 파라미터에서 MFA 디바이스 ARN, 공백 문자 및 인증 디바이스에 표시되는 값의 연결을 전달합니다.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

**참고**  
MFA Delete를 사용하려면 승인된 물리적 또는 가상 인증 디바이스가 필요합니다. Amazon S3에서 MFA Delete 사용에 대한 자세한 내용은 [MFA Delete 구성](MultiFactorAuthenticationDelete.md) 섹션을 참조하세요.

AWS CLI를 사용하여 버전 관리를 사용하는 방법에 대한 자세한 내용은 *AWS CLI 명령 참조*의 [put-bucket-versioning](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-versioning.html)을 참조하세요.

## AWS SDK 사용
<a name="manage-versioning-examples-sdk"></a>

다음 예제에서는 버킷의 버전 관리를 사용한 다음 AWS SDK for Java 및 AWS SDK for .NET을 사용하여 버전 관리 상태를 검색합니다. 다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ .NET ]

코드 예제 설정 및 실행에 대한 자세한 내용은 *AWS SDK for .NET 개발자 안내서*의 [AWS SDK for .NET 시작하기](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)를 참조하세요.

```
using System;
using Amazon.S3;
using Amazon.S3.Model;

namespace s3.amazon.com.rproxy.govskope.ca.docsamples
{
    class BucketVersioningConfiguration
    {
        static string bucketName = "*** bucket name ***";

        public static void Main(string[] args)
        {
            using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
            {
                try
                {
                    EnableVersioningOnBucket(client);
                    string bucketVersioningStatus = RetrieveBucketVersioningConfiguration(client);
                }
                catch (AmazonS3Exception amazonS3Exception)
                {
                    if (amazonS3Exception.ErrorCode != null &&
                        (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                        ||
                        amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
                    {
                        Console.WriteLine("Check the provided AWS Credentials.");
                        Console.WriteLine(
                        "To sign up for service, go to http://aws.amazon.com/s3");
                    }
                    else
                    {
                        Console.WriteLine(
                         "Error occurred. Message:'{0}' when listing objects",
                         amazonS3Exception.Message);
                    }
                }
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }

        static void EnableVersioningOnBucket(IAmazonS3 client)
        {

                PutBucketVersioningRequest request = new PutBucketVersioningRequest
                {
                    BucketName = bucketName,
                    VersioningConfig = new S3BucketVersioningConfig 
                    {
                        Status = VersionStatus.Enabled
                    }
                };

                PutBucketVersioningResponse response = client.PutBucketVersioning(request);
        }


        static string RetrieveBucketVersioningConfiguration(IAmazonS3 client)
        {
                GetBucketVersioningRequest request = new GetBucketVersioningRequest
                {
                    BucketName = bucketName
                };
 
                GetBucketVersioningResponse response = client.GetBucketVersioning(request);
                return response.VersioningConfig.Status;
            }
    }
}
```

------
#### [ Java ]

실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 AWS SDK for Java 개발자 안내서에서 [시작하기](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) 섹션을 참조하세요.

```
import java.io.IOException;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.BucketVersioningConfiguration;
import com.amazonaws.services.s3.model.SetBucketVersioningConfigurationRequest;

public class BucketVersioningConfigurationExample {
    public static String bucketName = "*** bucket name ***"; 
    public static AmazonS3Client s3Client;

    public static void main(String[] args) throws IOException {
        s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
        s3Client.setRegion(Region.getRegion(Regions.US_EAST_1));
        try {

            // 1. Enable versioning on the bucket.
        	BucketVersioningConfiguration configuration = 
        			new BucketVersioningConfiguration().withStatus("Enabled");
            
			SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = 
					new SetBucketVersioningConfigurationRequest(bucketName,configuration);
			
			s3Client.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest);
			
			// 2. Get bucket versioning configuration information.
			BucketVersioningConfiguration conf = s3Client.getBucketVersioningConfiguration(bucketName);
			 System.out.println("bucket versioning configuration status:    " + conf.getStatus());

        } catch (AmazonS3Exception amazonS3Exception) {
            System.out.format("An Amazon S3 error occurred. Exception: %s", amazonS3Exception.toString());
        } catch (Exception ex) {
            System.out.format("Exception: %s", ex.toString());
        }        
    }
}
```

------
#### [ Python ]

다음 Python 코드 예제는 Amazon S3 버킷을 생성하고 버전 관리를 위해 이를 사용하며 7일 이후 최신이 아닌 객체 버전을 만료하는 수명 주기를 구성합니다.

```
def create_versioned_bucket(bucket_name, prefix):
    """
    Creates an Amazon S3 bucket, enables it for versioning, and configures a lifecycle
    that expires noncurrent object versions after 7 days.

    Adding a lifecycle configuration to a versioned bucket is a best practice.
    It helps prevent objects in the bucket from accumulating a large number of
    noncurrent versions, which can slow down request performance.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket_name: The name of the bucket to create.
    :param prefix: Identifies which objects are automatically expired under the
                   configured lifecycle rules.
    :return: The newly created bucket.
    """
    try:
        bucket = s3.create_bucket(
            Bucket=bucket_name,
            CreateBucketConfiguration={
                "LocationConstraint": s3.meta.client.meta.region_name
            },
        )
        logger.info("Created bucket %s.", bucket.name)
    except ClientError as error:
        if error.response["Error"]["Code"] == "BucketAlreadyOwnedByYou":
            logger.warning("Bucket %s already exists! Using it.", bucket_name)
            bucket = s3.Bucket(bucket_name)
        else:
            logger.exception("Couldn't create bucket %s.", bucket_name)
            raise

    try:
        bucket.Versioning().enable()
        logger.info("Enabled versioning on bucket %s.", bucket.name)
    except ClientError:
        logger.exception("Couldn't enable versioning on bucket %s.", bucket.name)
        raise

    try:
        expiration = 7
        bucket.LifecycleConfiguration().put(
            LifecycleConfiguration={
                "Rules": [
                    {
                        "Status": "Enabled",
                        "Prefix": prefix,
                        "NoncurrentVersionExpiration": {"NoncurrentDays": expiration},
                    }
                ]
            }
        )
        logger.info(
            "Configured lifecycle to expire noncurrent versions after %s days "
            "on bucket %s.",
            expiration,
            bucket.name,
        )
    except ClientError as error:
        logger.warning(
            "Couldn't configure lifecycle on bucket %s because %s. "
            "Continuing anyway.",
            bucket.name,
            error,
        )

    return bucket
```

------

# MFA Delete 구성
<a name="MultiFactorAuthenticationDelete"></a>

Amazon S3 버킷에서 S3 버전 관리를 사용하는 경우 선택적으로 *MFA(멀티 팩터 인증) Delete*를 사용 설정하도록 버킷을 구성하여 다른 보안 계층을 추가할 수 있습니다. 이렇게 하면 버킷 소유자가 버전을 삭제하거나 버킷의 버전 관리 상태를 변경하는 모든 요청에 두 가지 형식의 인증을 포함해야 합니다.

MFA Delete는 다음 작업에 대해 추가 인증을 요구합니다.
+ 버킷의 버전 관리 상태 변경
+ 객체 버전 영구 삭제

MFA Delete는 다음 두 가지 인증 유형을 모두 요구합니다.
+ 보안 자격 증명
+ 승인된 인증 디바이스에 표시된 유효한 일련 번호, 공백, 6자리 코드 연결

MFA Delete는 예를 들어 보안 자격 증명이 손상된 경우에 대비하여 보안을 강화합니다. MFA Delete는 삭제 작업을 시작하는 사용자에게 MFA 코드를 통해 MFA 디바이스의 물리적 소유를 증명할 것을 요구하고 삭제 작업에 추가 마찰 및 보안 계층을 추가합니다. 따라서 실수로 인한 버킷 삭제를 방지하는 데 도움이 될 수 있습니다.

MFA 삭제가 활성화된 버킷을 식별하려면 Amazon S3 스토리지 렌즈 지표를 사용하면 됩니다. S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. 자세한 내용은 [S3 스토리지 렌즈를 사용한 스토리지 활동 및 사용량 평가](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html)를 참조하십시오. 지표의 전체 목록은 [S3 스토리지 렌즈 지표 용어집](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html)을 참조하십시오.

버킷 소유자, 버킷을 생성한 AWS 계정(루트 계정) 및 승인된 모든 사용자는 버전 관리를 사용할 수 있습니다. 그러나 MFA 삭제는 버킷 소유자(루트 계정)만 사용 설정할 수 있습니다. 자세한 내용은 AWS 보안 블로그에서 [MFA를 사용하여 AWS에 대한 액세스 보안](https://aws.amazon.com/blogs/security/securing-access-to-aws-using-mfa-part-3/)을 참조하세요.

**참고**  
버전 관리에 MFA Delete를 사용하려면 `MFA Delete`를 사용 설정합니다. 그러나 AWS Management Console을 사용하여 `MFA Delete`를 사용할 수 없습니다. AWS Command Line Interface(AWS CLI) 또는 API를 사용해야 합니다.  
버전 관리에서 MFA Delete를 사용하는 예는 주제 [버킷에 버전 관리 사용 설정](manage-versioning-examples.md)의 예제 섹션을 참조하세요.  
수명 주기 구성과 함께 MFA 삭제를 사용할 수 없습니다. 수명 주기 구성 및 수명 주기 구성이 다른 구성과 상호 작용하는 방법에 대한 자세한 내용은 [S3 수명 주기가 다른 버킷 구성과 상호 작용하는 방식](lifecycle-and-other-bucket-config.md) 섹션을 참조하세요.

MFA Delete를 사용 설정 또는 사용 중지하려면 버킷에 대한 버전 관리를 구성하는 데 사용한 것과 동일한 API를 사용합니다. Amazon S3는 버킷의 버전 관리 상태를 저장하는 동일한 *버전 관리* 하위 리소스에 MFA Delete 구성을 저장합니다.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>VersioningState</Status>
  <MfaDelete>MfaDeleteState</MfaDelete>  
</VersioningConfiguration>
```

MFA Delete를 사용하려면 하드웨어 또는 가상 MFA 디바이스 중에 하나를 사용하여 인증 코드를 생성할 수 있습니다. 다음은 생성된 인증 코드가 하드웨어 디바이스에 표시된 것을 보여 주는 예제입니다.

![\[생성된 인증 코드가 하드웨어 디바이스에 표시된 것을 보여 주는 예시.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/MFADevice.png)


MFA Delete 및 MFA 보호 API 액세스는 서로 다른 시나리오에 대한 보호를 제공하기 위해 마련된 기능입니다. 버킷의 데이터가 실수로 삭제되는 것을 방지하려면 버킷에 MFA Delete를 구성합니다. MFA 보호 API 액세스는 민감한 Amazon S3 리소스에 액세스할 때 다른 인증 요소(MFA 코드)를 적용하는 데 사용됩니다. 이 Amazon S3 리소스에 대한 모든 작업은 MFA를 사용하여 생성한 임시 자격 증명으로 수행하도록 요구할 수 있습니다. 관련 예제는 [MFA 필요](example-bucket-policies.md#example-bucket-policies-MFA) 섹션을 참조하세요 

인증 디바이스를 구입하고 활성화하는 방법에 대한 자세한 내용은 [멀티 팩터 인증](https://aws.amazon.com/iam/details/mfa/)을 참조하세요.

## S3 버전 관리를 활성화하고 MFA 삭제를 구성하려면
<a name="enable-versioning-mfa-delete"></a>

### AWS CLI 사용
<a name="enable-versioning-mfa-delete-cli"></a>

일련 번호는 MFA 디바이스를 고유하게 식별하는 번호입니다. 물리적 MFA 디바이스의 경우, 디바이스와 함께 제공되는 고유 일련 번호입니다. 가상 MFA 디바이스의 경우 일련 번호는 디바이스 ARN입니다. 다음 명령을 사용하려면 *user input placeholders*를 실제 정보로 대체합니다.

다음 예에서는 버킷에서 물리적 MFA 디바이스에 대해 S3 버전 관리 및 다중 인증(MFA) 삭제를 활성화합니다. 물리적 MFA 디바이스의 경우 `--mfa` 파라미터에서 MFA 디바이스 일련번호, 공백 문자 및 인증 디바이스에 표시되는 값의 연결을 전달합니다.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

다음 예에서는 버킷에서 가상 MFA 디바이스에 대해 S3 버전 관리 및 다중 인증(MFA) 삭제를 활성화합니다. 가상 MFA 디바이스의 경우 `--mfa` 파라미터에서 MFA 디바이스 ARN, 공백 문자 및 인증 디바이스에 표시되는 값의 연결을 전달합니다.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

자세한 내용은 AWS rePost 문서 [Amazon S3 버킷에 대한 MFA 삭제를 활성화하려면 어떻게 해야 합니까?](https://repost.aws/knowledge-center/s3-bucket-mfa-delete)를 참조하세요.

### REST API 사용
<a name="enable-versioning-mfa-delete-rest-api"></a>

Amazon S3 REST API를 사용하여 MFA 삭제를 지정하는 방법에 대한 자세한 내용은 [PutBucketVersioning](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html) *Amazon Simple Storage Service API 참조*에서 확인하세요.

# 버전 관리가 사용 설정된 버킷의 객체 작업
<a name="manage-objects-versioned-bucket"></a>

버전 관리 상태로 설정하기 전에 Amazon S3 버킷에 저장된 객체의 버전 ID는 `null`이 됩니다. 버전 관리를 사용 설정할 때 버킷의 기존 객체는 변경되지 않습니다. 이후 요청에서는 Amazon S3가 객체를 처리하는 방법만 변경됩니다.

**객체 버전 이전**  
또한 수명 주기가 명확하게 정의된 객체에 대해 수명 주기 구성 규칙을 정의하여 객체 수명의 특정 시점에 S3 Glacier Flexible Retrieval 스토리지 클래스로 객체 버전을 이전할 수 있습니다. 자세한 내용은 [객체 수명 주기 관리](object-lifecycle-mgmt.md) 섹션을 참조하세요.

이 섹션의 주제에서는 버전 관리를 사용하는 버킷의 다양한 객체 작업에 관해 설명합니다. 버전 관리에 대한 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

**Topics**
+ [버전 관리를 사용하는 버킷에 객체 추가](AddingObjectstoVersioningEnabledBuckets.md)
+ [버전 관리를 사용하는 버킷의 객체 목록](list-obj-version-enabled-bucket.md)
+ [버전 관리가 사용 설정된 버킷에서 객체 버전 검색](RetrievingObjectVersions.md)
+ [버전 관리가 사용 설정된 버킷에서 객체 버전 삭제](DeletingObjectVersions.md)
+ [버전 관리되는 객체 사용 권한 구성](VersionedObjectPermissionsandACLs.md)

# 버전 관리를 사용하는 버킷에 객체 추가
<a name="AddingObjectstoVersioningEnabledBuckets"></a>

버킷에 대한 버전 관리를 사용 설정하면 Amazon S3는 고유한 버전 ID를 버킷에 저장된 각 객체에 자동으로 추가합니다(`PUT`, `POST` 또는 `CopyObject` 사용).

다음 그림은 버전 관리를 사용하는 버킷에 객체를 추가할 때 Amazon S3에서 고유한 버전 ID를 객체에 추가하는 것을 보여줍니다.

![\[버전 관리가 활성화된 버킷에 객체가 배치되었을 때 고유한 버전 ID가 객체에 추가되는 것을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled.png)


**참고**  
Amazon S3에서 할당하는 버전 ID 값은 URL로 사용 가능합니다(URI의 일부로 포함할 수 있음).

버전 관리에 대한 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하십시오. 콘솔, AWS SDK 및 REST API를 사용하여 버전 관리가 사용되는 버킷에 객체 버전을 추가할 수 있습니다.

## 콘솔 사용
<a name="add-obj-versioning-enabled-bucket-console"></a>

지침은 [객체 업로드](upload-objects.md) 섹션을 참조하세요.

## AWS SDK 사용
<a name="add-obj-versioning-enabled-bucket-sdk"></a>

AWS SDK for Java/.NET/PHP를 사용한 객체 업로드 예제는 [객체 업로드](upload-objects.md) 섹션을 참조하세요. 버전 관리 미사용 버킷과 버전 관리를 사용하는 버킷에 객체를 업로드하는 것의 예제는 동일하며, 버전 관리를 사용하는 버킷인 경우라도 Amazon S3에서는 버전 번호를 할당합니다. 그렇지 않은 경우 버전 번호는 null이 됩니다.

다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

## REST API 사용
<a name="add-obj-versioning-enabled-bucket-rest"></a>

**버전 관리가 사용 설정된 버킷에 객체 추가**

1. `PutBucketVersioning` 요청을 사용하여 버킷의 버전 관리를 사용 설정합니다.

   자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html)를 참조하세요.

1. `PUT`, `POST` 또는 `CopyObject` 요청을 보내 버킷에 객체를 저장합니다.

버전 관리가 사용 설정된 버킷에 객체를 추가할 경우, Amazon S3는 다음 예와 같이 객체의 버전 ID를 `x-amz-version-id` 응답 헤더로 반환합니다.

```
1. x-amz-version-id: 3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY
```

# 버전 관리를 사용하는 버킷의 객체 목록
<a name="list-obj-version-enabled-bucket"></a>

이 섹션에서는 버전 관리를 사용하는 버킷의 객체 버전을 나열하는 예제를 제공합니다. Amazon S3에서는 객체 버전 정보를 버킷에 연결된 *versions* 하위 리소스에 저장합니다. 자세한 내용은 [범용 버킷 구성 옵션](UsingBucket.md#bucket-config-options-intro) 섹션을 참조하세요. 버전 관리가 활성화된 버킷의 객체를 나열하려면 `ListBucketVersions` 권한이 필요합니다.

## S3 콘솔 사용
<a name="view-object-versions"></a>

다음 단계에 따라 Amazon S3 콘솔을 사용하여 객체의 여러 버전을 확인합니다.

**객체의 여러 버전 보기**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷(Buckets)** 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

1. 버킷에 있는 객체 버전 목록을 확인하려면 **버전 표시** 스위치를 선택합니다.

   각 객체 버전에 대해 콘솔에 고유한 버전 ID, 객체 버전이 생성된 날짜/시간 및 기타 속성이 표시됩니다. (버전 관리 상태로 설정하기 전에 버킷에 저장된 객체의 버전 ID는 **null**이 됩니다.)

   해당 버전이 없는 객체를 나열하려면 **버전 나열(List versions)** 스위치를 선택합니다.

또한, 콘솔의 객체 개요 패널에서도 객체 버전을 보고, 다운로드하며, 삭제할 수 있습니다. 자세한 내용은 [Amazon S3 콘솔에서 객체 속성 보기](view-object-properties.md) 섹션을 참조하세요.

**참고**  
 300개 버전 이전의 객체 버전에 액세스하려면 AWS CLI 또는 객체의 URL을 사용해야 합니다.

**중요**  
객체는 최신 버전으로 삭제한 경우에만 삭제를 취소할 수 있습니다. 삭제했던 객체의 이전 버전은 삭제를 취소할 수 없습니다. 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

## AWS SDK 사용
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

이 섹션의 예제에서는 버전 관리를 사용하는 버킷에서 객체 목록을 가져오는 방법을 보여줍니다. 더 낮은 개수를 지정했더라도 각 요청에서는 최대 1,000개의 버전을 반환합니다. 버킷에 이 제한보다 더 많은 버전이 포함되어 있는 경우 일련의 요청을 보내 모든 버전 목록을 가져옵니다. "페이지"에 표시되는 이러한 결과 반환 프로세스를 *페이지 매김*이라고 합니다.

페이지 매김 작동 방식을 설명하기 위해 예제에서는 각 응답을 두 가지 객체 버전으로 제한합니다. 결과의 첫 페이지를 가져온 후 각 예제에서는 버전 목록이 잘렸는지 여부를 확인합니다. 잘린 경우 계속해서 모든 버전을 가져올 때까지 페이지를 가져옵니다.

**참고**  
다음 예제 역시 버전 관리를 사용하지 않는 버킷이나 개별 버전이 없는 객체를 사용합니다. 이러한 경우 Amazon S3는 `null`의 버전 ID를 사용하여 객체 목록을 반환합니다.

 다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ Java ]

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 AWS SDK for Java 개발자 안내서의 [시작하기](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) 섹션을 참조하세요.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

코드 예제 설정 및 실행에 대한 자세한 내용은 *AWS SDK for .NET 개발자 안내서*의 [AWS SDK for .NET 시작하기](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)를 참조하세요.

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## REST API 사용
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example - 버킷의 모든 객체 버전 나열**  
버킷에 있는 전체 객체의 버전을 모두 나열하려면 `versions` 요청에 `GET Bucket` 하위 리소스를 사용합니다. Amazon S3에서는 최대 1,000개의 객체를 검색할 수 있으며, 각 객체 버전은 각각 하나의 객체로 온전히 취급됩니다. 따라서 버킷에 두 개의 키(예: `photo.gif` 및 `picture.jpg`)가 포함되어 있고 첫 번째 키에 990개의 버전이, 두 번째 키에 400개의 버전이 있는 경우, 단일 요청으로는 `photo.gif`의 990개 버전 모드를 가져오고 `picture.jpg`의 최신 버전 10개만 가져오게 됩니다.  
Amazon S3에서는 객체 버전을 객체가 저장된 순서대로 가장 최근에 저장된 것을 먼저 반환합니다.  
`GET Bucket` 요청에 `versions` 하위 리소스를 포함합니다.  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example - 키의 전체 버전 검색**  
 객체 버전의 하위 집합을 가져오려면 `GET Bucket`에 요청 파라미터를 사용합니다. [자세한 내용은 GET Bucket 단원을 참조하세요.](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)  

1. `prefix` 파라미터를 검색하려는 객체의 키로 설정합니다.

1. `GET Bucket` 하위 리소스 및 `versions`를 사용하여 `prefix` 요청을 보냅니다.

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example - 접두사를 사용하여 객체 검색**  
다음 예제에서는 키가 `myObject`이거나 이렇게 시작하는 객체를 가져옵니다.  

```
1. GET /?versions&prefix=myObject HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```
기타 요청 파라미터를 사용하여 전체 객체 버전의 하위 집합을 가져올 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)를 참조하세요.

**Example - 응답이 잘린 경우 추가 객체의 목록 검색**  
`GET` 요청에서 반환될 수 있는 객체 수가 `max-keys` 값을 초과한 경우, 응답에는 `<isTruncated>true</isTruncated>`가 포함되며 요청을 충족하지만 반환되지 않은 첫 번째 키와 첫 번째 버전 ID를 각각 `NextKeyMarker`와 `NextVersionIdMarker`에 포함시킵니다. 그러한 반환된 값을 후속 요청의 시작 지점으로 사용하여 `GET` 요청을 충족하는 추가 객체를 가져옵니다.  
다음 프로세스를 사용하여 버킷에서 `GET Bucket versions` 요청을 충족하는 추가 객체를 가져옵니다. `key-marker`, `version-id-marker`, `NextKeyMarker` 및 `NextVersionIdMarker`에 대한 자세한 내용은 *Amazon Simple Storage Service API 참조*의 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)을 참조하세요.  
다음은 원래 `GET` 요청을 충족하는 추가 응답입니다.  
+ `key-marker`의 값을 이전 응답의 `NextKeyMarker`에서 반환된 키로 설정합니다.
+ `version-id-marker`의 값을 이전 응답의 `NextVersionIdMarker`에서 반환된 버전 ID로 설정합니다.
+ `GET Bucket versions` 및 `key-marker`를 사용하여 `version-id-marker` 요청을 보냅니다.

**Example - 지정된 키 및 버전 ID로 시작하는 객체 검색**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

## AWS CLI 사용
<a name="list-obj-version-enabled-bucket-cli"></a>

다음 명령은 버킷에 있는 객체의 모든 버전에 대한 메타데이터를 반환합니다.

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

`list-object-versions`에 대한 자세한 정보는 **AWS CLI 명령 참조의 [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html) 섹션을 참조하세요.

# 버전 관리가 사용 설정된 버킷에서 객체 버전 검색
<a name="RetrievingObjectVersions"></a>

Amazon S3에서의 버전 관리는 객체의 여러 변형을 동일한 버킷에 보관하는 방법입니다. 단순한 `GET` 요청은 현재 버전의 객체를 가져옵니다. 다음 그림은 `GET` 요청에서 현재 버전의 객체인 `photo.gif`를 반환하는 과정을 보여 줍니다.

![\[GET이 현재 버전의 객체를 반환하는 방법을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_GET_NoVersionID.png)


특정 버전을 가져오려면 해당 버전 ID를 지정해야 합니다. 다음 그림은 `GET versionId` 요청에서 특정 버전의 객체(현재 버전이 아니어도 됨)를 가져오는 과정을 보여 줍니다.

![\[GET versionId 요청이 지정된 객체의 버전을 검색하는 방법을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_GET_Versioned.png)


콘솔, AWS SDK 또는 REST API를 사용하여 Amazon S3의 객체 버전을 검색할 수 있습니다.

**참고**  
 300개 버전 이전의 객체 버전에 액세스하려면 AWS CLI 또는 객체의 URL을 사용해야 합니다.

## S3 콘솔 사용
<a name="retrieving-object-versions"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷** 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

1. **객체** 목록에서 객체의 이름을 선택합니다.

1. **버전**을 선택합니다.

   Amazon S3가 객체의 모든 버전을 표시합니다.

1. 검색할 버전의 [**버전 ID(Version ID)**] 옆에 있는 확인란을 선택합니다.

1. [**작업(Actions)**]을 선택하고 [**다운로드(Download)**]를 선택한 다음 객체를 저장합니다.

또한 객체 개요 패널에서 객체 버전의 보기, 다운로드 및 삭제도 가능합니다. 자세한 내용은 [Amazon S3 콘솔에서 객체 속성 보기](view-object-properties.md) 섹션을 참조하세요.

**중요**  
객체는 최신 버전으로 삭제한 경우에만 삭제를 취소할 수 있습니다. 삭제했던 객체의 이전 버전은 삭제를 취소할 수 없습니다. 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

## AWS SDK 사용
<a name="retrieve-obj-version-sdks"></a>

버전 관리가 사용되지 않는 버킷과 버전 관리가 사용 설정된 버킷의 객체를 업로드하는 예는 동일합니다. 그러나 버전 관리가 사용 설정된 버킷의 경우 Amazon S3는 버전 번호를 할당합니다. 그렇지 않은 경우 버전 번호는 null이 됩니다.

AWS SDK for Java/.NET/PHP를 사용하여 객체를 다운로드하는 예제는 [객체 다운로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)를 참조하세요.

.NET 및 Rust용 AWS SDK를 사용하여 객체 버전을 나열하는 예시는 [Amazon S3 버킷의 객체 버전 나열](https://docs.aws.amazon.com/code-library/latest/ug/s3_example_s3_ListObjectVersions_section.html)을 참조하세요.

## REST API 사용
<a name="retrieve-obj-version-rest"></a>

**특정 객체 버전 가져오기**

1. `versionId`를 검색하려는 객체의 버전 ID로 설정합니다.

1. `GET Object versionId` 요청을 보냅니다.

**Example - 버전이 지정된 객체 검색**  
다음 요청은 `L4kqtJlcpXroDTDmpUMLUo`의 `my-image.jpg` 버전을 검색합니다.  

```
1. GET /my-image.jpg?versionId=L4kqtJlcpXroDTDmpUMLUo HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

콘텐츠가 아니라 객체의 메타데이터만 검색할 수 있습니다. 자세한 정보는 [객체 버전의 메타데이터 가져오기](RetMetaOfObjVersion.md) 섹션을 참조하세요.

이전 객체 버전 복원에 대한 자세한 내용은 [이전 버전 복원](RestoringPreviousVersions.md) 섹션을 참조하세요.

# 객체 버전의 메타데이터 가져오기
<a name="RetMetaOfObjVersion"></a>

객체의 메타데이터만 가져오고 해당 콘텐츠는 가져오지 않으려는 경우 `HEAD` 작업을 사용합니다. 기본적으로 가장 최근 버전의 메타데이터를 가져옵니다. 특정 객체 버전의 메타데이터를 가져오려면 해당 버전 ID를 지정해야 합니다.

**객체 버전의 메타데이터 가져오기**

1. 메타데이터를 가져오려는 객체의 버전 ID에 `versionId`를 설정합니다.

1. `HEAD Object versionId` 요청을 보냅니다.

**Example - 버전이 지정된 객체의 메타데이터 검색**  
다음 요청은 `my-image.jpg`의 `3HL4kqCxf3vjVBH40Nrjfkd` 버전 메타데이터를 가져옵니다.  

```
1. HEAD /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

다음은 샘플 응답을 보여 줍니다.

```
 1. HTTP/1.1 200 OK
 2. x-amz-id-2: ef8yU9AS1ed4OpIszj7UDNEHGran
 3. x-amz-request-id: 318BC8BC143432E5
 4. x-amz-version-id: 3HL4kqtJlcpXroDTDmjVBH40Nrjfkd
 5. Date: Wed, 28 Oct 2009 22:32:00 GMT
 6. Last-Modified: Sun, 1 Jan 2006 12:00:00 GMT
 7. ETag: "fba9dede5f27731c9771645a39863328"
 8. Content-Length: 434234
 9. Content-Type: text/plain
10. Connection: close
11. Server: AmazonS3
```

# 이전 버전 복원
<a name="RestoringPreviousVersions"></a>

버전 관리를 사용하여 객체의 이전 버전을 검색할 수 있습니다. 이를 수행하기 위한 접근 방식으로 다음 두 가지가 있습니다.
+ 이전 버전의 객체를 동일한 버킷으로 복사합니다.

  복사된 객체는 해당 객체의 현재 버전이 되고 모든 객체 버전은 유지됩니다.
+ 객체의 현재 버전 영구 삭제

  현재 객체 버전을 삭제하는 것은 실제로 해당 객체의 이전 버전을 현재 버전으로 만드는 것과 같습니다.

전체 객체 버전이 유지되므로 특정 버전의 객체를 동일 버킷에 복사하여 현재 버전보다 이전의 버전을 만들 수 있습니다. 다음 그림에서 원본 객체(ID = 111111)는 동일한 버킷에 복사됩니다. Amazon S3에서는 새 ID(88778877)를 제공하며 이것이 객체의 현재 버전이 됩니다. 따라서 버킷에는 원래 객체 버전(111111)과 그 사본(88778877)이 모두 들어 있습니다. 이전 버전을 가져온 후 업로드하여 최신 버전으로 만드는 방법에 대한 자세한 내용은 [versioning-enabled 버킷에서 객체 버전 검색](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RetrievingObjectVersions.html) 및 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)를 참조하세요.

![\[객체의 특정 버전을 동일한 버킷에 복사하여 최신 버전으로 만드는 것을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_COPY2.png)


후속 `GET`에서는 88778877을 검색합니다.

다음 그림은 현재 객체로 이전 버전(111111)을 남겨 둔 채로 객체의 현재 버전(121212)을 삭제하는 과정을 보여줍니다. 객체 삭제에 대한 자세한 내용은 [단일 객체 삭제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-objects.html)를 참조하세요.

![\[객체의 현재 버전을 삭제하면 이전 버전이 현재 객체가 된다는 것을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_COPY_delete2.png)


후속 `GET`에서는 111111을 검색합니다.

**참고**  
객체 버전을 일괄적으로 복원하려면 [`CopyObject` 작업](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-copy-object.html)을 사용할 수 있습니다. `CopyObject` 작업은 매니페스트에 지정된 각 객체를 복사합니다. 그러나 객체가 매니페스트에 나타나는 것과 반드시 동일한 순서로 복사되는 것은 아니라는 점을 유의하세요. 버전이 지정된 버킷에서 최신/이전 버전 순서를 유지하는 것이 중요한 경우 모든 이전 버전을 먼저 복사해야 합니다. 그런 다음 첫 번째 작업이 완료된 후 후속 작업에서 현재 버전을 복사합니다.

## 이전 객체 버전 복원
<a name="restoring-obj-version-version-enabled-bucket-examples"></a>

삭제된 객체 복원에 대한 자세한 지침은 AWS re:Post 지식 센터의 [버전 관리가 활성화된 버킷에서 삭제된 Amazon S3 객체를 검색하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/s3-undelete-configuration)를 참조하세요.

### S3 콘솔 사용
<a name="retrieving-object-versions"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷** 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

1. **객체** 목록에서 객체의 이름을 선택합니다.

1. **버전**을 선택합니다.

   Amazon S3가 객체의 모든 버전을 표시합니다.

1. 검색할 버전의 [**버전 ID(Version ID)**] 옆에 있는 확인란을 선택합니다.

1. [**작업(Actions)**]을 선택하고 [**다운로드(Download)**]를 선택한 다음 객체를 저장합니다.

또한 객체 개요 패널에서 객체 버전의 보기, 다운로드 및 삭제도 가능합니다. 자세한 내용은 [Amazon S3 콘솔에서 객체 속성 보기](view-object-properties.md) 섹션을 참조하세요.

**중요**  
객체는 최신 버전으로 삭제한 경우에만 삭제를 취소할 수 있습니다. 삭제했던 객체의 이전 버전은 삭제를 취소할 수 없습니다. 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하세요.

### AWS SDK 사용
<a name="restoring-obj-version-version-enabled-bucket-sdks"></a>

다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ Python ]

다음 Python 코드 예제에서는 지정된 롤백 버전 이후에 발생한 모든 버전을 삭제하여 버전이 지정된 객체의 이전 버전을 복원합니다.

```
def rollback_object(bucket, object_key, version_id):
    """
    Rolls back an object to an earlier version by deleting all versions that
    occurred after the specified rollback version.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that holds the object to roll back.
    :param object_key: The object to roll back.
    :param version_id: The version ID to roll back to.
    """
    # Versions must be sorted by last_modified date because delete markers are
    # at the end of the list even when they are interspersed in time.
    versions = sorted(
        bucket.object_versions.filter(Prefix=object_key),
        key=attrgetter("last_modified"),
        reverse=True,
    )

    logger.debug(
        "Got versions:\n%s",
        "\n".join(
            [
                f"\t{version.version_id}, last modified {version.last_modified}"
                for version in versions
            ]
        ),
    )

    if version_id in [ver.version_id for ver in versions]:
        print(f"Rolling back to version {version_id}")
        for version in versions:
            if version.version_id != version_id:
                version.delete()
                print(f"Deleted version {version.version_id}")
            else:
                break

        print(f"Active version is now {bucket.Object(object_key).version_id}")
    else:
        raise KeyError(
            f"{version_id} was not found in the list of versions for " f"{object_key}."
        )
```

------

# 버전 관리가 사용 설정된 버킷에서 객체 버전 삭제
<a name="DeletingObjectVersions"></a>

언제든지 Amazon S3 버킷에서 객체 버전을 삭제할 수 있습니다. 또한 수명 주기가 명확하게 정의된 객체에 대해 수명 주기 구성 규칙을 정의하여 Amazon S3에 현재 객체 버전을 만료시키거나 최신이 아닌 객체 버전을 영구적으로 제거하도록 요청할 수도 있습니다. 버킷에서 버전 관리가 활성화 또는 일시 중지된 경우 수명 주기 구성 작업은 다음과 같이 작동합니다.
+ `Expiration` 작업은 현재 객체 버전에 적용됩니다. 현재 객체 버전을 삭제하는 대신 Amazon S3에서는 나중에 현재 버전이 되는 *삭제 마커*를 추가하여 현재 버전을 최신이 아닌 버전으로 유지합니다.
+ `NoncurrentVersionExpiration` 작업이 최신이 아닌 객체 버전에 적용되고 Amazon S3에서는 이러한 객체 버전을 영구적으로 제거합니다. 영구적으로 제거된 객체는 복구할 수 없습니다.

S3 수명 주기에 대한 자세한 내용은 [객체 수명 주기 관리](object-lifecycle-mgmt.md) 및 [S3 수명 주기 구성의 예제](lifecycle-configuration-examples.md) 섹션을 참조하세요.

버킷에 있는 최신 및 비최신 객체 버전의 수를 확인하려면 Amazon S3 스토리지 렌즈 지표를 사용하면 됩니다. S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. 자세한 내용은 [Amazon S3 스토리지 렌즈를 사용한 스토리지 비용 최적화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-optimize-storage.html?icmpid=docs_s3_user_guide_DeletingObjectVersions.html)를 참조하세요. 지표의 전체 목록은 [S3 스토리지 렌즈 지표 용어집](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html)을 참조하세요.

**참고**  
 최신이 아닌 객체 버전을 포함하여 저장되거나 전송된 객체의 모든 버전에는 일반 Amazon S3 요금이 적용됩니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하세요.

## Delete 요청 사용 사례
<a name="delete-request-use-cases"></a>

`DELETE` 요청의 사용 사례는 다음과 같습니다.
+ 버전 관리가 사용 설정된 경우, 단순 `DELETE` 요청은 객체를 영구적으로 삭제하지 않습니다. (단순 `DELETE` 요청은 버전 ID를 지정하지 않는 요청입니다.) 그 대신 Amazon S3는 삭제 마커를 버킷에 삽입하고 해당 마커는 새로운 ID를 가진 객체의 현재 버전이 됩니다.

  현재 버전이 삭제 마커인 객체에 대해 `GET`을 시도하는 경우, Amazon S3는 객체가 삭제된 것처럼 동작하여 404 오류를 반환합니다. 자세한 내용은 [삭제 마커를 통한 작업](DeleteMarker.md) 섹션을 참조하세요.

  다음 그림은 단순한 `DELETE` 요청이 지정된 객체를 실제로 제거하지 않음을 보여 줍니다. 대신 Amazon S3에서 삭제 마커를 삽입합니다.  
![\[삭제 마커 삽입을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)
+ 버전 관리되는 객체를 영구적으로 삭제하려면 `DELETE Object versionId`를 사용해야 합니다.

  다음 그림은 지정된 객체 버전을 삭제하면 해당 객체가 영구적으로 제거됨을 보여 줍니다.  
![\[DELETE Object versionId가 특정 객체 버전을 영구적으로 삭제하는 방법을 보여 주는 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)

## 객체 버전 삭제
<a name="delete-object-version"></a>

콘솔, AWS SDK, REST API 또는 AWS Command Line Interface를 사용하여 Amazon S3에서 객체 버전을 삭제할 수 있습니다.

### S3 콘솔 사용
<a name="deleting-object-versions"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷** 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

1. **객체** 목록에서 객체의 이름을 선택합니다.

1. **버전**을 선택합니다.

   Amazon S3가 객체의 모든 버전을 표시합니다.

1. 영구적으로 삭제할 버전의 **버전 ID(Version ID)** 옆에 있는 확인란을 선택합니다.

1. **삭제**를 선택합니다.

1. [**객체를 영구적으로 삭제하시겠습니까?(Permanently delete objects?)**]에 **permanently delete**를 입력합니다.
**주의**  
객체 버전을 영구적으로 삭제하면 작업을 실행 취소할 수 없습니다.

1. **객체 삭제**를 선택합니다.

   Amazon S3가 객체 버전을 삭제합니다.

### AWS SDK 사용
<a name="delete-obj-version-version-enabled-bucket-sdks"></a>

AWS SDK for Java/.NET/PHP를 사용하여 객체를 삭제하는 예제는 [Amazon S3 객체 삭제](DeletingObjects.md) 섹션을 참조하세요. 버전 관리가 사용되지 않는 버킷과 버전 관리가 사용 설정된 버킷의 객체를 삭제하는 예는 동일합니다. 그러나 버전 관리가 사용 설정된 버킷의 경우 Amazon S3는 버전 번호를 할당합니다. 그렇지 않은 경우 버전 번호는 null이 됩니다.

다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ Python ]

다음 Python 코드 예제에서는 모든 버전을 삭제하여 버전이 지정된 객체를 영구적으로 삭제합니다.

```
def permanently_delete_object(bucket, object_key):
    """
    Permanently deletes a versioned object by deleting all of its versions.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to delete.
    """
    try:
        bucket.object_versions.filter(Prefix=object_key).delete()
        logger.info("Permanently deleted all versions of object %s.", object_key)
    except ClientError:
        logger.exception("Couldn't delete all versions of %s.", object_key)
        raise
```

------

### REST API 사용
<a name="delete-obj-version-enabled-bucket-rest"></a>

**특정 버전의 객체 삭제**
+ `DELETE`에서 버전 ID를 지정합니다.

**Example - 특정 버전 삭제**  
다음 예제에서는 `UIORUnfnd89493jJFJ`의 `photo.gif` 버전을 삭제합니다.  

```
1. DELETE /photo.gif?versionId=UIORUnfnd89493jJFJ HTTP/1.1 
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 12 Oct 2009 17:50:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
5. Content-Type: text/plain
6. Content-Length: 0
```

### AWS CLI 사용
<a name="delete-obj-version-enabled-bucket-cli"></a>

다음 명령은 이름이 `amzn-s3-demo-bucket1`인 버킷에서 test.txt라는 객체를 삭제합니다. 객체의 지정된 버전을 제거하려면 버킷 소유자여야 하고 버전 Id 하위 리소스를 사용해야 합니다.

```
aws s3api delete-object --bucket amzn-s3-demo-bucket1 --key test.txt --version-id versionID
```

`delete-object`에 대한 자세한 정보는 **AWS CLI 명령 참조의 [https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) 섹션을 참조하세요.

객체 버전 삭제에 대한 자세한 내용은 아래 주제를 참조하세요.
+ [삭제 마커를 통한 작업](DeleteMarker.md)
+ [이전 버전을 현재 버전으로 만들기 위해 삭제 마커 제거](ManagingDelMarkers.md#RemDelMarker)
+ [MFA Delete 사용 설정 버킷에서 객체 삭제](UsingMFADelete.md)

# 삭제 마커를 통한 작업
<a name="DeleteMarker"></a>

Amazon S3의 **삭제 마커는 단순 `DELETE` 요청에 지정된 버전이 지정된 객체에 대한 자리 표시자(또는 마커)입니다. 단순 `DELETE` 요청은 버전 ID를 지정하지 않는 요청입니다. 객체가 버전 관리를 사용하는 버킷에 있기 때문에 이 객체는 삭제되지 않습니다. 그러나 삭제 마커를 사용하면 Amazon S3가 객체가 삭제된 것처럼 작동합니다. 삭제 마커에 Amazon S3 API `DELETE` 호출을 사용할 수 있습니다. 이렇게 하려면 적절한 권한이 있는 AWS Identity and Access Management (IAM) 사용자 또는 역할을 활용하여 `DELETE` 요청을 수행해야 합니다.

삭제 마커에는 다른 객체들과 마찬가지로 **키 이름(또는 **키)과 버전 ID가 있습니다. 그러나 삭제 마커는 다음과 같은 부분에서 다른 객체와는 다릅니다.
+ 삭제 마커에 연결된 데이터가 없습니다.
+ 삭제 마커는 액세스 제어 목록(ACL) 값과 연결되어 있지 않습니다.
+ 삭제 마커에 대한 `GET` 요청을 실행하면 삭제 마커에 데이터가 없기 때문에 `GET` 요청에서 아무 것도 검색하지 않습니다. 특히 `GET` 요청에 `versionId`가 지정되지 않은 경우 404(찾을 수 없음) 오류가 발생합니다.

삭제 마커는 Amazon S3의 스토리지에 대해 최소 요금을 발생시킵니다. 삭제 마커의 스토리지 크기는 삭제 마커의 키 이름 크기와 같습니다. 키 이름은 유니코드 문자열입니다. 키 이름에 대한 UTF-8 인코딩은 1\$14바이트의 스토리지에서 이름의 각 문자별 버킷으로 추가됩니다. 삭제 마커는 S3 Standard 스토리지 클래스에 저장됩니다.

보유하고 있는 삭제 마커의 수와 마커가 어떤 스토리지 클래스에 저장되어 있는지 확인하려면 Amazon S3 Storage Lens를 사용하면 됩니다. 자세한 내용은 [Amazon S3 Storage Lens를 사용하여 스토리지 활동 및 사용량 모니터링](storage_lens.md) 및 [Amazon S3 스토리지 렌즈 지표 용어집](storage_lens_metrics_glossary.md)(을)를 참조하세요.

키 이름에 대한 자세한 내용은 [Amazon S3 객체 이름 지정](object-keys.md) 섹션을 참조하세요. 삭제 마커에 대한 자세한 내용은 [삭제 마커 관리](ManagingDelMarkers.md) 섹션을 참조하세요.

Amazon S3에서만 삭제 마커를 생성할 수 있으며, 버전 관리가 사용 설정되었거나 일시 중지된 버킷의 객체에 대해 사용자가 `DeleteObject` 요청을 전송할 경우에만 삭제 마커를 생성합니다. `DELETE` 요청에 지정된 객체는 실제로 삭제되지 않습니다. 그 대신, 삭제 마커가 객체의 현재 버전이 됩니다. 객체의 키 이름(또는 키)은 삭제 마커의 키가 됩니다.

요청에 `versionId`를 지정하지 않고 객체를 가져올 때, 현재 버전이 삭제 마커인 경우 Amazon S3는 다음과 같이 응답합니다:
+ 404 (찾을 수 없음) 오류
+ 응답 헤더, `x-amz-delete-marker: true` 

요청에 `versionId`를 지정하여 객체를 가져올 때, 지정된 버전이 삭제 마커인 경우 Amazon S3는 다음과 같이 응답합니다.
+ 405(메서드 허용 안 됨) 오류
+ 응답 헤더, `x-amz-delete-marker: true` 
+ 응답 헤더, `Last-Modified: timestamp`([HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) 또는 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) API 작업을 사용하는 경우에만)

`x-amz-delete-marker: true` 응답 헤더는 액세스한 객체가 삭제 마커였음을 보고합니다. 값이 `false`이면 객체의 현재 버전 또는 지정된 버전이 삭제 마커가 아니므로 이 응답 헤더는 `false`를 반환하지 않습니다.

`Last-Modified` 응답 헤더는 삭제 마커의 생성 시간을 제공합니다.

다음 그림은 현재 버전이 삭제 마커인 객체에 대한 `GetObject` API 호출이 404(찾을 수 없음) 오류로 응답하고 응답 헤더에 `x-amz-delete-marker: true`가 포함된 경우를 보여 줍니다.

![\[404(찾을 수 없음) 오류를 반환하는 삭제 마커에 대한 GetObject 호출을 보여주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


요청에 `versionId`를 지정하여 객체에 대한 `GetObject` 호출을 수행하고 지정된 버전이 삭제 마커인 경우 Amazon S3는 405(메서드 허용 안 됨) 오류로 응답하고 응답 헤더에 `x-amz-delete-marker: true` 및 `Last-Modified: timestamp`를 포함합니다.

![\[405(메서드 허용 안 됨) 오류를 반환하는 삭제 마커에 대한 GetObject 직접 호출을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound_405.png)


덮어쓰더라도 삭제 마커는 객체 버전에 남아 있습니다. 삭제 마커 목록(객체의 다른 버전 포함)을 표시하는 유일한 방법은 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html) 요청을 사용하는 것입니다. 범용 버킷에 객체를 나열하고 **버전 표시를** 선택하여 AWS Management Console에서 이 요청을 할 수 있습니다. 자세한 내용은 [버전 관리를 사용하는 버킷의 객체 목록](list-obj-version-enabled-bucket.md) 섹션을 참조하세요.

다음 그림은 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 또는 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) 요청이 현재 버전이 삭제 마커인 객체를 반환하지 않음을 보여줍니다.

![\[ListObjectsV2 또는 ListObjects 직접 호출이 삭제 마커를 반환하지 않는 것을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_GETBucketwithDeleteMarkers.png)


# 삭제 마커 관리
<a name="ManagingDelMarkers"></a>

## 만료된 삭제 마커를 자동으로 정리하는 수명 주기 구성
<a name="LifecycleDelMarker"></a>

만료된 객체 삭제 마커는 모든 객체 버전이 삭제되고 하나의 삭제 마커만 남은 마커입니다. 수명 주기 구성이 현재 버전을 삭제하도록 설정되어 있거나 `ExpiredObjectDeleteMarker` 작업이 명시적으로 설정된 경우 Amazon S3는 만료된 객체의 삭제 마커를 제거합니다. 관련 예제는 [버전 관리를 사용하는 버킷에서 만료된 객체 삭제 마커 제거](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7) 섹션을 참조하세요 

## 이전 버전을 현재 버전으로 만들기 위해 삭제 마커 제거
<a name="RemDelMarker"></a>

버전 관리가 사용 설정된 버킷에서 한 객체를 삭제하면 모든 버전이 버킷에 그대로 유지되며 Amazon S3는 해당 객체에 대한 삭제 마커를 생성합니다. 객체 삭제를 취소하려면 이 삭제 마커를 삭제해야 합니다. 버전 관리와 삭제 마커에 대한 자세한 정보는 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md)을 참조하세요.

삭제 마커를 영구적으로 삭제하려면 `DeleteObject versionId` 요청에 삭제 마커의 버전 ID를 포함해야 합니다. 다음 그림은 `DeleteObject versionId` 요청이 어떻게 삭제 마커를 영구적으로 제거하는지를 보여 줍니다.

![\[버전 ID를 사용한 삭제 마커 삭제를 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


삭제 마커 제거의 영향으로 단순 `GET` 요청은 이제 현재 버전 ID(121212)의 객체를 가져옵니다.

**참고**  
현재 버전이 삭제 마커인 `DeleteObject` 요청을 사용하는 경우(삭제 마커의 버전 ID 지정 없이) Amazon S3은 삭제 마커를 삭제하지 않고 그 대신 다른 삭제 마커를 넣습니다(`PUTs`).

`NULL` 버전 ID를 사용해 삭제 마커를 삭제하려면 `DeleteObject` 요청에서 버전 ID로 `NULL`을 전달해야 합니다. 다음 그림은 버전 ID 없이 이루어진 단순 `DeleteObject` 요청(현재 버전이 삭제 마커임)으로 아무것도 제거되지 않고, 그 대신 고유한 버전 ID(7498372)의 추가적인 삭제 마커가 추가되는 과정을 보여주고 있습니다.

![\[NULL 버전 ID를 사용한 삭제 마커 삭제를 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## S3 콘솔 사용
<a name="undelete-objects"></a>

다음 단계를 사용하여 S3 버킷의 폴더가 아닌 S3 버킷에서 삭제된 객체(해당 폴더 내에 있는 객체 포함)를 복원할 수 있습니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷(Buckets)** 목록에서 원하는 버킷의 이름을 선택합니다.

1. 버킷에 있는 객체 **버전** 목록을 확인하려면 [**버전 나열(List versions)**] 스위치를 선택합니다. 삭제된 객체들에 대한 삭제 마커를 볼 수 있습니다.

   

1. 어떤 객체의 삭제를 취소하려면 삭제 마커를 삭제해야 합니다. 복원할 객체의 **삭제 마커** 옆에 있는 확인란을 선택한 후, **삭제(Delete)**를 선택합니다.

1. **객체 삭제(Delete objects)** 페이지에서 삭제를 확인합니다.

   1. **Permanently delete objects?(객체를 영구적으로 삭제하시겠습니까?)**에 **permanently delete**를 입력합니다.

   1. **객체 삭제(Delete objects)**를 선택합니다.

**참고**  
Amazon S3 콘솔을 사용하여 폴더의 삭제를 취소할 수 없습니다. AWS CLI 또는 SDK를 사용해야 합니다. 예를 들어 AWS 지식 센터에서 [버전 관리 지원 버킷에서 삭제된 Amazon S3 객체를 검색하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/s3-undelete-configuration/)를 참조하세요.

## REST API 사용
<a name="delete-marker-rest-api"></a>

**영구적으로 삭제 마커 제거**

1. `versionId`를 제거하려는 삭제 마커의 버전 ID에 설정합니다.

1. `DELETE Object versionId` 요청을 보냅니다.

**Example - 삭제 마커 제거**  
다음 예제에서는 `photo.gif` 버전 4857693에 대한 삭제 마커를 제거합니다.  

```
1. DELETE /photo.gif?versionId=4857693 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

삭제 마커를 삭제하는 경우 Amazon S3에서는 응답에 다음을 포함합니다.

```
1. 204 NoContent 
2. x-amz-version-id: versionID 
3. x-amz-delete-marker: true
```

## AWS SDK 사용
<a name="remove-delete-marker-examples-sdk"></a>

다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ Python ]

다음 Python 코드 예제에서는 객체에서 삭제 마커를 제거하여 현재 버전이 아닌 최신 버전을 객체의 현재 버전으로 만드는 방법을 보여 줍니다.

```
def revive_object(bucket, object_key):
    """
    Revives a versioned object that was deleted by removing the object's active
    delete marker.
    A versioned object presents as deleted when its latest version is a delete marker.
    By removing the delete marker, we make the previous version the latest version
    and the object then presents as *not* deleted.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to revive.
    """
    # Get the latest version for the object.
    response = s3.meta.client.list_object_versions(
        Bucket=bucket.name, Prefix=object_key, MaxKeys=1
    )

    if "DeleteMarkers" in response:
        latest_version = response["DeleteMarkers"][0]
        if latest_version["IsLatest"]:
            logger.info(
                "Object %s was indeed deleted on %s. Let's revive it.",
                object_key,
                latest_version["LastModified"],
            )
            obj = bucket.Object(object_key)
            obj.Version(latest_version["VersionId"]).delete()
            logger.info(
                "Revived %s, active version is now %s  with body '%s'",
                object_key,
                obj.version_id,
                obj.get()["Body"].read(),
            )
        else:
            logger.warning(
                "Delete marker is not the latest version for %s!", object_key
            )
    elif "Versions" in response:
        logger.warning("Got an active version for %s, nothing to do.", object_key)
    else:
        logger.error("Couldn't get any version info for %s.", object_key)
```

------

# MFA Delete 사용 설정 버킷에서 객체 삭제
<a name="UsingMFADelete"></a>

MFA 삭제를 구성하면 루트 사용자만 객체 버전을 영구적으로 삭제하거나 S3 버킷의 버전 관리 구성을 변경할 수 있습니다. 삭제 작업을 수행하려면 MFA 디바이스를 사용하여 루트 사용자를 인증해야 합니다.

버킷의 버전 관리 구성에 MFA Delete가 사용 설정된 경우, 버킷 소유자는 요청에 `x-amz-mfa` 요청 헤더를 포함하여 객체 버전을 영구적으로 삭제하거나 버킷의 버전 관리 상태를 변경해야 합니다. `x-amz-mfa`를 포함하는 요청은 HTTPS를 사용해야 합니다.

헤더의 값은 인증 디바이스의 일련 번호, 공백, 여기에 표시된 인증 코드가 연속된 값입니다. 이 요청 헤더를 포함하지 않으면 요청이 실패합니다.

AWS CLI를 사용하는 경우 `mfa` 파라미터의 값과 동일한 정보를 포함합니다.

인증 디바이스에 대한 자세한 내용은 [멀티 팩터 인증](https://aws.amazon.com/iam/details/mfa/)을 참조하세요.

MFA Delete 사용 설정에 대한 자세한 내용은 [MFA Delete 구성](MultiFactorAuthenticationDelete.md) 섹션을 참조하세요.

**참고**  
MFA 삭제가 활성화된 버전 관리 활성화 버킷의 객체는 AWS Management Console을 통해 삭제할 수 없습니다.

## AWS CLI 사용
<a name="MFADeleteCLI"></a>

MFA 삭제가 활성화된 버전 관리 활성화 버킷의 객체를 삭제하려면 다음 명령을 사용합니다. 다음 예시 명령을 사용할 때는 `user input placeholders`를 실제 정보로 바꾸세요.

```
 aws s3api delete-object --bucket amzn-s3-demo-bucket --key OBJECT-KEY --version-id "VERSION ID" --mfa "MFA_DEVICE_SERIAL_NUMBER MFA_DEVICE_CODE"						
```

## REST API 사용
<a name="MFADeleteAPI"></a>

다음 예제에서는 MFA Delete가 사용 설정된 버킷에서 지정된 버전의 `my-image.jpg`를 삭제합니다.

자세한 내용은 Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html) 섹션을 참조하세요.

```
1. DELETE /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTPS/1.1
2. Host: bucketName.s3.amazonaws.com
3. x-amz-mfa: 20899872 301749
4. Date: Wed, 28 Oct 2009 22:32:00 GMT
5. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

# 버전 관리되는 객체 사용 권한 구성
<a name="VersionedObjectPermissionsandACLs"></a>

Amazon S3의 객체에 대한 권한은 버전 수준에서 설정됩니다. 각 버전에는 고유한 객체 소유자가 있습니다. 객체 버전을 생성하는 AWS 계정이 소유자입니다. 따라서 동일 객체의 서로 다른 버전에 대해 서로 다른 권한을 설정할 수 있습니다. 이렇게 하려면 `PUT Object versionId acl` 요청에 권한을 설정하려는 객체의 버전 ID를 지정해야 합니다. ACL 사용과 관련한 자세한 설명과 지침은 [Amazon S3의 ID 및 액세스 관리](security-iam.md) 섹션을 참조하세요.

**Example - 객체 버전에 대한 권한 설정**  
다음 요청은 정식 사용자 ID가 *b4bf1b36f9716f094c3079dcf5ac9982d4f2847de46204d47448bc557fb5ac2a*인 피부여자의 권한을 키 `my-image.jpg`, 버전 ID, `3HL4kqtJvjVBH40Nrjfkd`에 대해 `FULL_CONTROL`로 설정합니다.  

```
 1. PUT /my-image.jpg?acl&versionId=3HL4kqtJvjVBH40Nrjfkd HTTP/1.1
 2. Host: bucket.s3.amazonaws.com
 3. Date: Wed, 28 Oct 2009 22:32:00 GMT
 4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
 5. Content-Length: 124
 6.  
 7. <AccessControlPolicy>
 8.   <Owner>
 9.     <ID>75cc57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
10.   </Owner>
11.   <AccessControlList>
12.     <Grant>
13.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
14.         <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
15.       </Grantee>
16.       <Permission>FULL_CONTROL</Permission>
17.     </Grant>
18.   </AccessControlList>
19.   </AccessControlPolicy>
```

마찬가지로 특정 객체 버전의 권한을 얻으려면 `GET Object versionId acl` 요청에 객체의 버전 ID를 지정해야 합니다. 기본적으로 `GET Object acl`에서는 현재 버전 객체의 권한을 반환하므로 버전 ID를 포함해야 합니다.

**Example - 지정한 객체 버전에 대한 권한 검색**  
다음 예시에서 Amazon S3는 키 `my-image.jpg`, 버전 ID `DVBH40Nr8X8gUMLUo`에 대한 권한을 반환합니다.  

```
1. GET /my-image.jpg?versionId=DVBH40Nr8X8gUMLUo&acl HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU
```

자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html)를 참조하세요.

# 버전 관리가 일시 중지된 버킷의 객체 작업
<a name="VersionSuspendedBehavior"></a>

Amazon S3에서 버킷 내 동일 객체의 새 버전이 발생하지 않도록 버전 관리를 일시 중지할 수 있습니다. 버킷에 단일 버전의 객체만 필요한 경우 이 작업을 수행할 수 있습니다. 또는 여러 버전에 대한 요금이 부과되는 것을 원하지 않을 경우에도 이 작업을 수행할 수 있습니다.

버전 관리를 일시 중지할 때 버킷의 기존 객체는 변경되지 않습니다. 이후 요청에서는 Amazon S3가 객체를 처리하는 방법만 변경됩니다. 이 섹션의 주제에서는 버전 관리가 일시 중지된 버킷의 다양한 객체 작업(예: 객체 추가, 검색 및 삭제)에 관해 설명합니다.

S3 버전 관리에 대한 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하십시오. 객체 버전 가져오기에 대한 자세한 내용은 [버전 관리가 사용 설정된 버킷에서 객체 버전 검색](RetrievingObjectVersions.md) 섹션을 참조하세요.

**Topics**
+ [버전 관리가 일시 중지된 버킷에 객체 추가](AddingObjectstoVersionSuspendedBuckets.md)
+ [버전 관리가 일시 중지된 버킷에서 객체 가져오기](RetrievingObjectsfromVersioningSuspendedBuckets.md)
+ [버전 관리가 일시 중지된 버킷에서 객체 삭제](DeletingObjectsfromVersioningSuspendedBuckets.md)

# 버전 관리가 일시 중지된 버킷에 객체 추가
<a name="AddingObjectstoVersionSuspendedBuckets"></a>

Amazon S3에서 버전 관리가 일시 중지된 버킷에 객체를 추가하여 버전 ID가 null인 객체를 만들거나, 일치하는 버전 ID로 객체 버전을 덮어쓸 수 있습니다.

버킷에 대한 버전 관리를 일시 중지하면 Amazon S3에서는 버전 ID `null`을 해당 버킷에 이후로 저장되는 후속 객체 각각에 자동으로 추가합니다(`PUT`, `POST` 또는 `CopyObject` 사용).

다음 그림은 버전 관리가 일시 중지된 버킷에 객체를 추가할 때 Amazon S3에서 버전 ID `null`을 객체에 추가하는 과정을 보여줍니다.

![\[Amazon S3가 객체에 null의 버전 ID를 추가하는 그래픽.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended.png)


null 버전이 버킷에 이미 있는 경우 다른 객체를 같은 키로 추가하면 추가된 객체는 원래 null 버전을 덮어씁니다.

버전이 지정된 객체가 버킷에 있는 경우, `PUT`을 수행한 버전은 객체의 현재 버전이 됩니다. 다음 그림은 버전이 지정된 객체가 포함된 버킷에 객체를 추가해도 버킷에 이미 있던 객체는 덮어쓰지 않음을 보여 줍니다.

이 경우, 버전 111111은 버킷에 원래 존재했습니다. Amazon S3에서는 추가되는 객체에 null 버전 ID를 연결하고 이를 버킷에 저장합니다. 따라서 이는 버전 111111을 덮어쓰지 않습니다.

![\[Amazon S3가 버전 111111을 덮어쓰지 않고 객체에 null의 버전 ID를 추가하는 그래픽.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended3.png)


null 버전이 버킷에 이미 존재하는 경우, 다음 그림과 같이 이 null 버전을 덮어쓰게 됩니다.

![\[Amazon S3가 원본 콘텐츠를 덮어쓰면서 객체에 null의 버전 ID를 추가하는 그래픽.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended4.png)


Null 버전의 키 및 버전 ID(`null`)가 `PUT` 수행 이전과 이후에 서로 같더라도, 버킷에 원래 저장되어 있던 Null 버전의 콘텐츠는 버킷에 `PUT`을 수행한 객체의 콘텐츠로 대체됩니다.

# 버전 관리가 일시 중지된 버킷에서 객체 가져오기
<a name="RetrievingObjectsfromVersioningSuspendedBuckets"></a>

`GET Object` 요청은 버킷에 대해 버전 관리를 사용 설정했는지 여부와 관계없이 현재 버전의 객체를 반환합니다. 다음 그림은 단순 `GET` 요청에서 현재 버전의 객체를 반환하는 과정을 보여 줍니다.

![\[단순 GET이 현재 버전의 객체를 반환하는 방법을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_GET_suspended.png)


# 버전 관리가 일시 중지된 버킷에서 객체 삭제
<a name="DeletingObjectsfromVersioningSuspendedBuckets"></a>

버전 관리가 일시 정지된 버킷에서 객체를 삭제하여 null 버전 ID를 가진 객체를 제거할 수 있습니다.

버킷에 대해 버전 관리가 일시 중지된 경우 `DELETE` 요청은 다음과 같습니다.
+ 버전 ID가 `null`인 객체만 제거할 수 있습니다.
+ 버킷에 null 버전의 객체가 없는 경우 어떤 것도 제거하지 않습니다.
+ 버킷에 삭제 마커를 삽입합니다.

버킷 버전 관리가 일시 중단된 경우 작업은 null `versionId`가 있는 객체를 제거합니다. 버전 ID가 있는 경우 Amazon S3는 객체의 현재 버전이 되는 삭제 마커를 삽입합니다. 다음 그림은 단순 `DELETE`가 null 버전을 제거하고 Amazon S3가 대신 `null` 버전 ID와 함께 삭제 마커를 삽입하는 과정을 보여줍니다.

![\[NULL 버전 ID를 가진 객체를 제거하는 단순 삭제를 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspended.png)


`versionId`가 있는 객체를 영구 삭제하려면 요청에 해당 객체 `versionId`를 포함해야 합니다. 삭제 마커에는 콘텐츠가 포함되어 있지 않으므로, 삭제 마커로 대체될 때 `null` 버전의 콘텐츠가 손실됩니다.

다음 그림은 null 버전이 없는 버킷을 보여 줍니다. 이 경우 `DELETE`는 아무것도 제거하지 않습니다. 대신 Amazon S3에서 삭제 마커를 삽입합니다.

![\[삭제 마커 삽입을 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspendedNoNull.png)


버전 관리가 일시 정지된 버킷에서도 버킷 소유자는 `DELETE` 요청에 대한 권한이 명시적으로 거부되기 전까지 `DELETE` 요청에 버전 ID를 포함하여 특정 버전을 영구적으로 삭제할 수 있습니다. 예를 들어 `null` 버전 ID가 있는 객체의 삭제를 거부하려면 `s3:DeleteObject` 및 `s3:DeleteObjectVersions` 권한을 명시적으로 거부해야 합니다.

다음 그림은 지정된 객체 버전을 삭제하면 해당 객체의 버전이 영구적으로 제거됨을 보여 줍니다. 버킷 소유자만이 지정된 객체 버전을 삭제할 수 있습니다.

![\[지정된 버전 ID를 사용한 영구 객체 삭제를 보여 주는 그림.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


# 버전 관리 문제 해결
<a name="troubleshooting-versioning"></a>

다음 주제는 몇 가지 일반적인 Amazon S3 버전 관리 문제를 해결하는 데 도움이 될 수 있습니다.

**Topics**
+ [버전 관리를 활성화한 버킷에서 실수로 삭제된 객체를 복구하려고 합니다.](#recover-objects)
+ [버전이 지정된 객체를 영구적으로 삭제하고 싶습니다.](#delete-objects-permanent)
+ [버킷 버전 관리를 활성화한 후 성능 저하가 발생했습니다.](#performance-degradation)

## 버전 관리를 활성화한 버킷에서 실수로 삭제된 객체를 복구하려고 합니다.
<a name="recover-objects"></a>

일반적으로 S3 버킷에서 객체 버전이 삭제되면 Amazon S3에서 복구할 방법이 없습니다. 하지만 S3 버킷에 S3 버전 관리를 활성화한 경우 버전 ID를 지정하지 않는 `DELETE` 요청은 객체를 영구적으로 삭제할 수 없습니다. 대신 삭제 마커가 자리 표시자로 추가됩니다. 이 삭제 마커가 객체의 최신 버전이 됩니다.

삭제된 객체가 영구적으로 삭제되었는지 아니면 일시적으로 삭제되었는지(삭제 마커로 대체됨) 확인하려면 다음을 수행하세요.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

1. **객체** 목록에서 검색 창 오른쪽에 있는 **버전 표시** 토글을 켠 다음 검색 창에서 삭제된 객체를 검색합니다. 이 토글은 이전에 버킷에 버전 관리를 활성화한 경우에만 사용할 수 있습니다.

   [S3 인벤토리를 사용하여 삭제된 객체를 검색](storage-inventory.md#storage-inventory-contents)할 수도 있습니다.

1. **버전 표시** 토글을 켜거나 인벤토리 보고서를 만든 후에도 객체를 찾을 수 없고 객체의 [삭제 마커](DeleteMarker.md)도 찾을 수 없는 경우 영구적으로 삭제된 것이며 객체를 복구할 수 없습니다.



AWS Command Line Interface(AWS CLI)의 `HeadObject` API 작업을 사용하여 삭제된 객체의 상태를 확인할 수도 있습니다. 이 방법을 사용하려면 다음 `head-object` 명령을 사용하되 `user input placeholders`를 실제 정보로 대체하세요.

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html`

현재 버전이 삭제 마커인 버전이 지정된 객체에 대한 `head-object` 명령을 실행하는 경우 404 찾을 수 없음 오류가 발생합니다. 예제: 

HeadObject 작업을 호출할 때 오류(404 찾을 수 없음)가 발생했습니다

버전이 지정된 객체에서 `head-object` 명령을 실행하고 객체의 버전 ID를 제공하면 Amazon S3는 객체의 메타데이터를 검색하여 객체가 여전히 존재하며 영구적으로 삭제되지 않았음을 확인합니다.

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

```
{
"AcceptRanges": "bytes",
"ContentType": "text/html",
"LastModified": "Thu, 16 Apr 2015 18:19:14 GMT",
"ContentLength": 77,
"VersionId": "Zg5HyL7m.eZU9iM7AVlJkrqAiE.0UG4q",
"ETag": "\"30a6ec7e1a9ad79c203d05a589c8b400\"",
"Metadata": {}
}
```

객체가 검색되고 최신 버전이 삭제 마커인 경우 객체의 이전 버전이 여전히 존재합니다. 삭제 마커가 객체의 현재 버전이므로 삭제 마커를 삭제하여 객체를 복구할 수 있습니다.

삭제 마커를 영구적으로 제거하면 바로 이전 버전의 객체가 객체의 현재 버전이 되어 객체를 다시 사용할 수 있게 됩니다. 객체 복구 방법을 시각적으로 확인하려면 [삭제 마커 제거](ManagingDelMarkers.md#RemDelMarker)를 참조하세요.

객체의 지정된 버전을 제거하려면 사용자가 버킷 소유자여야 합니다. 삭제 마커를 영구적으로 삭제하려면 `DeleteObject` 요청에 삭제 마커의 버전 ID를 포함해야 합니다. 이 방법을 사용하려면 다음 명령을 사용하되 `user input placeholders`를 실제 정보로 대체하세요.

****  
`aws s3api delete-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

`delete-object` 명령에 대한 자세한 내용은 **AWS CLI 명령 참조의 [https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html) 섹션을 참조하세요. 삭제 마커 영구 삭제에 대한 자세한 내용은 [삭제 마커 관리](ManagingDelMarkers.md) 섹션을 참조하세요.

## 버전이 지정된 객체를 영구적으로 삭제하고 싶습니다.
<a name="delete-objects-permanent"></a>

버전 관리를 사용하는 버킷에서 버전 ID가 없는 `DELETE` 요청은 객체를 영구적으로 삭제할 수 없습니다. 대신 이러한 요청은 삭제 마커를 삽입합니다.

버전이 지정된 객체를 영구적으로 삭제하려면 다음 방법 중에서 선택할 수 있습니다.
+ S3 수명 주기 규칙을 생성하여 비최신 버전을 영구적으로 삭제합니다. 비최신 버전을 영구적으로 삭제하려면 **객체의 비최신 버전 영구 삭제**를 선택하고 **다음 일수 이후 객체가 오래된 것으로 간주됨**에 숫자를 입력합니다. **Number of newer versions to retain**(유지할 새 버전 수) 아래에 값을 입력하여 유지할 최신 버전 수를 선택적으로 지정할 수 있습니다. 이 규칙을 생성하는 방법에 대한 자세한 내용은 [S3 수명 주기 구성 설정](how-to-set-lifecycle-configuration-intro.md)을 참조하세요.
+ `DELETE` 요청에 버전 ID를 포함하여 지정된 버전을 삭제합니다. 자세한 내용은 [버전 지정된 객체를 영구적으로 삭제하는 방법](DeletingObjectVersions.md#delete-request-use-cases)을 참조하세요.
+ 현재 버전을 만료시키는 수명 주기 규칙을 생성합니다. 객체의 현재 버전을 만료시키려면 **객체의 현재 버전 만료**를 선택한 후 **객체 생성 후 일수**에 숫자를 입력합니다. 이 수명 주기 규칙을 생성하는 방법에 대한 자세한 내용은 [S3 수명 주기 구성 설정](how-to-set-lifecycle-configuration-intro.md)을 참조하세요.
+ 버전이 지정된 모든 객체를 영구적으로 삭제하고 마커를 삭제하려면 두 개의 수명 주기 규칙을 만드세요. 하나는 현재 버전을 만료시키고 객체의 비최신 버전을 영구적으로 삭제하는 것이고 다른 하나는 만료된 객체 삭제 마커를 삭제하는 것입니다.

버전 관리를 사용하는 버킷에서 버전 ID를 지정하지 않은 `DELETE` 요청은 버전 ID가 `NULL`인 객체만 제거할 수 있습니다. 버전 관리가 활성화된 상태에서 객체를 업로드한 경우 버전 ID를 지정하지 않은 `DELETE` 요청은 해당 객체의 삭제 마커를 생성합니다.

**참고**  
S3 객체 잠금이 활성화된 버킷의 경우 보호된 객체 버전 ID가 있는 `DELETE` 객체 요청은 403 액세스 거부 오류를 일으킵니다. 버전 ID가 없는 `DELETE` 객체 요청은 200 확인 응답과 함께 객체의 최신 버전으로 삭제 마커를 추가합니다. 객체 잠금으로 보호되는 객체는 보존 기간 및 법적 보존이 제거될 때까지 영구적으로 삭제할 수 없습니다. 자세한 내용은 [S3 객체 잠금 작동 방식](object-lock.md#object-lock-overview) 섹션을 참조하세요.

## 버킷 버전 관리를 활성화한 후 성능 저하가 발생했습니다.
<a name="performance-degradation"></a>

삭제 마커나 버전이 지정된 객체가 너무 많고 모범 사례를 따르지 않을 경우 버전 관리를 사용하는 버킷에서 성능 저하가 발생할 수 있습니다.

**삭제 마커가 너무 많음**  
버킷에 버전 관리를 활성화한 후 버전 ID가 없이 객체에 수행된 `DELETE` 요청은 고유한 버전 ID를 가진 삭제 마커를 생성합니다. **객체의 현재 버전 만료**만료 규칙이 포함된 수명 주기 구성은 모든 객체에 고유한 버전 ID가 있는 삭제 마커를 추가합니다. 삭제 마커가 너무 많으면 버킷의 성능이 저하될 수 있습니다.

버전 관리가 중단된 버킷의 경우 Amazon S3는 새로 생성된 객체에 버전 ID를 `NULL`로 표시합니다. 버전 관리가 일시 중지된 버킷에서는 만료 작업으로 인해 Amazon S3가 버전 ID가 `NULL`인 삭제 마커를 생성합니다. 버전 관리가 일시 중단된 버킷에서는 모든 삭제 요청에 대해 `NULL` 삭제 마커가 생성됩니다. 모든 객체 버전이 삭제되고 하나의 삭제 마커만 남은 경우 이러한 `NULL` 삭제 마커는 만료된 객체 삭제 마커라고도 합니다. `NULL` 삭제 마커가 너무 많이 누적되면 버킷의 성능이 저하됩니다.

**버전이 지정된 객체가 너무 많음**  
버전 관리를 사용하는 버킷에 수백만 개의 버전이 있는 객체가 포함된 경우 503 서비스 사용 불가 오류가 증가할 수 있습니다. S3 버전 관리를 사용하는 버킷에 대한 `PUT` 또는 `DELETE` 객체 요청에서 받은 HTTP 503 서비스 사용 불가 응답의 횟수가 크게 증가한다면 버전이 수백만 개인 객체가 하나 이상의 버킷에 있을 것으로 추정됩니다. 객체에 수백만 개의 버전이 있을 경우 Amazon S3는 자동으로 해당 버킷에 대한 요청을 제한합니다. 요청을 제한하면 과도한 횟수의 요청 트래픽으로부터 버킷이 보호되어 같은 버킷에 대한 다른 요청을 지연시킬 가능성이 있습니다.

수백만 개의 버전이 있는 S3 객체를 파악하려면 S3 인벤토리 도구를 사용하세요. S3 인벤토리는 버킷에 있는 객체의 플랫 파일 목록을 제공하는 보고서를 생성합니다. 자세한 내용은 [S3 Inventory를 사용한 데이터 카탈로그화 및 분석](storage-inventory.md) 섹션을 참조하세요.

버킷에 버전이 지정된 객체 수가 많은지 확인하려면 S3 스토리지 렌즈 지표를 사용하여 **현재 버전 객체 수**, **최신이 아닌 버전 객체 수** 및 **삭제 마커 객체 수**를 확인하세요. 스토리지 렌즈 지표에 대한 자세한 내용은 [Amazon S3 스토리지 렌즈 지표 용어집](storage_lens_metrics_glossary.md) 섹션을 참조하세요.

Amazon S3 팀은 같은 객체를 반복적으로 덮어써서 해당 객체에 수백만 개 버전이 생성될 가능성이 있는 애플리케이션을 조사할 것을 권장합니다. 조사를 통해 애플리케이션이 의도한 대로 작동하는지 판단할 수 있습니다. 예를 들어, 1주일 동안 1분마다 같은 객체를 덮어쓰는 애플리케이션은 1만 개 이상의 버전을 만들 수 있습니다. 각 객체에 대해 10만 개 미만의 버전을 저장하는 것이 좋습니다. 하나 이상의 객체에 수백만 개 버전이 필요한 사용 사례가 있는 경우, AWS Support 팀에 문의하여 보다 나은 솔루션을 찾는 데 도움을 받으세요.

**모범 사례**  
버전 관리 관련 성능 저하 문제를 방지하려면 다음과 같은 모범 사례를 사용하는 것이 좋습니다.
+ 객체의 이전 버전을 만료시키는 수명 주기 규칙을 활성화합니다. 예를 들어, 객체가 이전 버전이 된 지 30일이 지나면 비최신 버전을 만료시키는 수명 주기 규칙을 만들 수 있습니다. 모든 버전을 삭제하지 않고 싶다면 비최신 버전 여러 개를 보존할 수도 있습니다. 자세한 내용은 [S3 수명 주기 구성 설정](how-to-set-lifecycle-configuration-intro.md)을 참조하세요.
+ 버킷에 관련된 데이터 객체가 없는 경우 만료된 객체 삭제 마커를 삭제하는 수명 주기 규칙을 활성화합니다. 자세한 내용은 [만료된 객체 삭제 마커 제거](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)를 참조하세요.

추가 Amazon S3 성능 최적화 모범 사례는 [모범 사례 설계 패턴](optimizing-performance.md)을 참조하세요.