버킷에서 버전 관리 활성화

버킷에서 버전 관리 활성화 (Enabling versioning on buckets)

S3 버전 관리를 사용해 하나의 버킷에 객체의 여러 버전을 유지할 수 있어요. 이 섹션은 콘솔, REST API, AWS SDK 및 AWS Command Line Interface(AWS CLI)를 사용해 버킷에서 버전 관리를 활성화하는 방법의 예시를 제공해요.

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

S3 버전 관리에 대한 자세한 내용은 S3 버전 관리로 객체의 여러 버전 유지를 참고하세요. 버전 관리 활성화 버킷의 객체 작업에 대한 자세한 내용은 버전 관리 활성화 버킷의 객체 작성을 참고하세요. S3 버전 관리를 사용해 데이터를 보호하는 방법에 대해 더 알아보려면 튜토리얼: S3 버전 관리, S3 Object Lock 및 S3 Replication을 사용해 실수 삭제 또는 애플리케이션 버그로부터 Amazon S3 데이터 보호를 참고하세요.

생성하는 모든 S3 버킷에는 연결된 versioning 하위 리소스가 있어요. (자세한 내용은 일반 용도 버킷 구성 옵션을 참고하세요.) 기본적으로 버킷은 비버전 관리 상태이며, versioning 하위 리소스는 다음과 같이 빈 버전 관리 구성을 저장해요.

<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의 Identity and Access Management를 참고하세요.

다음 섹션은 콘솔, AWS CLI 및 AWS SDK를 사용해 S3 버전 관리를 활성화하는 방법에 대한 자세한 내용을 제공해요.

본문

S3 일반 용도 버킷에서 버전 관리 활성화 또는 비활성화

AWS Management Console을 사용해 S3 버킷에서 버전 관리를 활성화하려면 다음 단계를 따라요.

  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/s3/ 에서 Amazon S3 콘솔을 열어요.
  2. 왼쪽 탐색 창에서 General purpose buckets를 선택해요.
  3. 버킷 목록에서 버전 관리를 활성화할 버킷의 이름을 선택해요.
  4. Properties를 선택해요.
  5. Bucket Versioning 아래에서 Edit를 선택해요.
  6. Suspend 또는 Enable을 선택한 다음 Save changes를 선택해요.

참고 버전 관리와 함께 AWS 다단계 인증(MFA)을 사용할 수 있어요. 버전 관리와 함께 MFA를 사용하면 객체 버전을 영구 삭제하거나 버전 관리를 일시 중단·재활성화하려면 AWS 계정의 액세스 키와 계정 MFA 디바이스의 유효한 코드를 제공해야 해요. 버전 관리와 함께 MFA를 사용하려면 MFA Delete를 활성화해요. 그러나 AWS Management Console로는 MFA Delete를 활성화할 수 없어요. AWS Command Line Interface(AWS CLI) 또는 API를 사용해야 해요. 자세한 내용은 MFA 삭제 구성을 참고하세요.

다음 예시는 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 삭제를 사용하려면 승인된 물리적 또는 가상 인증 디바이스가 필요해요. Amazon S3에서 MFA 삭제 사용에 대한 자세한 내용은 MFA 삭제 구성을 참고하세요.

AWS CLI를 사용해 버전 관리를 활성화하는 방법에 대한 자세한 내용은 AWS CLI Command Reference의 put-bucket-versioning을 참고하세요.

다음 예시는 AWS SDK for Java와 AWS SDK for .NET을 사용해 버킷에서 버전 관리를 활성화한 다음 버전 관리 상태를 검색해요. 다른 AWS SDK 사용에 대한 자세한 내용은 AWS Developer Center를 참고하세요.

.NET

코드 예시를 설정하고 실행하는 방법에 대한 자세한 내용은 AWS SDK for .NET Developer Guide의 Getting Started with the AWS SDK for .NET을 참고하세요.

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

namespace s3.amazon.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 Developer Guide의 Getting Started를 참고하세요.

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

출처: 문서

더 알아보기