My __ 노트

[ NCP 서버이미지 ] 자동 생성 및 삭제 스크립트 ( python3 ) 본문

클라우드/NCP(클라우드)

[ NCP 서버이미지 ] 자동 생성 및 삭제 스크립트 ( python3 )

블루빔 2023. 11. 23. 19:30

서비스 운영 안정성을 위해 서버 백업을 주기적으로 하는 것을 권장합니다. 서버 백업을 하면 장애 발생 시 특정 시점으로 바로 복구하여 서비스 운영 중단을 최소화할 수 있습니다. 

NCP에는 디스크를 백업하는 Snapshot 서비스와 특정 시점 서버의 전체 내용과 구조를 백업하는 Server Image 서비스가 있습니다.
하지만 Server Image를 자동 생성 및 스케줄링에 따라 삭제되는 서비스는 없습니다. 하여 해당 글에서는 Python3을 이용하여 Server Image 생성 및 삭제와 더불어 알림 발생까지 받아 볼 수 있게 하는 방법에 대해 작성해 보겠습니다.  

목차
▶ 서버이미지 생성
▶ 서버이미지 리스트 확인
▶ 서버이미지 삭제

▶ 서버이미지 생성

서버이미지 생성 : createMemberServerImageInstance 메소드 이용 - 관련 참고 문서 ⬅️

(예시) 

ncloud vserver createMemberServerImageInstance --regionCode KR --serverInstanceNo ***4299 --memberServerImageName test-***
def create_image():
####서버이미지 생성할 타겟 인스턴스 넘버, 서버이미지네임
    target = ["1234567:server01-auto-img","2345678:server02-auto-img"]

    for i in target:
####서버이미지네임에 당일 날짜 추가 
        image_name = f'{i.split(":")[1]}-{datetime.datetime.now().strftime("%Y%m%d")}'
####createMemberServerImageInstance 메소드를 이용하여 서버이미지 생성 
        os.system(f'sh ncloud vserver createMemberServerImageInstance --regionCode FKR --serverInstanceNo {i.split(":")[0]} --memberServerImageName {image_name} > /dev/null 2>&1')
####생성한 서버이미지 알림 채널로 보내기 
        webhook(f"Creating image : {image_name}")

 

- 서버 이미지를 생성할 target 인스턴스 넘버와 서버네임을 사전에 정의합니다. 
- 콘솔에서도 식별이 쉽게 서버 이미지네임에 생성 당일 날짜를 추가해 줬습니다. 
- createMemberServerImageInstance 메소드를 이용하여 서버 이미지를 생성합니다. 
- 현재 생성되고 있는 서버 이미지네임을 Webhook으로 보내 작업이 시작되었음을 알립니다. 

 

▶ 서버이미지 리스트 확인

서버이미지 리스트 불러오기 : getMemberServerImageInstanceList 메소드 이용 - 관련 참고 문서 ⬅️

(예시)

ncloud vserver getMemberServerImageInstanceList --regionCode KR --memberServerImageInstanceNoList ***5847 --memberServerImageName test-*** --memberServerImageInstanceStatusCode CREAT --platformTypeCodeList LNX64
def get_image_list():
    result = []
####getMemberServerImageInstanceList 메소드를 이용하여 서버이미지 리스트 불러오기 
####출력결과를 해당 스크립트가 있는 폴더 안에 json 파일로 저장 
    os.system(f"sh ncloud vserver getMemberServerImageInstanceList --regionCode FKR --memberServerImageInstanceStatusCode CREAT > {os.getcwd()}/server-image-instance-list.json")
####json 파일을 읽기 
    with open(f'{os.getcwd()}/server-image-instance-list.json', "r") as f:
####json 파일을 파이썬 객체로 역 직렬화
        result = json.load(f)
    return result

 

- getMemberServerImageInstanceList 메소드를 이용하여 현재 서버 이미지 리스트들을 json 파일 형태로 저장합니다. 
- json 파일을 읽어서 다시 파이썬 객체로 역 직렬화 합니다. 

- 아래 해당 결과 값을 재정렬하여 dataframe을 생성합니다. 

def rearrange_image_list():
    result = []
####memberServerImageInstanceListe안에 내용을 payload 변수에 저장 
    payload = get_image_list()["getMemberServerImageInstanceListResponse"]["memberServerImageInstanceList"]
####현재날자를 timestamp로 변경 
    date_now = dateutil.parser.parse(str(datetime.datetime.now().date())).timestamp()

    for i in payload:
####서버이미지 네임, 서버이미지 넘버, 생성날짜를 리스트에 저장 
        r = []
        r.append(i["memberServerImageName"])
        r.append(i["memberServerImageInstanceNo"])
        r.append(i["createDate"])
####당일시간에서 생성시간을 뺀 시간을 저장 
        r.append(math.floor(int(date_now-dateutil.parser.parse(i["createDate"].split("T")[0]).timestamp())/60/60/24))
        result.append(r)

####dataframe을 생성 
    tmp_f = pd.DataFrame(result, columns=["image_name", "image_id", "create_date", "check"])
####서버이미지 네임중 auto-img가 불포함된 행 삭제 
    tmp_f = tmp_f.drop(tmp_f[~tmp_f["image_name"].str.contains("auto-img")].index)
    return tmp_f

- getMemberServerImageInstanceListResponse 내용 중 memberServerImageInstanceList 의 내용만 사용할 예정이므로 해당 결과 값만 payload에 저장하였습니다. 양식은 아래 "더보기" ⬇️를 확인하세요. 

 

- 당일 날짜를 timestamp로 변경하고 해당 수치에서 서버이미지 생성 시간을 뺀 시간을 저장합니다. 해당 값을 dataframe 생성 시 컬럼명 "check"에 저장합니다. 
- 자동으로 만들지 않은 서버이미지가 삭제되는 것을 방지하게 위해 서버이미지 네임 중 auto-img가 불포함된 행은 dataframe에서 삭제합니다. 

 

▶ 서버이미지 삭제 

서버 이미지 삭제 : deleteMemberServerImageInstances 메소드 이용 - 관련 참고 문서 ⬅️

(예시)

ncloud vserver deleteMemberServerImageInstances --regionCode KR --memberServerImageInstanceNoList ***5847
def delete_image():
    df = rearrange_image_list()
####7일 지난 행만 남겨 둠  
    df = df.drop(df[df["check"] <= 9].index).reset_index(drop=True)
####이미지 id, 이미지 name을 리스트 형채로 저장 
    image_id = df["image_id"].tolist()
    image_name = df["image_name"].tolist()

####이미지 id 리스트가 비어 있지 않을 경우 deleteMemberServerImageInstances 메소드를 이용하여 해당 이미지 삭제 
    if len(image_id) != 0:
        for i in image_id:
            os.system(f"sh ncloud vserver deleteMemberServerImageInstances --regionCode FKR --memberServerImageInstanceNoList {i} > /dev/null 2>&1")
        for n in image_name:
            webhook(f"Deleting image : {n} ")
    else :
        webhook("No server-images to delete")

 

- 생성한지 10일 지난 서버이미지만 dataframe에 남겨놓고 해당 서버이미지의 ID와 네임정보를 변수 값에 저장합니다. 
- deleteMemberServerImageInstances 메소드를 이용하여 삭제대상인 서버이미지를 삭제합니다.  
- 현재 삭제되고 있는 서버이미지 네임을 Webhook으로 보내 작업이 시작되었음을 알립니다. 

 

글이 길어서 서버이미지 생성 및 삭제 알람 생성 방법은 다음글에 작성하겠습니다.