Browsing Tag

데이터 보호

NCLOUD

[NCLOUD] Cloud Functions을 활용한 서버 이미지 백업 자동화 및 Slack 알람

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

서버의 데이터 백업은 매우 중요한 작업 중 하나입니다.
기존에 포스팅됐던 “[NCLOUD] 네이버 클라우드에서 이미지 백업을 자동화 해보자(WITH. SHELL SCRIPT)” 포스팅은 ShellScript로 작성되었으며 서버에서 설정하고 cron에 등록해줘야하는 불편함이 있었습니다.

오늘은 네이버 클라우드의 Cloud Functions을 활용하여 서버 이미지 백업을 자동화하고, 백업 상태를 Slack 알람으로 받아보는 방법을 소개하겠습니다. 이 글을 통해 여러분도 쉽게 서버 이미지 백업 자동화를 구현해 보실 수 있습니다.

Alarm

이미지 백업의 성공 여부를 판단하기 위해 알람 설정을 어떻게 받을지 고민이 있었습니다.

처음에는 Cloud Functions의 Action이 작동하면 Cloud Log Analytics(CLA)에 로그가 저장되기 때문에 CLA의 Alarm 기능을 이용하여 알람을 설정하려고 하였습니다.
그러나 CLA의 Alarm 기능은 요금제가 Standard가 아닌 Premium에서만 사용 가능하므로 모든 사용자에게 적합한 해결책이 아니라고 판단되었습니다.

따라서 알람 역시 Cloud Functions에서 직접 처리하기로 결정했습니다.

만약 Cloud Functions에서 이미지 백업을 처리한 후 CLA를 통해 알람 설정을 원하신다면, 아래 Lucene Query 예시를 참고하시기 바랍니다.

ncf.name: "Cloud-Functions-Action-Name" AND ncf.response.statusCode: 1

해석: ncf.name이 Cloud-Functions-Action-Name이고 ncf.response.statusCode가 1이면 알림 발생 (statusCode=0은 정상, statusCode=1은 실패입니다.)


Slack 설정 (Incoming Webhooks 앱 추가)

먼저 Slack에서 모니터링 알람을 받을 채널을 생성해주세요.

Slack에서 앱 추가를 위해 incoming webhooks을 검색한 후, 아래 그림과 같이 나타나는 사용 가능한 앱을 추가해줍니다.

다음으로 추가한 Incoming WebHooks 앱을 설정하는 과정을 진행해야 하는데, 이 과정은 매우 간단합니다.

먼저 [Slack에 추가] 버튼을 클릭하여 앱을 추가합니다.

새로운 화면으로 이동한 후, 아래 그림과 같이 몇 가지 설정만 해주고 값을 복사하면 됩니다.

  • 채널에 포스트: 이 부분에서는 Slack에서 생성한 채널을 선택해줍니다.
  • 웹후크 URL: 해당 URL은 [URL 복사]를 이용하여 별도로 복사해주세요.
    이 URL은 Cloud Function 코드에 추가해주어야 합니다.
  • 이름 사용자 지정: 예를 들어 ncloud-cloud-insight이라고 지정하면, ncloud-cloud-insight라는 이름의 봇이 알림을 전송한다고 생각하면 됩니다.
  • [설정 저장]

이미지 업로드 등의 나머지 설정은 자유롭게 진행하시면 됩니다.


Cloud Functions 생성

이어서 Cloud Functions 설정을 진행해보도록 하겠습니다.

  • Cloud Functions – Trigger

먼저 Cloud Functions – Trigger에서 원하는 시간마다 이미지 백업이 진행될 수 있도록 cron을 선택합니다.

  1. 트리거 종류 : cron
  2. 이름 및 설명 : 자유롭게 설정
  3. 상세 실행 옵션 : 원하는 시간대로 설정

위 설정 이후 역션 연결없이 [저장]해줍니다.

  • Cloud Functions – Action – Package

Trigger 생성이 완료되었다면 Action에서 패키지를 생성해줍니다.

위 그림과 같이 디폴트 파라미터에 ACCESS KEY와 SECRET KEY를 입력 후 생성합니다.

{"NCLOUD_ACCESS_KEY":"aaaaaaaaaaa","NCLOUD_SECRET_KEY":"bbbbbbbbbbbbbbbbbbbb"}

※주의 : 되도록 모든 권한이 부여된 메인 계정의 인증키를 사용하지 않고 Sub Account에서 API 접근용(Console 접근 X) 계정을 생성한 후 서버 이미지 백업에 필요한 권한만 부여하여 해당 계정에 추가한 Access Key를 사용해주세요.

  • Cloud Functions – Action – Action

마지막으로 [Action 생성]을 진행합니다.

트리거 선택 시 위에서 생성한 cron 트리거를 선택하여 추가해줍니다.
또한 패키지는 생성했던 서버 이미지 백업용 패키지를 선택합니다.

– 타입 : 기본
– 이름 및 설명 : 자유롭게 작성
– 언어 : python 3.7

코드는 아래와 같이 작성하였습니다.

import hashlib
import hmac
import base64
import requests
import json
import time
from datetime import datetime

# 백업 예외 서버 설정 ex) ['111111', '222222']
exception_list = []

# Incoming Webhook URL
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/12345678910/URLURLURL"


def send_slack_notification(webhook_url, message):
    headers = {"Content-Type": "application/json"}
    payload = {"text": message}
    response = requests.post(webhook_url, json=payload, headers=headers)

    if response.status_code == 200:
        print("Slack 메시지 전송 성공")
    else:
        print("Error sending Slack message: {}".format(response.status_code))


def generate_header(method, uri, access_key, secret_key):
    timestamp = str(int(time.time() * 1000))
    secret_key = bytes(secret_key, 'UTF-8')

    message = bytes(method + " " + uri + "\n" + timestamp + "\n" + access_key, '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,
    }

    return http_header

def insNo(access_key, secret_key):
    method = "GET"
    api_server = "https://ncloud.apigw.ntruss.com"
    uri = "/vserver/v2/getServerInstanceList?responseFormatType=json"

    http_header = generate_header(method, uri, access_key, secret_key)

    response = requests.get(api_server + uri, headers=http_header)
    server_instance_list = json.loads(response.text)["getServerInstanceListResponse"]["serverInstanceList"]

    return [instance["serverInstanceNo"] for instance in server_instance_list]

def main(args):
    
    access_key = args['NCLOUD_ACCESS_KEY']
    secret_key = args['NCLOUD_SECRET_KEY']
    insno_list = insNo(access_key, secret_key)

    for insno in insno_list:
        if insno not in exception_list:

            formatted_date = datetime.now().strftime('%Y%m%d')
	        
            method = "GET"
            api_server = "https://ncloud.apigw.ntruss.com"
            uri = f"/vserver/v2/createMemberServerImageInstance?serverInstanceNo={insno}&memberServerImageName=backup-{insno}-{formatted_date}&responseFormatType=json"
	        
            http_header = generate_header(method, uri, access_key, secret_key)
	        
            response = requests.get(api_server + uri, headers=http_header)
        
            if response.status_code != 200:
                slack_message = f"Error: {insno} 서버 이미지 백업에 실패하였습니다. ( status code : {response.status_code} )"
                send_slack_notification(SLACK_WEBHOOK_URL, slack_message)
            else:
                slack_message = f"Success: {insno} 서버 이미지 백업이 정상적으로 완료되었습니다. ( status code : {response.status_code} )"
                send_slack_notification(SLACK_WEBHOOK_URL, slack_message)
        
    return {"result": "success"}

위 코드 사용 시 직접 수정할 필요가 있는 부분이 존재합니다.

# 백업 예외 서버 설정 ex) ['111111', '222222']
exception_list = []

# Incoming Webhook URL
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/12345678910/URLURLURL"

1. 백업을 진행할 때, 예외 처리가 필요한 서버의 경우 서버의 Instance ID를 다음 예시처럼 입력해주어야 합니다. ex) exception_list = [‘111111’, ‘222222’]

2. 앞서 Slack 설정 부분에서 Incoming Webhook을 생성하고 복사해둔 웹훅 URL을 적절하게 수정해줍니다.

그 다음, VPC와 Subnet을 선택한 후 [생성] 버튼을 클릭하여 작업을 완료합니다.

이렇게 설정한 Action을 수동으로 실행하거나 cron에 지정한 시간에 정상적으로 작동하면, Slack 채널에서 아래와 같은 알람을 받을 수 있습니다.

만약 오류로 인해 동작하지 않는 경우에도 실패에 대한 알람을 받을 수 있도록 코드가 작성되어있습니다.


Personal Comments

퍼블릭 클라우드 환경에서의 백업과 알람은 IT 인프라의 안정성과 데이터 보호를 위해 무척 중요한 요소입니다. 이번 블로그 포스팅에서는 Cloud Functions을 활용하여 서버 이미지 백업 자동화와 Slack 알람을 설정하는 방법에 대해 알아보았습니다.

퍼블릭 클라우드를 사용하면서 발생할 수 있는 다양한 위험 요소와 예기치 못한 상황을 대비하여, 정기적인 백업과 실시간 알람은 기업이나 개인 사용자에게 큰 도움이 됩니다. 특히, 오늘 소개한 방법을 통해 빠르고 효율적으로 백업 작업을 관리하고, Slack 알람을 통해 백업 상태를 쉽게 확인할 수 있습니다.

앞으로도 퍼블릭 클라우드 환경에서 안전한 운영을 위해 꾸준한 백업과 알람 관리에 힘써야 할 것입니다.

이 포스팅이 여러분의 클라우드 환경에서 백업과 알람 관리에 도움이 되길 바랍니다.

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