[이렇게 사용하세요!] 네이버 클라우드 플랫폼 유저 API 활용 방법 — 1편

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM
15 min readMay 20, 2021

--

누구나 쉽게 시작하는 클라우드

네이버 클라우드 플랫폼 ncloud.com 입니다.

* 본 기술 포스팅은 네이버클라우드 Cloud Development 정금영 님의 작성글입니다.

네이버 클라우드 플랫폼에 유저 API가 있다는 것을 알고 계셨나요? 유저API를 이용하면, 콘솔에 접속하지 않고 클라우드 서비스를 이용 할 수 있습니다.

네이버 클라우드 플랫폼(ncloud.com)은 Compute, Storage, Database, Networking, Security, Management 등 많은 상품군에서 유저 API를 제공하고 있습니다.

유저 API는 이럴 때 유용하게 사용할 수 있어요.

  • 내 서비스와 새로운 기능을 연동하여시너지를 내고 싶을 때
  • 원하는 데이터를 모아서 한 번에 정제하고 싶을 때

그렇다면 어떻게 유저 API를 사용 할 수 있을까요?

지금부터 자세히 설명 드리겠습니다.

유저 API는 가이드센터 아래에서 찾을 수 있습니다. ( API참조서 버튼! )

버튼을 클릭하면 API 참조서 페이지로 이동합니다.

[ ncloud.com 포털 API 참조서 바로가기 버튼 ]

API 참조서 페이지로 이동하면, 네이버 클라우드 플랫폼에서 제공하는 유저 API 목록들을 만나 볼 수 있습니다.

[ API 참조서 메인페이지 ]

하나하나 살펴보시면 연동 방법과 사용 방법을 익히며 다양한 API를 사용하실 수 있을 거예요.

자, 그럼 이제 구체적 사례를 설명 드릴게요.

다양한 유저 API 중, 오늘은 VPC 생성부터 VPC Server 생성까지 과정을 예제로 쉽게 설명 드리겠습니다.

VPC 서버를 생성하기 아래와 같은 순서가 필요합니다.

VPC 생성 -> Subnet 생성 -> Login Key 생성 -> 서버 생성

여기에 필요한 유저 API들을 찾아 볼까요?

Compute > Server (on VPC) > Server > Common

  • getRegionList : VPC 이용 가능한 Region 정보를 가져오기 위한 유저 API
  • getZoneList : VPC 이용 가능한 Zone 정보를 가져오기 위한 유저 API

Compute > Server (on VPC) > Server > Login Key

  • createLoginKey : 서버에 접속을 위한 로그인키 생성을 위한 유저 API

Compute > Server (on VPC) > ACG

  • createAccessControlGroup : ACG 를 생성하기 위한 유저 API

Compute > Server (on VPC) > Server

  • getServerImageProductList : 서버 이미지 상품 코드 획득 API
  • createServerInstances: VPC 서버 생성을 위한 유저 API
  • getServerInstanceDetail : VPC 서버 상태를 확인하기 위한 유저 API

Networking > VPC > VPC Management

  • createVpc : VPC 생성하기 위한 유저 API
  • getVpcDetail : VPC 상태를 확인하기 위한 유저 API

Networking > VPC > Network ACL

  • getNetworkAclList : Network ACL 정보를 가져오기 위한 유저 API

Networking > VPC > Subnet Management

  • createSubnet : VPC Subnet을 생성하기 위한 유저 API
  • getSubnetDetail : VPC Subnet 상태를 확인하기 위한 유저 API

여기까지 VPC 생성에 필요한 API들을 정리해보았는데요.

이제 가이드를 보고 실제 연동을 해보도록 하겠습니다.

우선 내 계정의 인증키를 먼저 확인해야 합니다!

인증키는 [ 마이페이지 > 계정관리 > 인증키 관리 ] 메뉴에서 확인할 수 있습니다.

[ 인증키 관리 페이지 버튼 ]

아래와 같이 인증키 관리 화면에서 Access Key ID와 Secret Key를 확인해 보세요.

[ 인증키 관리 화면 ]

Access Key ID와 Secret Key를 확인하셨으면 본격적으로 연동을 위한 준비를 해보겠습니다.

유저 API 사용에 있어서 Compute, Network API의 경우 Signature를 만드는 방법과 Get Parameter에 붙이는게 중요합니다.

가이드를 참고하여 좀 더 쉽게 예제를 준비해 보았습니다.

Signature 만들기!

import java.nio.charset.Charset;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
public class BaseService {
@Autowired
protected RestTemplate restTemplate;
private String accessKey = ""; // 인증키 관리에서 확인한 Access key ID 를 넣어주세요
private String secretKey = ""; // 인증키 관리에서 확인한 Secret Key 를 넣어주세요
private String makeSignature(String timeStamp, String method, String url) throws Exception {
String message = new StringBuilder()
.append(method)
.append(" ")
.append(url)
.append("\n")
.append(timeStamp)
.append("\n")
.append(accessKey)
.toString();
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
String encodeBase64String = Base64.encodeBase64String(rawHmac);
return encodeBase64String;
}
protected HttpHeaders getNcloudUserApiHeader(HttpMethod method, String url) {
try {
MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
String timeStamp = String.valueOf(System.currentTimeMillis());
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("x-ncp-apigw-timestamp", timeStamp);
httpHeaders.add("x-ncp-iam-access-key", accessKey);
httpHeaders.add("x-ncp-apigw-signature-v2", makeSignature(timeStamp, method.name(), url));
httpHeaders.setContentType(mediaType); return httpHeaders;
} catch (Exception ex) {
return null;
}
}
}

호출을 위한 path 그리고 x-ncp-apigw-signature-v2에 들어갈 값 만들기!

import java.util.List;
import java.util.Map;
import org.springframework.web.util.UriComponentsBuilder;import com.fasterxml.jackson.core.type.TypeReference;public class OpenApiUtils {
public static String getOpenApiUrl(String uri, Object requestDto) {
final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
return uriAndParamMerge(uriBuilder, "", requestDto).toUriString() + "&responseFormatType=json"; // 편의를 위해 json으로 하였습니다. Xml도 지원합니다!
}
private static UriComponentsBuilder uriAndParamMerge(UriComponentsBuilder uriBuilder, String keyPrefix, final Object getParameters) {
final Map<String, Object> map = ApplicationContextUtils.getObjectMapper().convertValue(getParameters, new TypeReference<Map>() {
});
for (final Map.Entry<String, Object> entry : map.entrySet()) {
final Object value = entry.getValue();
if (value instanceof List) {
final List<Map> list = ApplicationContextUtils.getObjectMapper().convertValue(value, new TypeReference<List>() {
});
for (int i=0; i < list.size(); i++) {
if (list.get(i) instanceof Map) {
uriBuilder = uriAndParamMerge(uriBuilder, keyPrefix + entry.getKey() + "." + (i+1) + ".", list.get(i));
} else {
uriBuilder = uriBuilder.replaceQueryParam(keyPrefix + entry.getKey() + "." + (i+1), list.get(i));
}
}
} else {
uriBuilder = uriBuilder.replaceQueryParam(keyPrefix + entry.getKey(), value);
}
}
return uriBuilder;
}
}

활용해보기!

CreateVpcRequestDto

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CreateVpcRequestDto {
private String regionCode;
private String vpcName;
private String ipv4CidrBlock;
}

CreateVpcResponseDto

import java.util.List;import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CreateVpcResponseDto {
private CreateVpcRawResponseDto createVpcResponse;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class CreateVpcRawResponseDto {
private List<VpcInstanceDto> vpcList;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class VpcInstanceDto {
private String vpcNo;
private String vpcName;
}
}

VpcService

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
// path에 맞게 import 해주세요.
import CreateVpcRequestDto;
import CreateVpcResponseDto;
import BaseService;
import OpenApiUtils;
public class VpcService extends BaseService {
private String vpcServerHost = "https://ncloud.apigw.ntruss.com";
public CreateVpcResponseDto createVpc(final CreateVpcRequestDto requestDto) {
final String uri = OpenApiUtils.getOpenApiUrl("/vpc/v2/createVpc", requestDto);
return restTemplate.exchange(vpcServerHost + uri, HttpMethod.GET, new HttpEntity(getNcloudUserApiHeader(HttpMethod.GET, uri)), CreateVpcResponseDto.class).getBody();
}
}

위 예제를 따라오셨다면 유저 API를 활용한 VPC 생성이 완료 되었을 것입니다.

축하합니다!

이제부터는 여러 유저 API를 호출하는 반복인데요.

서버를 생성하기 위해선 아래와 같이 호출이 필요합니다.

*일부 Code를 가져오기 위한 작업은 생략합니다.

VPC 생성(createVpc) -> Subnet 생성(createSubnet) -> Login Key 생성 (createLoginKey) -> ACG 생성 -> 서버 생성

글이 길어 질 수 있어 해당 부분은 아래 링크를 참고해주세요.

GitHub 바로가기

네이버 클라우드 플랫폼 API 활용하기 방법은 온라인 무료교육 영상으로도 살펴보실 수 있습니다.

네이버 클라우드 플랫폼은 앞으로도 사용자 여러분이 다양한 방법으로 클라우드 서비스를 활용하실 수 있도록 노력하겠습니다.

* 본 포스팅과 관련된 궁금증은 댓글로 남겨주시면 답변드리겠습니다.

--

--

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM

We provide cloud-based information technology services for industry leaders from startups to enterprises.