Thursday, July 20, 2023

AWS S3 객체 자동 삭제: 수명 주기 규칙으로 비용과 데이터 관리 최적화

클라우드 환경에서 데이터를 저장하는 가장 보편적인 방법 중 하나는 Amazon S3(Simple Storage Service)를 사용하는 것입니다. S3는 뛰어난 내구성, 확장성, 가용성을 자랑하지만, 데이터가 기하급수적으로 증가함에 따라 스토리지 비용과 관리의 복잡성 또한 함께 증가합니다. 매일 쌓이는 로그 파일, 임시 데이터, 오래된 백업 등은 시간이 지나면서 불필요한 비용을 발생시키고 중요한 데이터를 찾는 것을 어렵게 만듭니다. 이러한 문제를 해결하기 위한 가장 강력하고 효율적인 기능이 바로 AWS S3 수명 주기(Lifecycle) 관리입니다.

S3 수명 주기 관리는 사용자가 정의한 규칙에 따라 객체를 자동으로 다른 스토리지 클래스로 이동시키거나 영구적으로 삭제하는 기능입니다. 이를 통해 수동 개입 없이 스토리지 비용을 최적화하고, 데이터 보존 정책을 준수하며, 전반적인 데이터 관리 효율성을 극대화할 수 있습니다. 이 글에서는 S3 객체 자동 삭제를 포함한 수명 주기 관리의 핵심 개념부터 실제 설정 방법, 그리고 고급 활용 전략까지 심도 있게 다룹니다.

S3 수명 주기 관리의 핵심 개념 이해하기

본격적인 설정에 앞서, 수명 주기 규칙을 구성하는 핵심 요소들을 이해하는 것이 중요합니다. 수명 주기 규칙은 "어떤 객체를(Filter)", "언제(Timing)", "어떻게 처리할 것인가(Action)"라는 세 가지 질문에 대한 답으로 이루어집니다.

  • 수명 주기 규칙(Lifecycle Rule): 하나 이상의 필터와 액션을 포함하는 정책의 단위입니다. 하나의 버킷에 여러 개의 규칙을 적용할 수 있습니다.
  • 필터(Filter): 규칙을 적용할 객체의 범위를 지정합니다. 필터링 방법은 다음과 같습니다.
    • 접두사(Prefix): 특정 폴더(예: logs/)나 파일명 시작 부분(예: temp-)을 기준으로 객체를 선택합니다.
    • 객체 태그(Object Tags): 객체에 할당된 키-값 쌍(예: status: temporary)을 기준으로 규칙을 적용합니다. 여러 태그를 조합하여 복잡한 조건을 만들 수도 있습니다.
    • 객체 크기(Object Size): 지정된 크기보다 크거나 작은 객체에 규칙을 적용할 수 있습니다. (최소 128KB)
    • 참고: 필터를 지정하지 않으면 버킷 내 모든 객체에 규칙이 적용됩니다.
  • 작업(Action): 필터 조건에 맞는 객체에 수행할 작업을 정의합니다.
    • 전환(Transition): 객체를 비용이 더 저렴한 스토리지 클래스로 이동시킵니다. 예를 들어, 생성 후 30일이 지난 데이터는 S3 Standard-IA로, 90일이 지나면 S3 Glacier Flexible Retrieval로 이동시킬 수 있습니다.
    • 만료(Expiration): 객체를 영구적으로 삭제합니다. 이것이 바로 '객체 자동 삭제' 기능의 핵심입니다.

이러한 요소들을 조합하여 "logs/ 폴더에 있는 .log 파일 중 생성된 지 180일이 지난 파일은 자동으로 삭제한다"와 같은 구체적인 정책을 만들 수 있습니다.

1. AWS Management Console을 이용한 시각적 설정 방법

가장 직관적이고 쉽게 수명 주기 규칙을 설정하는 방법은 AWS Management Console을 사용하는 것입니다. 그래픽 사용자 인터페이스(GUI)를 통해 몇 번의 클릭만으로 규칙을 생성하고 관리할 수 있습니다.

Step 1: S3 버킷으로 이동 및 수명 주기 규칙 생성

  1. AWS Management Console에 로그인한 후, 서비스 검색창에서 'S3'를 검색하여 S3 대시보드로 이동합니다.
  2. 수명 주기 규칙을 적용할 버킷의 이름을 클릭하여 버킷 세부 정보 페이지로 들어갑니다.
  3. '관리(Management)' 탭을 선택하고, '수명 주기 규칙(Lifecycle rules)' 섹션에서 '수명 주기 규칙 생성(Create lifecycle rule)' 버튼을 클릭합니다.

Step 2: 규칙 이름 및 범위 지정

  • 규칙 이름(Rule name): 규칙을 쉽게 식별할 수 있는 이름을 입력합니다. (예: log-files-auto-delete-180days)
  • 규칙 범위 선택(Choose a rule scope):
    • 하나 이상의 필터를 사용하여 이 규칙의 범위 제한(Limit the scope of this rule using one or more filters): 접두사, 객체 태그, 객체 크기를 조합하여 특정 객체 그룹에만 규칙을 적용합니다. 대부분의 경우 이 옵션을 사용하여 의도치 않은 데이터 삭제를 방지하는 것이 안전합니다.
    • 버킷의 모든 객체에 적용(Apply to all objects in the bucket): 버킷 전체에 규칙을 적용합니다. 매우 신중하게 사용해야 합니다.
  • 규칙 범위에 대한 경고를 읽고 확인란에 체크합니다.

Step 3: 수명 주기 작업 정의

여기서 객체를 전환할지, 만료시킬지를 결정합니다. 자동 삭제가 목적이므로 '객체의 현재 버전 만료(Expire current versions of objects)'에 초점을 맞춥니다.

  1. '수명 주기 규칙 작업(Lifecycle rule actions)' 섹션에서 원하는 작업의 확인란을 선택합니다.
    • 객체의 현재 버전 만료(Expire current versions of objects): 이 옵션을 선택하면 지정된 기간이 지난 객체가 삭제됩니다.
    • 만료되지 않은 삭제 마커 또는 완료되지 않은 멀티파트 업로드 삭제(Delete expired object delete markers or incomplete multipart uploads): 비용 누수를 막기 위해 반드시 활성화하는 것을 권장합니다.
  2. '객체의 현재 버전 만료'를 선택했다면, '객체 생성 후 경과 일수(Number of days after object creation)' 필드에 원하는 일수(예: 30)를 입력합니다. 이는 객체가 업로드된 시점으로부터 30일이 지나면 삭제된다는 의미입니다.

Step 4: 규칙 검토 및 생성

설정한 모든 내용을 마지막으로 검토합니다. 규칙 이름, 범위, 작업, 기간이 모두 올바른지 확인한 후 '규칙 생성(Create rule)' 버튼을 클릭하면 설정이 완료됩니다. S3는 일반적으로 24~48시간 이내에 새로운 규칙을 적용하고, 매일 한 번씩 규칙을 실행하여 조건에 맞는 객체를 처리합니다.

2. AWS CLI를 활용한 자동화 및 고급 설정

AWS CLI(Command Line Interface)를 사용하면 스크립트를 통해 수명 주기 규칙을 프로그래밍 방식으로 관리할 수 있습니다. 이는 여러 버킷에 동일한 규칙을 적용하거나, CI/CD 파이프라인에 통합하여 인프라를 코드로 관리(IaC)할 때 매우 유용합니다.

Step 1: AWS CLI 설치 및 구성

먼저 로컬 컴퓨터에 AWS CLI가 설치되고, IAM 사용자의 Access Key와 Secret Key로 구성되어 있어야 합니다. 공식 문서를 참고하여 설치 및 구성을 완료하세요.

# AWS CLI 설치 확인
aws --version

# AWS CLI 구성 (Access Key, Secret Key, Region 등 입력)
aws configure

Step 2: 수명 주기 구성 파일(JSON) 작성

CLI를 사용하려면 수명 주기 규칙을 JSON 형식의 파일로 정의해야 합니다. 텍스트 편집기를 열고 lifecycle-policy.json과 같은 이름으로 파일을 생성합니다. 아래는 30일 후 객체를 Standard-IA로 전환하고, 365일 후 영구 삭제하는 복합적인 규칙의 예시입니다.

{
  "Rules": [
    {
      "ID": "LogFileManagementRule",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "STANDARD_IA"
        }
      ],
      "Expiration": {
        "Days": 365
      },
      "NoncurrentVersionTransitions": [
        {
          "NoncurrentDays": 30,
          "StorageClass": "STANDARD_IA"
        }
      ],
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 180
      },
      "AbortIncompleteMultipartUpload": {
        "DaysAfterInitiation": 7
      }
    }
  ]
}

위 JSON 파일의 각 필드는 다음과 같은 의미를 가집니다.

  • ID: 규칙을 식별하는 고유한 이름입니다.
  • Status: 규칙의 활성화 여부입니다. (Enabled 또는 Disabled)
  • Filter.Prefix: logs/ 폴더 아래의 모든 객체에 이 규칙을 적용합니다.
  • Transitions: 현재 버전의 객체를 생성 후 30일이 지나면 STANDARD_IA 스토리지 클래스로 전환합니다.
  • Expiration: 현재 버전의 객체를 생성 후 365일이 지나면 영구 삭제합니다.
  • Noncurrent...: (버전 관리가 활성화된 버킷용) 이전 버전 객체에 대한 전환 및 만료 규칙입니다.
  • AbortIncompleteMultipartUpload: 시작된 지 7일이 지나도 완료되지 않은 멀티파트 업로드를 중단하고 삭제하여 비용을 절감합니다.

Step 3: 수명 주기 구성 적용

작성한 JSON 파일을 사용하여 put-bucket-lifecycle-configuration 명령을 실행합니다. YOUR-BUCKET-NAME을 실제 버킷 이름으로, lifecycle-policy.json을 방금 작성한 파일 경로로 변경하세요.

aws s3api put-bucket-lifecycle-configuration \
    --bucket YOUR-BUCKET-NAME \
    --lifecycle-configuration file://lifecycle-policy.json

명령이 성공적으로 실행되면 아무런 출력이 없습니다. 현재 적용된 구성을 확인하려면 get-bucket-lifecycle-configuration 명령을 사용하고, 규칙을 제거하려면 delete-bucket-lifecycle 명령을 사용하면 됩니다.

3. AWS SDK (Boto3)를 이용한 프로그래밍 방식의 통합

애플리케이션 코드 내에서 동적으로 수명 주기 규칙을 생성하거나 수정해야 할 경우 AWS SDK를 사용합니다. 여기서는 Python용 AWS SDK인 Boto3를 예로 들어 설명합니다.

Step 1: Boto3 설치 및 구성

먼저 Python 환경에 Boto3 라이브러리를 설치해야 합니다. AWS 자격 증명은 CLI와 마찬가지로 환경 변수나 IAM 역할을 통해 구성되어 있어야 합니다.

pip install boto3

Step 2: Python 스크립트 작성

Python 스크립트 내에서 수명 주기 구성을 딕셔너리 형태로 정의하고, Boto3 클라이언트를 사용하여 버킷에 적용합니다.

import boto3
from botocore.exceptions import ClientError

def apply_s3_lifecycle_policy(bucket_name, lifecycle_policy):
    """
    지정된 S3 버킷에 수명 주기 정책을 적용합니다.

    :param bucket_name: 정책을 적용할 버킷 이름
    :param lifecycle_policy: 적용할 수명 주기 정책 (Python 딕셔너리)
    """
    try:
        s3_client = boto3.client('s3')
        s3_client.put_bucket_lifecycle_configuration(
            Bucket=bucket_name,
            LifecycleConfiguration=lifecycle_policy
        )
        print(f"'{bucket_name}' 버킷에 수명 주기 정책을 성공적으로 적용했습니다.")
    except ClientError as e:
        print(f"오류 발생: {e}")
        return False
    return True

if __name__ == '__main__':
    # 대상 버킷 이름
    target_bucket = 'YOUR-BUCKET-NAME'

    # 적용할 수명 주기 정책 정의
    # 30일이 지난 임시 파일을 삭제하는 규칙
    policy = {
        'Rules': [
            {
                'ID': 'TempFileAutoDeletion',
                'Filter': {
                    'Prefix': 'temp/'
                },
                'Status': 'Enabled',
                'Expiration': {
                    'Days': 30
                },
                'AbortIncompleteMultipartUpload': {
                    'DaysAfterInitiation': 3
                }
            }
        ]
    }

    # 함수 호출하여 정책 적용
    apply_s3_lifecycle_policy(target_bucket, policy)

이 스크립트는 temp/ 접두사를 가진 객체를 30일 후에 자동으로 삭제하는 규칙을 YOUR-BUCKET-NAME 버킷에 적용합니다. 이처럼 SDK를 사용하면 애플리케이션의 로직과 연계하여 복잡한 데이터 관리 워크플로우를 자동화할 수 있습니다.

실용적인 수명 주기 전략 및 모범 사례

단순히 객체를 삭제하는 것 외에도, 수명 주기 규칙을 전략적으로 사용하여 비용과 성능, 규정 준수 요구사항을 모두 만족시킬 수 있습니다.

1. 버전 관리(Versioning)와 함께 사용하기

실수로 인한 데이터 삭제나 덮어쓰기를 방지하기 위해 S3 버킷에 버전 관리를 활성화하는 것이 좋습니다. 버전 관리가 활성화되면 객체를 삭제해도 바로 사라지지 않고 '삭제 마커(Delete Marker)'가 생성되며, 이전 버전들은 그대로 보존됩니다. 이 경우, 비용 절감을 위해 수명 주기 규칙을 두 단계로 설정해야 합니다.

  • 현재 버전 만료(Expiration for current version): 사용자가 객체를 삭제하면, 최신 버전에 삭제 마커가 생성됩니다.
  • 이전 버전 영구 삭제(Permanent deletion of noncurrent versions): 시간이 지난 이전 버전들을 실제로 삭제하여 스토리지 공간을 확보합니다. 예를 들어, '이전 버전이 된 지 90일이 지난 객체는 영구 삭제'와 같은 규칙을 추가할 수 있습니다.

이 두 가지 규칙을 함께 사용해야 버전 관리의 안정성을 누리면서도 불필요한 비용 증가를 막을 수 있습니다.

2. 데이터 접근 빈도에 따른 비용 최적화 전략

모든 데이터를 비싼 S3 Standard에 보관할 필요는 없습니다. 데이터의 가치는 시간에 따라 변하는 경우가 많습니다.

  • 초기(0~30일): 자주 접근하는 데이터. S3 Standard에 보관하여 빠른 접근성을 보장합니다.
  • 중기(31~180일): 가끔 접근하지만 즉시 필요할 수 있는 데이터. S3 Standard-IA(Infrequent Access)나 S3 Intelligent-Tiering으로 전환하여 스토리지 비용을 절감합니다.
  • 장기 보관(181일 이후): 거의 접근하지 않는 아카이브 데이터. S3 Glacier Flexible Retrieval 또는 Deep Archive로 전환하여 비용을 극적으로 낮춥니다.
  • 삭제(365일 이후): 법적/규제적 보관 기간이 만료된 데이터. 영구 삭제하여 비용 발생을 원천 차단합니다.

이러한 계층적 전략을 수명 주기 규칙으로 자동화하면 상당한 비용을 절감할 수 있습니다.

3. 규칙 적용 전 신중한 검토

수명 주기 규칙, 특히 만료(삭제) 규칙은 되돌릴 수 없는 작업을 수행합니다. 프로덕션 환경에 적용하기 전에 반드시 다음 사항을 확인하세요.

  • 필터의 정확성: 의도한 객체에만 규칙이 적용되는지 접두사나 태그를 다시 한번 확인합니다.
  • 기간 설정: 데이터 보존 정책이나 법적 요구사항을 충족하는 기간인지 검토합니다. 너무 짧게 설정하여 중요한 데이터를 잃지 않도록 주의해야 합니다.
  • 작은 객체 문제: 수백만 개의 작은 파일에 전환(Transition) 작업을 적용하면, 객체 수에 비례하는 전환 요청 비용이 스토리지 비용 절감 효과보다 더 커질 수 있습니다. 이 경우, 파일을 아카이빙(예: tar)하여 큰 객체 하나로 만든 후 전환하는 전략을 고려할 수 있습니다.

모니터링 및 문제 해결

규칙을 설정한 후에는 의도대로 작동하는지 주기적으로 확인해야 합니다.

  • Amazon CloudWatch: S3 버킷의 크기(BucketSizeBytes)와 객체 수(NumberOfObjects) 메트릭을 모니터링합니다. 만료 규칙이 적용된 후 이 수치들이 예상대로 감소하는지 확인하고, 그렇지 않을 경우 알람을 설정하여 문제를 조기에 발견할 수 있습니다.
  • AWS CloudTrail: 모든 API 호출을 기록하므로, S3 수명 주기에 의해 객체가 실제로 삭제되었는지(S3.LIFECYCLE.DELETE 이벤트) 확인할 수 있습니다. 이는 감사 및 문제 해결에 매우 유용합니다.
  • - S3 Storage Lens: 스토리지 사용량 및 활동 추세에 대한 포괄적인 가시성을 제공하는 분석 도구입니다. 대시보드를 통해 어떤 접두사나 스토리지 클래스가 비용의 대부분을 차지하는지 파악하고, 수명 주기 정책의 효과를 시각적으로 분석할 수 있습니다.

결론적으로, AWS S3 수명 주기 관리는 단순한 자동 삭제 기능을 넘어, 클라우드 스토리지의 비용, 성능, 규정 준수를 지능적으로 관리하는 필수 도구입니다. 데이터의 특성과 비즈니스 요구사항에 맞는 정교한 규칙을 설계하고 자동화함으로써, 개발자와 관리자는 반복적인 작업에서 벗어나 더 중요한 가치 창출에 집중할 수 있습니다.


0 개의 댓글:

Post a Comment