안녕하세요 MANVSCLOUD 김수현입니다.
저장 공간과 비용 최적화를 위해 데이터의 수명 주기를 관리하는 것은 매우 중요합니다.
오래된 데이터를 자동으로 삭제하거나 이관하는 것은 불필요한 저장 비용을 줄이고 시스템을 깔끔하게 유지하는데 도움이 됩니다.
이번 포스트에서는 네이버 클라우드 플랫폼에서 현재 Archive Storage에 저장된 오래된 데이터를 자동으로 삭제하는 기능을 지원하지 않아 Cloud Functions를 사용하여 Archive Storage에서 일정 기간이 지난 오브젝트를 자동으로 삭제하는 프로세스를 구축해 보겠습니다.
Object Storage VS Archive Storage
네이버 클라우드 플랫폼에서 제공하는 주요 스토리지는 Block Storage, NAS, Object Storage, Archive Storage가 있고 서로 다른 목적과 환경에 따라 적합한 용도가 있습니다.
- 비용 : Block Storage > NAS > Object Storage > Archive Storage
- 성능 : Block Storage > NAS > Object Storage > Archive Storage
Block Storage가 용량별 성능은 가장 좋으나 비용이 그 만큼 높은 편이며 Archive Storage가 가장 용량 대비 비용이 저렴한 편입니다.

Object Storage는 높은 내구성과 접근성을 제공하는 스토리지 서비스로 주로 정적 웹 호스팅 용도로 사용하거나 이미지나 영상과 같은 데이터를 저장 또는 데이터를 자주 사용하고 접근해야 하는 상황에 적합합니다.
반면 Archive Storage는 장기 보관이 필요한 데이터를 저장하기에 이상적인 서비스로 저렴한 비용에 높은 내구성을 제공하지만, 데이터 검색 속도는 상대적으로 느립니다.
즉 Object Storage에 저장된 데이터 중 접근이 적고 오래 보관하는 용도만 사용되는 오래된 데이터가 있다면 Archive Storage로 이관하거나 삭제하는 것이 좋습니다.
대표적인 예시로 ISMS-P 인증 기준 “개인정보처리자는 개인정보취급자가 개인정보처리시스템에 접속한 기록을 1년 이상 보관·관리하여야 한다.” 라는 요구사항이 있습니다.
그런데 이러한 로그 데이터는 자주 접근하는 데이터라기보다 장기간 보관해두는 경우가 많으므로 Object Storage에 저장하기보다 Archive Storage에 이관하여 보관한다면 비용을 최적화할 수 있는 부분이됩니다.
하지만 특정 기간이 지난 후 Object Storage에서 Archive Storage로 이관하거나 삭제하는 수명 주기 정책 기능은 지원하지만 Archive Storage에서 특정 기간이 지난 후 파일을 삭제할 수 있는 기능은 지원되지 않고 있습니다.
이를 해결하기 위해 Cloud Functions과 Archive Storage API를 이용하여 일정 기간이 지난 오브젝트를 자동으로 삭제하는 프로세스를 만들어보도록 하겠습니다.
Archive Storage Lifecycle Management
# VPC, Server 생성에 대한 가이드는 생략합니다.
# Python은 3.7 버전이 사용되었습니다.
# 아래 과정은 CentOS 7 환경에서 Pyenv를 사용하였습니다.
네이버 클라우드 플랫폼의 Archive Storage API를 사용하기 위해 python-keystoneclient와 python-swiftclient 모듈을 따로 설치해주고 .zip 파일로 Cloud Functions에 업로드하여 실행되도록 할 것입니다.
- 로컬에서 코드 작성 및 .zip 파일 생성
python-keystoneclient와 python-swiftclient 라이브러리가 포함된 가상 환경을 생성합니다.
mkdir arch python -m venv venv source venv/bin/activate pip install python-keystoneclient pip install python-swiftclient cp -r venv/lib/python3.7/site-packages/* . vi main__.py
- main__.py
main__.py에 작성되어야할 코드는 아래를 참고해주세요.
아래 코드에서는 90일이 지난 오브젝트가 삭제되도록 되어있습니다.
하는 날짜로 변경해주세요.
import datetime
import pytz
from keystoneauth1 import session
from keystoneauth1.identity import v3
from swiftclient import client
def main(args):
auth_url = 'https://kr.archive.ncloudstorage.com:5000'
project_id = args['PROJECT_ID']
container_name = args['CONTAINER_NAME']
auth = v3.Password(auth_url=auth_url,
username=args['NCLOUD_ACCESS_KEY'],
password=args['NCLOUD_SECRET_KEY'],
project_id=project_id,
user_domain_name=args['DOMAIN_NAME'])
sess = session.Session(auth=auth)
swift_conn = client.Connection(session=sess)
container_objects = swift_conn.get_container(container_name)[1]
kst = pytz.timezone('Asia/Seoul')
now = datetime.datetime.now(kst)
# 기간 설정 ex) days=90는 90일이 지난 오브젝트 삭제
deletion_threshold = datetime.timedelta(days=90)
for obj in container_objects:
obj_name = obj['name']
obj_timestamp = obj['last_modified']
obj_datetime = datetime.datetime.strptime(obj_timestamp, '%Y-%m-%dT%H:%M:%S.%f')
obj_datetime = obj_datetime.replace(tzinfo=pytz.utc)
obj_datetime_kst = obj_datetime.astimezone(kst) # KST 시간으로 변환
# 지정된 시간이 지난 오브젝트 확인
if now - obj_datetime_kst > deletion_threshold:
# 오브젝트 삭제
swift_conn.delete_object(container_name, obj_name)
deleted_objects.append(obj_name)
return {"deleted_objects": deleted_objects}
- 각종 라이브러리와 main__.py를 .zip 파일로 압축합니다.
zip -r arch.zip *
- Cloud Funcstion Action을 생성하고 파일을 업로드해줍니다.
(Trigger는 원하는 조건에 맞게 사용해주세요.)

- 디폴트 파라미터(JSON)
디폴트 파라미터는 Package 또는 Action 내 원하는 곳에 설정해주세요.
{"NCLOUD_ACCESS_KEY":"AAAAAAAA","NCLOUD_SECRET_KEY":"BBBBBBBBBBBBBBBB","CONTAINER_NAME":"ARCHIVESTORAGE_NAME","PROJECT_ID":"ARCHIVESTORAGE_PJTID","DOMAIN_NAME":"ARCHIVESTORAGE_DOMAIN_NAME"}
– NCLOUD_ACCESS_KEY : Archive Storage의 조회 및 삭제 권한을 가진 ACCESS KEY
– NCLOUD_SECRET_KEY : 위 ACCESS KEY의 SECRET KEY
– CONTAINER_NAME : [Archive Storage]의 컨테이너(버킷) 이름
– PROJECT_ID : [Archive Storage] – [API 이용 정보 확인] 에서 Project ID 확인 가능
– DOMAIN_NAME : [Archive Storage] – [API 이용 정보 확인] 에서 Domain ID를 확인 가능
(default로 입력할 경우 오류 발생)
(Domain ID가 default로 되어있는 경우 반드시 Default로 입력해주어야합니다.
“DOMAIN_NAME”:”Default”)
- [저장] 후 [실행]
Result
※ 주의 : 삭제할 파일이 너무 많을 경우 시간이 오래 소요될 수 있으며 액션 Timeout 보다 오래걸릴 경우 에러가 발생할 수 있습니다.
정상적으로 실행될 경우 아래와 같이 “status” : “success”와 함께 삭제된 오브젝트들을 확인할 수 있습니다.

<삭제 전 파일>

<삭제 후 파일>

90일이 지난 파일 또는 디렉토리가 정상적으로 삭제된 것을 알 수 있습니다.
삭제 날짜의 기준은 오브젝트의 ‘생성(업로드)한 날짜’를 기준입니다.
[참고] 삭제할 오브젝트가 250개인 경우 약 25000ms의 시간이 소요됐다.
[참고] Archive Storage가 Object Storage보다 데이터 저장에 대한 비용은 더 저렴하지만 GET이나 DELETE와 같은 API 요청에 대한 비용은 더 비싸다.
[참고] GET과 DELETE API에 대한 비용을 줄이고 Cloud Funcstions에서 액션 소요 시간을 줄이기 위해서 또 다른 고민을 할 필요가 있다.
ex) 매일 Object Storage에서 100개의 파일이 Archive Storage로 이관된다고 가정할 때 각각의 파일을 개별적으로 이관하는 것이 아니라 100개의 파일을 하나의 압축 파일로 압축하여 이관한다면 Archive Storage API에 대한 비용을 최소화할 수 있고 Cloud Functions에서 실행되는 액션의 소요 시간도 줄일 수 있습니다.
Personal Comments
지금까지 Cloud Functions을 활용하여 Archive Storage의 수명 주기 관리를 진행하는 방법을 알아보았습니다.
개인적으로 클라우드 환경에서 스토리지 관리는 항상 최적의 효율과 비용 절감을 고려해야 하는 중요한 주제 중 하나라고 생각합니다. 이러한 목표를 달성하기 위한 다양한 방법을 고민하고 시도해볼 수 있는 시간이 된 것같니다.
긴 글 읽어주셔서 감사합니다.
