API를 활용한 네이버클라우드 Target group 조회/생성/적용

2024. 9. 26. 17:10·클라우드
728x90
반응형

[사전 필수 요소]

  • API 키 발급
    • Sub account 계정도 API키 발급이 가능합니다.

[API 조회 코드(Python)]

더보기
import requests
import time
import hashlib
import hmac
import base64

# 액세스 키와 시크릿 키 설정
access_key = 'access_key'   # 실제 액세스 키 ID
secret_key = 'secret_key'      # 실제 시크릿 키

# 요청 정보 설정
http_method = "GET"
host = "ncloud.apigw.ntruss.com"
url = "/vloadbalancer/v2/getTargetGroupList" ## 타겟그룹리스트 확인
timestamp = str(int(time.time() * 1000))  # 현재 시간의 타임스탬프 (밀리초 단위)

# StringToSign 생성 (호스트 URL 제거)
message = "{} {}\n{}\n{}".format(http_method, url, timestamp, access_key)

# 시그니처 생성
signingKey = bytes(secret_key, 'UTF-8')
message = bytes(message, 'UTF-8')
signature = base64.b64encode(hmac.new(signingKey, message, digestmod=hashlib.sha256).digest())

# 헤더 설정
headers = {
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': access_key,
    'x-ncp-apigw-signature-v2': signature.decode('UTF-8')
}

# API 호출
url_full = "https://{}{}".format(host, url)
response = requests.get(url_full, headers=headers)

# 응답 출력
print(response.status_code)
print(response.text)

 


[결과 조회]

 


[API를 통한 Target 생성 코드(Python)]

더보기

 

import requests
import time
import hashlib
import hmac
import base64
import urllib.parse
import json

# 액세스 키와 시크릿 키 설정
access_key = 'access_key'    # 실제 액세스 키
secret_key = 'secret_key'       # 실제 시크릿 키

# 요청 정보 설정
http_method = "POST"
host = "ncloud.apigw.ntruss.com"
base_url = "/vloadbalancer/v2/createTargetGroup"
timestamp = str(int(time.time() * 1000))  # 현재 시간의 타임스탬프 (밀리초 단위)

# 파라미터 설정 (모든 파라미터를 쿼리 스트링으로 이동)
params = {
    "regionCode": "KR",
    "vpcNo": "*****",                        # 실제 VPC 
    "targetGroupName": "test-api-target",
    "targetTypeCode": "VSVR",
    "targetGroupProtocolTypeCode": "PROXY_TCP",
    "targetGroupPort": "5500",
    "healthCheckProtocolTypeCode": "TCP",
    "healthCheckPort": "80",
    "healthCheckCycle": "30",
    "healthCheckTimeout": "5",
    "healthCheckUpThreshold": "3",
    "healthCheckDownThreshold": "3",
    "useProxyProtocol": "false",
    "useStickySession": "false",
    "targetGroupDescription": "api-test타겟그룹",
    "responseFormatType": "json"
}

# 파라미터 정렬
sorted_params = dict(sorted(params.items()))

# 쿼리 스트링 생성
query_string = urllib.parse.urlencode(sorted_params)
url_with_query = base_url + "?" + query_string

# StringToSign 생성 (정렬된 쿼리 스트링 포함)
message = "{} {}\n{}\n{}".format(http_method, url_with_query, timestamp, access_key)

# 시그니처 생성
signingKey = bytes(secret_key, 'UTF-8')
message_bytes = bytes(message, 'UTF-8')
signature = base64.b64encode(hmac.new(signingKey, message_bytes, digestmod=hashlib.sha256).digest())
signature_str = signature.decode('UTF-8')

# 헤더 설정
headers = {
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': access_key,
    'x-ncp-apigw-signature-v2': signature_str
}

# API 호출 (요청 본문 없음)
url_full = "https://{}{}".format(host, url_with_query)
response = requests.post(url_full, headers=headers)

# 응답 출력
if response.status_code == 200:
    data = response.json()
    print("타겟 그룹 생성 성공:")
    print(json.dumps(data, indent=4, ensure_ascii=False))
else:
    print("타겟 그룹 생성 실패:")
    print("Status Code:", response.status_code)
    try:
        error_data = response.json()
        print(json.dumps(error_data, indent=4, ensure_ascii=False))
    except json.JSONDecodeError:
        print(response.text)

[API로 생성한 타겟그룹]


[API로 여러 개의 타겟그룹 동시 생성 코드(Python)]

import requests
import time
import hashlib
import hmac
import base64
import urllib.parse
import json
import os

# 액세스 키와 시크릿 키 설정 (환경 변수 사용 권장)
access_key = 'access_key'  # 실제 액세스 키 ID로 대체하세요
secret_key = 'secret_key'  # 실제 시크릿 키로 대체하세요

# 요청 정보 설정
http_method = "POST"
host = "ncloud.apigw.ntruss.com"
base_url = "/vloadbalancer/v2/createTargetGroup"

# 공통 파라미터 설정
common_params = {
    "regionCode": "KR",
    "vpcNo": "74794",  # 실제 VPC 번호로 대체하세요
    "targetTypeCode": "VSVR",
    "targetGroupProtocolTypeCode": "PROXY_TCP",
    "healthCheckProtocolTypeCode": "TCP",
    "healthCheckPort": "80",
    "healthCheckCycle": "30",
    "healthCheckTimeout": "5",
    "healthCheckUpThreshold": "3",
    "healthCheckDownThreshold": "3",
    "useProxyProtocol": "false",
    "useStickySession": "false",
    "targetGroupDescription": "api-test타겟그룹",
    "responseFormatType": "json"
}

# 포트 번호 범위 설정
start_port = 6500
end_port = 6550

for port in range(start_port, end_port + 1):
    # 각 타겟 그룹에 대한 파라미터 설정
    params = common_params.copy()
    params["targetGroupName"] = f"example-tg-{port}"
    params["targetGroupPort"] = str(port)  # 포트 번호를 문자열로 변환
    # 타임스탬프 업데이트
    timestamp = str(int(time.time() * 1000))

    # 파라미터 정렬
    sorted_params = dict(sorted(params.items()))

    # 쿼리 스트링 생성
    query_string = urllib.parse.urlencode(sorted_params)
    url_with_query = base_url + "?" + query_string

    # StringToSign 생성 (정렬된 쿼리 스트링 포함)
    message = "{} {}\n{}\n{}".format(http_method, url_with_query, timestamp, access_key)

    # 시그니처 생성
    signingKey = bytes(secret_key, 'UTF-8')
    message_bytes = bytes(message, 'UTF-8')
    signature = base64.b64encode(hmac.new(signingKey, message_bytes, digestmod=hashlib.sha256).digest())
    signature_str = signature.decode('UTF-8')

    # 헤더 설정
    headers = {
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': access_key,
        'x-ncp-apigw-signature-v2': signature_str
    }

    # API 호출 (요청 본문 없음)
    url_full = "https://{}{}".format(host, url_with_query)
    response = requests.post(url_full, headers=headers)

    # 응답 출력
    if response.status_code == 200:
        data = response.json()
        print(f"타겟 그룹 생성 성공: port{port}")
    else:
        print(f"타겟 그룹 생성 실패: port{port}")
        print("Status Code:", response.status_code)
        try:
            error_data = response.json()
            print(json.dumps(error_data, indent=4, ensure_ascii=False))
        except json.JSONDecodeError:
            print(response.text)

    # API 호출 간 딜레이 추가 (선택 사항)
    time.sleep(2.0)  # 1.0초 대기 (필요에 따라 조정)

 


[API로 타겟그룹 적용 코드(Python)]

 

더보기
import requests
import time
import hashlib
import hmac
import base64
import urllib.parse
import json

# 액세스 키와 시크릿 키 설정 (직접 입력)
access_key = 'access_key  # 실제 액세스 키 ID로 대체하세요
secret_key = 'secret_key'  # 실제 시크릿 키로 대체하세요

# 타겟 그룹 번호 조회 함수
def get_target_group_no(target_group_name, vpc_no):
    http_method = "GET"
    host = "ncloud.apigw.ntruss.com"  # 타겟 그룹 조회 호스트
    base_url = "/vloadbalancer/v2/getTargetGroupList"
    timestamp = str(int(time.time() * 1000))

    params = {
        "vpcNo": vpc_no,
        "responseFormatType": "json"
    }
    sorted_params = dict(sorted(params.items()))
    query_string = urllib.parse.urlencode(sorted_params)
    url_with_query = f"{base_url}?{query_string}"

    # StringToSign 생성
    message = f"{http_method} {url_with_query}\n{timestamp}\n{access_key}"
    signing_key = bytes(secret_key, 'UTF-8')
    message_bytes = bytes(message, 'UTF-8')

    signature = base64.b64encode(hmac.new(signing_key, message_bytes, digestmod=hashlib.sha256).digest())
    signature_str = signature.decode('UTF-8')

    # 헤더 설정
    headers = {
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': access_key,
        'x-ncp-apigw-signature-v2': signature_str
    }

    url_full = f"https://{host}{url_with_query}"
    response = requests.get(url_full, headers=headers)

    if response.status_code == 200:
        data = response.json()
        target_groups = data.get('getTargetGroupListResponse', {}).get('targetGroupList', [])
        for tg in target_groups:
            if tg.get('targetGroupName') == target_group_name:
                return tg.get('targetGroupNo')
    else:
        print(f"타겟 그룹 조회 실패: {target_group_name}")
        print("Status Code:", response.status_code)
        print(response.text)

    return None

# 타겟 그룹에 타겟 설정 함수
def set_target_group_instance(region_code, target_group_no, target_no):
    http_method = "POST"
    host = "ncloud.apigw.ntruss.com"  # 타겟 그룹 설정 호스트
    base_url = "/vloadbalancer/v2/setTarget"
    timestamp = str(int(time.time() * 1000))

    # 쿼리 매개변수 설정
    params = {
        "regionCode": region_code,
        "targetGroupNo": target_group_no,
        "targetNoList.1": target_no
    }
    sorted_params = dict(sorted(params.items()))
    query_string = urllib.parse.urlencode(sorted_params)
    url_with_query = f"{base_url}?{query_string}"

    # StringToSign 생성
    message = f"{http_method} {url_with_query}\n{timestamp}\n{access_key}"
    signing_key = bytes(secret_key, 'UTF-8')
    message_bytes = bytes(message, 'UTF-8')

    signature = base64.b64encode(hmac.new(signing_key, message_bytes, digestmod=hashlib.sha256).digest())
    signature_str = signature.decode('UTF-8')

    # 헤더 설정
    headers = {
        'Content-Type': 'application/json',  # JSON 형식임을 명시
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': access_key,
        'x-ncp-apigw-signature-v2': signature_str
    }

    url_full = f"https://{host}{url_with_query}"

    # 디버깅용 출력 (선택 사항)
    print(f"요청 URL: {url_full}")
    print(f"요청 본문: {{}}")  # setTarget API는 쿼리 매개변수를 사용하므로 본문은 비워둡니다.

    # 요청 본문을 비워둡니다.
    response = requests.post(url_full, headers=headers, data={})

    if response.status_code == 200:
        print(f"타겟 그룹에 타겟 설정 성공: Target Group No {target_group_no}")
    else:
        print(f"타겟 그룹에 타겟 설정 실패: Target Group No {target_group_no}")
        print("Status Code:", response.status_code)
        print(response.text)

# 메인 로직
if __name__ == "__main__":
    # VPC 번호 설정
    vpc_no = "74794"  # 실제 VPC 번호로 대체하세요

    # 서버 인스턴스 번호 설정 (예시)
    server_instance_no = "26360985"  # 실제 서버 인스턴스 번호로 대체하세요

    # 리전 코드 설정 (예시: KR)
    region_code = "KR"  # 실제 리전 코드로 대체하세요

    # 포트 번호 범위 설정
    start_port = 6500
    end_port = 6550

    for port in range(start_port, end_port + 1):
        target_group_name = f"tiger-tg-{port}"  # 타겟 그룹 이름이 정확한지 확인하세요

        # 타겟 그룹 번호 조회
        target_group_no = get_target_group_no(target_group_name, vpc_no)
        if target_group_no is None:
            print(f"타겟 그룹 번호를 찾을 수 없습니다: {target_group_name}")
            continue

        # 타겟 그룹에 타겟 설정
        set_target_group_instance(region_code, target_group_no, server_instance_no)

        # API 호출 간 딜레이 추가 (선택 사항)
        time.sleep(0.5)

 


[API LB 리스너에 포트 및 타겟그룹 매핑하는 코드(Python)

더보기
import requests
import time
import hashlib
import hmac
import base64
import json

# 액세스 키와 시크릿 키 설정
access_key = 'access_key'
secret_key = 'secret_key'

# 요청 정보 설정
http_method = "POST"
host = "ncloud.apigw.ntruss.com"
base_url = "/vloadbalancer/v2/createLoadBalancerListener"
start_port = 6500
end_port = 6550
start_target_group_no = 2649865  # 시작 타겟 그룹 번호
max_retries = 3  # 최대 재시도 횟수
load_balancer_instance_no = "26736195"  # 로드밸런서 인스턴스 번호


# 로드 밸런서 상태 체크를 위한 함수
def check_load_balancer_status(instance_no):
    status_url = f"https://{host}/vloadbalancer/v2/getLoadBalancerInstance"
    timestamp = str(int(time.time() * 1000))
    params = {
        "loadBalancerInstanceNo": instance_no,
        "responseFormatType": "json"
    }
    message = "{} {}\n{}\n{}".format("GET", "/vloadbalancer/v2/getLoadBalancerInstance", timestamp, access_key)
    signingKey = bytes(secret_key, 'UTF-8')
    message_bytes = bytes(message, 'UTF-8')
    signature = base64.b64encode(hmac.new(signingKey, message_bytes, digestmod=hashlib.sha256).digest())
    signature_str = signature.decode('UTF-8')

    headers = {
        'x-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': access_key,
        'x-ncp-apigw-signature-v2': signature_str,
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    # URL 출력
    print(f"로드 밸런서 상태 체크 URL: {status_url}, 파라미터: {params}")

    response = requests.get(status_url, headers=headers, params=params)

    if response.status_code == 200:
        data = response.json()
        print(f"로드 밸런서 상태: {json.dumps(data, indent=4, ensure_ascii=False)}")
    else:
        print(f"로드 밸런서 상태 체크 실패: {response.status_code}")
        print(response.text)


# 로드 밸런서 상태 체크
check_load_balancer_status(load_balancer_instance_no)

# 포트 번호를 올바르게 생성하기 위한 루프
for port in range(start_port, end_port + 1):
    target_group_no = start_target_group_no + (port - start_port)

    retries = 0
    success = False  # 리스너 생성 성공 여부

    while retries < max_retries:
        timestamp = str(int(time.time() * 1000))  # 현재 시간의 타임스탬프 (밀리초 단위)

        params = {
            "regionCode": "KR",
            "loadBalancerInstanceNo": load_balancer_instance_no,
            "protocolTypeCode": "TCP",
            "port": str(port),
            "targetGroupNo": str(target_group_no),
            "responseFormatType": "json"
        }

        message = "{} {}\n{}\n{}".format(http_method, base_url, timestamp, access_key)
        signingKey = bytes(secret_key, 'UTF-8')
        message_bytes = bytes(message, 'UTF-8')
        signature = base64.b64encode(hmac.new(signingKey, message_bytes, digestmod=hashlib.sha256).digest())
        signature_str = signature.decode('UTF-8')

        headers = {
            'x-ncp-apigw-timestamp': timestamp,
            'x-ncp-iam-access-key': access_key,
            'x-ncp-apigw-signature-v2': signature_str,
            'Content-Type': 'application/x-www-form-urlencoded'
        }

        url_full = "https://{}{}".format(host, base_url)

        # URL 출력
        print(f"\n리스너 생성 URL: {url_full}, 파라미터: {params}")

        response = requests.post(url_full, headers=headers, data=params)

        print(f"\n리스너 포트 {port}, 타겟 그룹 {target_group_no}에 대한 응답 상태 코드:", response.status_code)

        if response.status_code == 200:
            try:
                data = response.json()
                print(f"\n포트 {port}의 리스너 생성 성공:")
                print(json.dumps(data, indent=4, ensure_ascii=False))
                success = True  # 성공 플래그 설정
                time.sleep(50)  # 리스너 생성 성공 시 50초 대기
            except json.JSONDecodeError:
                print(f"\n포트 {port}의 리스너 생성 성공, 그러나 JSON 파싱에 실패했습니다.")
                print(response.text)
                success = False  # 성공했지만 파싱 실패
            break  # 성공 시 루프 종료
        else:
            print(f"\n포트 {port}의 리스너 생성 실패:")
            print(f"Status Code: {response.status_code}")
            try:
                error_data = response.json()
                print(json.dumps(error_data, indent=4, ensure_ascii=False))
            except json.JSONDecodeError:
                print(response.text)

            if response.status_code == 401 and "Expired timestamp" in error_data.get("message", ""):
                retries += 1
                print(f"재시도 중... ({retries}/{max_retries})")
                time.sleep(10)  # 재시도 간 대기 시간
            elif response.status_code == 400:
                print("로드 밸런서 인스턴스가 사용 중이지 않거나 잘못된 인스턴스 번호입니다. 확인이 필요합니다.")
                break  # 상태 코드 400 발생 시 루프 종료
            else:
                print("기타 오류 발생, 재시도 중...")
                retries += 1
                time.sleep(10)  # 대기 후 재시도

    if not success:
        print(f"\n포트 {port}의 리스너 생성 실패, 다음 포트로 넘어갑니다.")
        time.sleep(20)  # 포트 변경 전 대기 시간 추가

# 각 API 호출 간 지연 추가
time.sleep(70.0)  # 각 호출 후 50초 대기

[결론]

 

API가이드만 충실히 따르면 실행 잘 되네요. 상당히 쉽게 만들어놨습니다.
API 에러코드 또한 직관적으로 알 수 있어서 활용하기 좋습니다.

https://api.ncloud-docs.com/docs/api-overview

728x90
반응형

'클라우드' 카테고리의 다른 글

오픈스택(OpenStack) 설치 및 LBaas 사용(Feat. F5연동) - 1  (0) 2025.08.06
NCP Email 알람 못 받을 경우 해결 방법(Email 450 Error)  (0) 2025.05.12
NCP-AWS IPsec VPN 연결  (0) 2025.05.12
NCP(네이버클라우드) NetworkProxyLB를 활용한 FTP서버 설정2 - 파일질라 서버 설치(L3 DSR FTP)  (1) 2024.10.28
NCP(네이버클라우드) NetworkProxyLB를 활용한 FTP서버 설정  (3) 2024.09.24
'클라우드' 카테고리의 다른 글
  • NCP Email 알람 못 받을 경우 해결 방법(Email 450 Error)
  • NCP-AWS IPsec VPN 연결
  • NCP(네이버클라우드) NetworkProxyLB를 활용한 FTP서버 설정2 - 파일질라 서버 설치(L3 DSR FTP)
  • NCP(네이버클라우드) NetworkProxyLB를 활용한 FTP서버 설정
Royal!
Royal!
Bachelor of Arts. Bachelor of Science in Engineering. Master of Science in Engineering (In Progress). Job Title: Infrastructure & Security & Cloud Engineer. Etc: Mentor at Fourth Industrial Revolution Center.
  • Royal!
    Security
    Royal!
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 운영체제
      • 네트워크
      • 클라우드
      • 서버
        • Container
      • 보안
      • 프로그래밍
        • Python_혼자 끄적끄적
        • Python_AI(영상처리)
        • 빅데이터
        • C_정보올림피아드 Language_Coder
        • C_QnA
      • 자격증
        • 정보보안기사
        • 정보처리기사
        • ADsP
        • CPPG
        • 보안법률
        • NCA~NCP
        • AWS Certified Solutions Arc..
      • 기타
        • 면접일지
        • 기타 활동
        • 인턴활동
        • 논문 요약
        • Hackerschool FTZ
        • 리버싱 걸음마
      • 기타 교육
        • KISA 정보보호제품실습군
        • 빅데이터_분석실무
        • 시큐어코딩진단전문교육(호남정보보호센터)
        • SW테스트 전문가 과정(ISTQB CTFL자격)
        • 정보보호 컨설팅 전문가 양성과정
        • K-Shield Jr_악성코드분석
        • K-Shield Jr_침해사고분석
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SSRF 완화방법
    F5 SSRF
    nce덤프
    WAF SSRF
    SSRF 방어방법
    왓콘
    F5
    proxy protocol
    지그립토
    블록체인
    행정기반서비스
    F5 LBaaS
    F5 AWAF
    openstack F5연동
    리드포인트시스템
    openstack lbaas
    LBaaS
    proxy protocol 설정
    openstack설치
    F5 WAF
    네이버클라우드 ftp 설정
    LBaaS설치
    SSRF 막는 방법
    openstack LBaaS설치
    2025블록체인누리단
    nce dump
    ai
    SSRF란
    AuroraPay
    수호아이오
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Royal!
API를 활용한 네이버클라우드 Target group 조회/생성/적용
상단으로

티스토리툴바