Browsing Tag

이미지 백업

NCLOUD

[NCLOUD] 백업용 서버 이미지 보관일 설정 및 삭제 자동화

안녕하세요. MANVSCLOUD 김수현입니다.

이전에 공유드렸던 ‘[NCLOUD] CLOUD FUNCTIONS을 활용한 서버 이미지 백업 자동화 및 SLACK 알람’에 이어서 오늘은 백업된 서버 이미지의 보관일을 설정하고 그 보관일을 넘긴 이미지를 자동으로 삭제하는 방법에 대해 알아보려고 합니다.

서버 이미지 백업은 중요한 데이터를 안전하게 보관하는 데 큰 역할을 합니다. 하지만 네이버 클라우드에서 서버 이미지를 지속적으로 보관하다 보면 결국 비용으로 이어지며 이를 수동으로 관리하는 것은 상당히 번거로울 수 있습니다.

그래서 이번 포스팅에서는 이러한 문제를 해결하기 위해 Serverless 서비스인 Cloud Functions를 이용해 보관일을 설정하고 보관일이 지난 서버 이미지는 자동으로 삭제하는 방법을 알려드리고자 합니다.


Package & Trigger

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

Cloud Functions – Package
Cloud Functions – Trigger

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 서비스를 활용하면 이처럼 운영 부담을 줄이고 자원을 보다 효율적으로 활용하는 다양한 방법을 모색할 수 있습니다. 이 포스팅이 여러분의 클라우드 관리에 도움이 되었기를 바랍니다.

긴 글 읽어주셔서 감사합니다.