NHN Cloud

NHN 클라우드 -> 토큰 ID 생성 -> Security Group 생성 -> 엑셀 파일 import로 Security Group Rule 추가하기 - API 활용 - 파이썬

앙뚱이 2023. 4. 7. 13:45

클라우드 콘솔에서 많은 acl rule을 하나하나 넣는 것은 너무 힘들다

 

그래서!!

 

NHN 클라우드 API 활용하여 NACL과 SG Rule를 추가하려 했는데 NACL은 API를 지원하지 않는다..

SG Rule이라도.. 만들기로 했다.

 

일단 순서는 다음과 같다.

 

- 순서

1. requests 헤더에 넣을 토큰 ID 생성

2. Security Group 생성

3. 엑셀 파일을 json으로 변환

4. 변환한 json으로 rule 추가 요청

 

1. requests 헤더에 넣을 토큰ID 생성

NHN 클라우드는 API를 이용하려면 프로젝트에 종속적인 토큰ID를 생성해서 이용해야한다.

프로젝트가 여러개라면... 토큰 ID를 여러개 생성 해야하는건가...ㅠ

 

쨌든, 

아래 링크는 nhn 클라우드에서 제공하는 토큰값 생성 가이드이다.

https://docs.nhncloud.com/ko/Compute/Compute/ko/identity-api/

 

API 사용 준비 - NHN Cloud 사용자 가이드

API v2 사용 준비 공통 준비 사항 API 엔드포인트 확인 NHN Cloud 기본 인프라 서비스 API는 타입과 리전별로 엔드포인트가 나뉘어 있습니다. 단, Identity API는 모든 리전에서 동일한 엔드포인트를 사용

docs.nhncloud.com

저 가이드에서

테넌트 아이디, API URL, API 비밀번호

를 설정하여 가져와 저 아래 코드에 Insert한다.

 

------토큰 ID 생성 코드------

# API를 사용하기 위해 Request 모듈을 사용했다.
import requests

# 요청과 리스판스 모두 json 형식이기 때문에 json 모듈도 import 해준다.
import json

# 토큰 ID 생성을 위한 API URL
url = 'https://api-identity-infrastructure.nhncloudservice.com/v2.0/tokens'


# Request 요청 바디에 넣을 json 형식의 데이터, 이곳에 가이드에서 가져온 값들을 넣어준다.
data = {
    "auth": {
        "tenantId":"테넌트 아이디",
        "passwordCredentials":{
            "username": "나의 NHN 콘솔 계정",
            "password": "API 비밀번호"
        }
        
            }
        }
        
# URL과 json값을 넣어 요청
response = requests.post(url, json=data)

# Response값을 파이썬 깩체로 변환 -> 토큰 ID 값을 추출하여 WhatToken에 저장 및 출력
datas=json.loads(response.text)
WhatToken=datas['access']['token']['id']
print(WhatToken)

 

 

2. Security Group 생성

아래는 nhn 클라우드에서 제공하는 SG 생성 가이드다.

필요한 요소은.. 일단 url, tokenid, descripton, name 이고 name하고 디스크립션은 사용자가 입력하는 데이터로 요청하기로 하자

토큰 id는 토큰 생성 코드에서 가져오도록 하자. url은 가이드에 있고.

------SG 생성 코드------

import requests
import json
# 토큰 생성 코드에서 받은 toeknid 값을 가져온다.
from GetToken import WhatToken

# 보안그룹 이름을 두번 입력받는다
SGname1 = input("보안그룹 이름을 입력하세요: ")
SGname2 = input("보안그룹 이름을 다시 입력하세요: ")

# 보안그룹 이름을 두번 입력받아 비교한다... 왜냐면 오타의 소지가 있어보인다...
# 두 이름이 같다면 SGname이라는 변수에 입력받은 값을 넣고 디스크립션을 입력받는다.
if SGname1!=SGname2 :
    print("이름이 틀립니다")
else :
    SGname=SGname1
    description=input("생성하려는 보안 그룹의 description을 적으시오: ")
    
# API 요청에 필요한 URL, Header, Data 준비하도록 한다. 헤더값엔 토큰 ID값을 넣어준다.
url = 'https://kr1-api-network-infrastructure.nhncloudservice.com/v2.0/security-groups'
headers = {
    "X-Auth-Token":WhatToken
    }
data = {
    "security_group": {
        "name": SGname,
        "description": description
    }
        }

# API 요청 보내기
response = requests.post(url, json=data, headers=headers)

# 응답 데이터에서 보안그룹 ID 추출
print(response.text)
datas = json.loads(response.text)
securityid = datas['security_group']['id']

# 보안그룹 ID 출력
print(f"{SGname} 보안그룹 ID: {securityid}")

 

 

 

3. 엑셀 파일을 json으로 변환

엑셀 파일은 json 형식으로 변환 하기위해 pandas pd를 사용하였고 이전 코드에서 securityid를 가져왔다.

그리고 각 행마다 하나의 객체로 rule을 만들어서 리스트에 넣은 다음  for 문으로 각각의 rule을 api로 요청하였다.

 

# excel -> json으로 변환하기 위한 모듈
import pandas as pd

import json
import requests

# rule을 넣을 sg의 securityid와 tokenid 값을 가져오도록 한다.
from CreateSecurityGroup import securityid
from GetToken import WhatToken

# 엑셀 파일 경로를 입력 받는다.
path=input("엑셀 파일 경로와 이름을 입력하시오 : ")

# 엑셀 파일을 읽어서 df에 저장한다.
df = pd.read_excel(path)

# 각각의 행을 객체로써 json 형태로 저장할 리스트 생성.
security_rules=[]

# 각각의 행을 리스트에 추가.
for index, row in df.iterrows():
    rule={
        "security_group_rule":{
            "direction":row["ingress/egress"],
            "port_range_min":row["Port_min"],
            "port_range_max":row["Port_max"],
            "protocol":row["Protocol"],
            "remote_ip_prefix":row["IP/CIDR"],
            "security_group_id":securityid,
            "description":row["Description"]
        }
    }
    security_rules.append(rule)
    
    
# 헤더값과 rule 추가 url
url = 'https://kr1-api-network-infrastructure.nhncloudservice.com/v2.0/security-group-rules'
headers={
    "X-Auth-Token":WhatToken
}

# security_rules 넣은 데이터값을 헤더값과 함께 for으로 돌려 요청한다.
for i in security_rules:
    response = requests.post(url, json=i, headers=headers)
    if response.status_code==201:
        print("생성 중...")
    else :
        print("실패")

print("완료 되었습니다.")

이걸 따라하면 손쉽게 엑셀 파일로 security rule 추가할 수 있게 된다.

졸립당