[이렇게 사용하세요!] 네이버 클라우드 플랫폼 유저 API 활용 방법 — 1편
누구나 쉽게 시작하는 클라우드
네이버 클라우드 플랫폼 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 생성 -> 서버 생성
글이 길어 질 수 있어 해당 부분은 아래 링크를 참고해주세요.
네이버 클라우드 플랫폼 API 활용하기 방법은 온라인 무료교육 영상으로도 살펴보실 수 있습니다.
네이버 클라우드 플랫폼은 앞으로도 사용자 여러분이 다양한 방법으로 클라우드 서비스를 활용하실 수 있도록 노력하겠습니다.
* 본 포스팅과 관련된 궁금증은 댓글로 남겨주시면 답변드리겠습니다.