

# 버킷에 버전 관리 사용 설정
<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.goskope.com.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
```

------