안녕하세요. MANVSCLOUD 김수현입니다.
이전에 공유드렸던 ‘[NCLOUD] CLOUD FUNCTIONS을 활용한 서버 이미지 백업 자동화 및 SLACK 알람’에 이어서 오늘은 백업된 서버 이미지의 보관일을 설정하고 그 보관일을 넘긴 이미지를 자동으로 삭제하는 방법에 대해 알아보려고 합니다.
서버 이미지 백업은 중요한 데이터를 안전하게 보관하는 데 큰 역할을 합니다. 하지만 네이버 클라우드에서 서버 이미지를 지속적으로 보관하다 보면 결국 비용으로 이어지며 이를 수동으로 관리하는 것은 상당히 번거로울 수 있습니다.
그래서 이번 포스팅에서는 이러한 문제를 해결하기 위해 Serverless 서비스인 Cloud Functions를 이용해 보관일을 설정하고 보관일이 지난 서버 이미지는 자동으로 삭제하는 방법을 알려드리고자 합니다.
Package & Trigger

Package와 Trigger는 ‘[NCLOUD] CLOUD FUNCTIONS을 활용한 서버 이미지 백업 자동화 및 SLACK 알람’ 포스팅에서 생성한 “manvscloud-server-image-backup”과 “manvscloud-backup-cron-trg”를 그대로 사용하려고 합니다.


Package에 입력되는 디폴트 파라미터의 ACCESS KEY와 SECRET KEY는 반드시 Sub Account로 발급하여 최소한의 권한만 부여해야합니다.
Action
Cloud Functions – Action에서 [+ Action 생성]을 클릭합니다.
- 트리거 종류 : 위에서 생성한 트리거 추가 (manvscloud-backup-cron-trg)
- 패키지 : 위에서 생성한 패키지 추가 (manvscloud-server-image-backup)
- 타입 : 기본
- 이름, 설명 : 자유롭게 입력
- 언어(소스코드) : Python 3.7
- 타입(소스코드) : 코드
import os
import hashlib
import hmac
import base64
import requests
import time
import json
from datetime import datetime, timedelta
def get_member_server_image_list(access_key, secret_key):
timestamp = int(time.time() * 1000)
timestamp = str(timestamp)
secret_key = bytes(secret_key, 'UTF-8')
method = "GET"
api_server = "https://ncloud.apigw.ntruss.com"
uri = "/vserver/v2/getMemberServerImageInstanceList"
uri = uri + "?responseFormatType=json"
message = method + " " + uri + "\n" + timestamp + "\n" + access_key
message = bytes(message, 'UTF-8')
signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
http_header = {
'x-ncp-apigw-signature-v2': signingKey,
'x-ncp-apigw-timestamp': timestamp,
'x-ncp-iam-access-key': access_key,
}
response = requests.get(api_server + uri, headers=http_header)
return response.json()
def delete_member_server_image(deleteImg, access_key, secret_key):
timestamp = int(time.time() * 1000)
timestamp = str(timestamp)
secret_key = bytes(secret_key, 'UTF-8')
method = "GET"
api_server = "https://ncloud.apigw.ntruss.com"
uri = "/vserver/v2/deleteMemberServerImageInstances?memberServerImageInstanceNoList.1=" + deleteImg
uri = uri + "&responseFormatType=json"
message = method + " " + uri + "\n" + timestamp + "\n" + access_key
message = bytes(message, 'UTF-8')
signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
http_header = {
'x-ncp-apigw-signature-v2': signingKey,
'x-ncp-apigw-timestamp': timestamp,
'x-ncp-iam-access-key': access_key,
}
response = requests.get(api_server + uri, headers=http_header)
return response.status_code == 200
def main(args):
access_key = args['NCLOUD_ACCESS_KEY']
secret_key = args['NCLOUD_SECRET_KEY']
response_json = get_member_server_image_list(access_key, secret_key)
image_list = response_json['getMemberServerImageInstanceListResponse']['memberServerImageInstanceList']
today = datetime.now()
deleted_images = []
for image in image_list:
image_name = image['memberServerImageName']
if not image_name.startswith('backup'):
continue
date_str = image_name.split('-')[-1]
image_date = datetime.strptime(date_str, '%Y%m%d')
days_passed = (today - image_date).days
# 이미지 보관일 설정 (Default : 30일)
if days_passed >= 30:
image_instance_no = image['memberServerImageInstanceNo']
if delete_member_server_image(image_instance_no, access_key, secret_key):
deleted_images.append(image_name)
return {"result": "success", "deleted_images": deleted_images}
코드 설명 : ‘[NCLOUD] CLOUD FUNCTIONS을 활용한 서버 이미지 백업 자동화 및 SLACK 알람’에서 설정한대로 백업이 될 경우 backup-ServerId-date(backup-1111111-20230512)와 같은 방식으로 이미지가 생성됩니다. 그러므로 위 코드 실행 시 backup으로 시작하는 서버 이미지를 대상으로 마지막에 Date가 보관일을 넘어갈 경우 자동으로 삭제되는 방식입니다.
즉, test-backup과 같이 backup으로 시작하지 않는 이미지를 수동으로 생성할 경우 해당 이미지는 자동 삭제 대상에 포함되지 않으므로 정기 이미지 백업과 수동으로 생성한 이미지를 따로 관리할 수 있습니다.
또한 작성된 코드를 기준으로 이미지 보관일이 30일로 설정되어있으므로 코드를 수정하여 원하는 보관일수를 변경할 수 있습니다.
if days_passed >= 30: 부분을 if days_passed >= 90: 로 변경할 경우 90일 보관으로 변경됩니다.
VPC 연결 정보에서 VPC와 Subnet을 선택 후 옵션 설정은 기본 설정 상태로 Action을 생성합니다.

생성된 Action을 [실행]하여 정상적으로 실행되는지 확인합니다.

Personal Comments
지금까지 ‘[NCLOUD] 백업용 서버 이미지 보관일 설정 및 삭제 자동화’에 대해 자세히 알아봤습니다. 이를 통해 수동으로 서버 이미지를 관리하는 번거로움을 줄이고 필요 이상으로 비용이 발생하는 것을 막을 수 있습니다.
Cloud Functions와 같은 Serverless 서비스를 활용하면 이처럼 운영 부담을 줄이고 자원을 보다 효율적으로 활용하는 다양한 방법을 모색할 수 있습니다. 이 포스팅이 여러분의 클라우드 관리에 도움이 되었기를 바랍니다.
긴 글 읽어주셔서 감사합니다.

No Comments