ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CloudDB for MySQL 백업 파일 오브젝트 스토리지로 내보내기 자동 설정
    NAVER Cloud 2024. 3. 21. 19:12

     

    • CDB MySQL 의 경우 일 백업 시간과 보관 주기를 지정할 수 있으나 보관 주기 이후 백업 데이터 보관을 위한 export to object storage 기능에 대한 스케줄을 콘솔에서 설정할 수 없음 
    • export to object storage 기능을 사용하기 위해서는 cdb mysql 에서 제공하는 api 를 활용하여 사용자가 별도로 설정해야 함 

     

    1. exportBackupToObjectStorage api 사용을 위한 준비

    exportBackupToObjectStorage api 실행을 위한 필수 파라미터

    • fileName (백업 파일 이름)
    • bucketName (백업 파일을 저장할 오브젝트 스토리지 버킷명)
    • cloudMysqlInstanceNo (백업 소스인 CDB MySQL 인스턴스 번호) 임

    exportBackupToObjectStorage api 를 수행하기 전에 

    getCloudMysqlInstanceList api 실행
    import hashlib
    import hmac
    import base64
    import requests
    import time
    import json
     
    def make_signature(access_key, secret_key, method, uri, timestamp):
        secret_key_bytes = bytes(secret_key, 'UTF-8')
     
        message = method + " " + uri + "\n" + timestamp + "\n" + access_key
        message = bytes(message, 'UTF-8')
        signing_key = base64.b64encode(hmac.new(secret_key_bytes, message, digestmod=hashlib.sha256).digest())
        return signing_key.decode('UTF-8')
     
    # Replace with your actual access_key and secret_key
    access_key = "XXXXXXXXXXXXX" ### key 수정
    secret_key = "YYYYYYYYYYYYYYYYYYYYYYYYYYYY" ### key 수정
     
    # API endpoint and method
    api_url = "https://ncloud.apigw.ntruss.com/vmysql/v2/getCloudMysqlInstanceList"
    method = "GET"
    region_code = "KR"
    uri = f"/vmysql/v2/getCloudMysqlInstanceList?regionCode={region_code}"
     
     
    # Generate timestamp
    timestamp = str(int(time.time() * 1000))
     
    # Generate signature
    signature = make_signature(access_key, secret_key, method, uri, timestamp)
     
    # Print the generated signature
    print("Generated Signature:", signature)
    print(timestamp)
     
    # Request headers
    headers = {
        "Content-Type": "application/json",
        "x-ncp-iam-access-key": access_key,
        "x-ncp-apigw-timestamp": timestamp,
        "x-ncp-apigw-signature-v2": signature
    }
     
    # Send the request
    full_url = f"{api_url}?regionCode={region_code}"
    response = requests.get(full_url, headers=headers)
     
    # Print the response
    print("Response Status Code:", response.status_code)
    print("Response Headers:", response.headers)

     

    getCloudMysqlBackupDetailList 실행 후 exportBackupToObjectStorage api 실행
    import hashlib
    import hmac
    import base64
    import requests
    import time
    import xml.etree.ElementTree as ET
     
    def make_signature(access_key, secret_key, method, uri, timestamp):
        secret_key_bytes = bytes(secret_key, 'UTF-8')
     
        message = method + " " + uri + "\n" + timestamp + "\n" + access_key
        message = bytes(message, 'UTF-8')
        signing_key = base64.b64encode(hmac.new(secret_key_bytes, message, digestmod=hashlib.sha256).digest())
        return signing_key.decode('UTF-8')
     
    # Replace with your actual access_key and secret_key
    access_key = "XXXXXXXXXXXXX" ### key 수정
    secret_key = "YYYYYYYYYYYYYYYYYYYYYYYYYYYY"  ### key 수정
     
    # API endpoint and method for the first request
    api_url = "https://ncloud.apigw.ntruss.com/vmysql/v2/getCloudMysqlBackupDetailList"
    method = "GET"
    region_code = "KR"
    cloud_mysql_instance_no = "23189074"
    uri = f"/vmysql/v2/getCloudMysqlBackupDetailList?regionCode={region_code}&cloudMysqlInstanceNo={cloud_mysql_instance_no}"
     
    # Generate timestamp
    timestamp = str(int(time.time() * 1000))
     
    # Generate signature
    signature = make_signature(access_key, secret_key, method, uri, timestamp)
     
    # Request headers
    headers = {
        "Content-Type": "application/json",
        "x-ncp-iam-access-key": access_key,
        "x-ncp-apigw-timestamp": timestamp,
        "x-ncp-apigw-signature-v2": signature
    }
     
    # Send the first request
    full_url = f"{api_url}?regionCode={region_code}&cloudMysqlInstanceNo={cloud_mysql_instance_no}"
    response = requests.get(full_url, headers=headers)
     
    # Check if the response is successful
    if response.status_code == 200:
        # Parse the XML response
        root = ET.fromstring(response.text)
        # Assuming that the fileName is located in a specific element, for example <fileName>FILE_NAME</fileName>
        file_name = root.find('.//fileName').text
     
        # API endpoint and method for the second request
        api_url_export = "https://ncloud.apigw.ntruss.com/vmysql/v2/exportBackupToObjectStorage"
        bucket_name = "user-bucket"
        uri_export = f"/vmysql/v2/exportBackupToObjectStorage?regionCode={region_code}&fileName={file_name}&bucketName={bucket_name}&cloudMysqlInstanceNo={cloud_mysql_instance_no}"
     
        # Generate new timestamp and signature for the second request
        timestamp_export = str(int(time.time() * 1000))
        signature_export = make_signature(access_key, secret_key, method, uri_export, timestamp_export)
     
        # Request headers for the second request
        headers_export = {
            "Content-Type": "application/json",
            "x-ncp-iam-access-key": access_key,
            "x-ncp-apigw-timestamp": timestamp_export,
            "x-ncp-apigw-signature-v2": signature_export
        }
     
        # Send the second request
        full_url_export = f"{api_url_export}?regionCode={region_code}&fileName={file_name}&bucketName={bucket_name}&cloudMysqlInstanceNo={cloud_mysql_instance_no}"
        response_export = requests.get(full_url_export, headers=headers_export)
     
        # Print the response from the second request
        print("Response Status Code:", response_export.status_code)
        print("Response Headers:", response_export.headers)
        print("Response Body:", response_export.text)
    else:
        print("Failed to get backup details. Status Code:", response.status_code)
        print("Response Body:", response.text)

     

     

    2. Cloud Functions 의 Cron Trigger 를 활용한 스케줄 설정

    • Cloud Functions → Trigger 에서 cron 타입의 Trigger 를 생성한다. 이 떄 Export 를 실행할 스케줄도 설정한다.
    •  

     

    • 백업 파일을 Export 할 action 을 저장할 패키지를 생성 후 action도 생성

    패키지/액션 생성
    액션 상세

    • Cron 이 정상적으로 수행되면 Object storage 에 백업 파일이 업로드 된 것을 확인할 수 있음
    반응형

    댓글

Designed by Tistory.