네이버 클라우드 플랫폼 API 시작 가이드 개요

이 가이드에서는 간단한 시나리오를 따라 서버를 생성한 후 로드밸런서를 생성하고 서버를 바인드합니다. 이 과정에서 네이버 클라우드 플랫폼 서버/로드밸런서 API 사용법을 익힐 수 있습니다.

자세한 내용은 네이버 클라우드 플랫폼 서버-로드밸런서 API reference를 참고하시기 바랍니다.

시나리오 설명

서버를 생성하고, 생성 시 userData를 통해서 httpd 서버를 띄워 로드밸런서에 바인드합니다.

서버 이미지 상품 조회

상품 조회를 통해서 서버 이미지 상품 코드를 획득합니다.

로그인키 생성

로그인키가 생성되어 있지 않은 경우 서버 인스턴스 생성 시 오류가 발생하므로, 로그인키 생성 API를 통해 로그인키를 생성해 두도록 합니다.

서버 인스턴스 생성

서버 인스턴스를 생성합니다.

생성 시 userData를 이용하여, httpd 서버를 띄우고 l7HealthCheckPath URL을 생성해 놓습니다.

서버 인스턴스가 생성되면, 네이버 클라우드 플랫폼 관리 콘솔을 통해 서버에 접속해 보고, httpd 데몬이 실행되었는지 확인해 본 후 l7HealthCheckPath URL을 수행하여, 정상적으로 데몬이 실행 상태인지 확인해 봅니다.

로드밸런서 인스턴스 생성/바인드

로드밸런서 인스턴스를 생성합니다. 생성 시 위에서 생성한 서버에 바인드합니다.

생성 시 HTTP 80 포트에 l7HealthCheckPath을 서버 인스턴스 생성 시 userData로 입력했던 URL로 입력해 둡니다.

생성이 완료된 이후 로드밸런서와 서버가 정상적으로 통신되고 있는지 체크해 보고, 최종적으로 로드밸런서를 통해서 서버에 통신해 봅니다.

인증

이 장에서는 시나리오 수행을 위한 인증 URL을 만드는 과정을 살펴보겠습니다.

Java 샘플 코드로 작성되었고, GET 방식의 http request method를 사용하여 요청하는 방식으로 작성되었습니다. 실제 요청 시에는 GET 방식으로 요청하는 것보다 POST 방식으로 request body에 값을 넣어서 요청하는 것을 추천합니다.

인증 URL 생성

인증키를 생성하기 위해서 아래와 같은 절차를 따릅니다.

base string 생성

  1. 액션파라미터에 base string 생성에 필요한 인증 파라미터를 추가
  2. 요청파라미터와 value 값을 알파벳 순으로 정렬
  3. base string = RequestMethod + '&' + oauthEncode(requestUrl) + '&' + oauthEncode(queryString)

서명서 생성

Secret Key와 위에서 생성한 baseString을 가지고 HMAC SHA-1 해시 알고리즘을 이용하여 서명서를 생성합니다.

요청 URL 생성

서명서까지 생성이 완료되었으면, 요청 URL을 생성하여, API를 요청합니다.

OAuth 외부 라이브러리를 이용하여, authorization 헤더에 authparams 포함하여 쉽게 요청할 수도 있습니다. 자세한 사항은 OAuth 이용 가이드를 참고하시기 바랍니다.

signpost-core 라이브러리: http://code.google.com/p/oauth-signpost/wiki/GettingStarted

요청 URL 생성 Java 코드 예

아래는 요청 URL을 생성하는 Java 코드 예입니다.
해당 코드는 commons-codec-1.4.jar 라이브러리에 dependency를 가집니다. 따라서 아래 코드를 수행하기 위해서는 해당 jar가 자신의 build path에 추가되어야 합니다.

해당 jar는 간단하게 google.com이나 naver.com에서 검색하여 다운로드할 수 도 있고, 네이버 클라우드 플랫폼 라이브러리에서 dependency 항목으로 함께 제공됩니다.

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.net.URLCodec;

/**
* @author admin
*/
public class OAuthMain {
  private static String consumerKey = "CCe2T0ilv4aO3kIevT3x";
  private static String consumerSecret = "UXbllHzrAVV7rmcE270sESJZa3Fh8I2kOiBTf0oE";

  public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
    String requestMethod = "GET";
    String requestUrl = "https://api.ncloud.com";
    String serverNameSpace = "/server/";
    String loadBalancerNameSpace = "/loadbalancer/";

    Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
    requestParameters.put("action", Arrays.asList("getServerImageProductList"));
    requestParameters.put("platformTypeCodeList.1", Arrays.asList("LNX64"));
    requestParameters.put("responseFormatType", Arrays.asList("xml"));

    SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
    String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
    String signature = sign(signatureBaseString, consumerSecret);
    String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
    System.out.println(requestFullUrl);
  }

    /**
    * signature base string을 만들기 위한 significateParameter 설정
    * @param requestParameters
    * @param consumerKey
    * @return
    */
  private static SortedMap<String, SortedSet<String>> getSignificateParametersForSiganturBaseString(Map<String, List<String>> requestParameters, String consumerKey) {
    SortedMap<String, SortedSet<String>> significateParameters = convertTypeToSortedMap(requestParameters);

    SortedSet<String> consumerKeySet = new TreeSet<String>();
    consumerKeySet.add(consumerKey);
    significateParameters.put("oauth_consumer_key", consumerKeySet);

    SortedSet<String> nonceSet = new TreeSet<String>();
    nonceSet.add(generateNonce());
    significateParameters.put("oauth_nonce", nonceSet);

    SortedSet<String> signatureMethodSet = new TreeSet<String>();
    signatureMethodSet.add("HMAC-SHA1");
    significateParameters.put("oauth_signature_method", signatureMethodSet);

    SortedSet<String> timestampSet = new TreeSet<String>();
    timestampSet.add(generateTimestamp());
    significateParameters.put("oauth_timestamp", timestampSet);

    SortedSet<String> versionSet = new TreeSet<String>();
    versionSet.add("1.0");
    significateParameters.put("oauth_version", versionSet);

    return significateParameters;
  }

    /**
    * @param requestParameters
    * @param significateParameters
    */
  private static SortedMap<String, SortedSet<String>> convertTypeToSortedMap(Map<String, List<String>> requestParameters) {
    SortedMap<String, SortedSet<String>> significateParameters = new TreeMap<String, SortedSet<String>>();
    Iterator<String> parameterNames = requestParameters.keySet().iterator();
    while (parameterNames.hasNext()) {
      String parameterName = (String)parameterNames.next();
      List<String> parameterValues = requestParameters.get(parameterName);
      if (parameterValues == null) {
        parameterValues = new ArrayList<String>();
      }

      for (String parameterValue : parameterValues) {
        if (parameterValue == null) {
          parameterValue = "";
        }

        SortedSet<String> significantValues = significateParameters.get(parameterName);
        if (significantValues == null) {
          significantValues = new TreeSet<String>();
          significateParameters.put(parameterName, significantValues);
        }
        significantValues.add(parameterValue);
      }

    }
    return significateParameters;
  }

    /**
    * @param url
    * @return
    */
  private static String normalizeUrl(String url) {
    try {
      URL requestURL = new URL(url);
      StringBuilder normalized = new StringBuilder(requestURL.getProtocol().toLowerCase()).append("://").append(requestURL.getHost().toLowerCase());
      if ((requestURL.getPort() >= 0) && (requestURL.getPort() != requestURL.getDefaultPort())) {
        normalized.append(":").append(requestURL.getPort());
      }
      normalized.append(requestURL.getPath());
      return normalized.toString();
    } catch (MalformedURLException e) {
      throw new IllegalStateException("Illegal URL for calculating the OAuth signature.", e);
    }
  }

  private static String generateTimestamp() {
    return Long.toString(System.currentTimeMillis() / 1000L);
  }

  private static String generateNonce() {
    return Long.toString((new Random()).nextLong());
  }

  /**
    * base string 생성
    * @param requestMethod
    * @param requestUrl
    * @param significantParameters
    * @return
    */
  private static String makeSignatureBaseString(String requestMethod, String requestUrl, SortedMap<String, SortedSet<String>> significantParameters) {
    StringBuilder queryString = getRequestQueryString(significantParameters);

    requestUrl = normalizeUrl(requestUrl);
    requestUrl = OAuthCodec2.oauthEncode(requestUrl);

    return new StringBuilder(requestMethod.toUpperCase()).append('&').append(requestUrl).append('&').append(OAuthCodec2.oauthEncode(queryString.toString())).toString();
  }

    /**
    * query string 생성
    * @param significantParameters
    * @return
    */
  private static StringBuilder getRequestQueryString(SortedMap<String, SortedSet<String>> significantParameters) {
    StringBuilder queryString = new StringBuilder();
    Iterator<Map.Entry<String, SortedSet<String>>> paramIt = significantParameters.entrySet().iterator();
    while (paramIt.hasNext()) {
      Map.Entry<String, SortedSet<String>> sortedParameter = paramIt.next();
      Iterator<String> valueIt = sortedParameter.getValue().iterator();
      while (valueIt.hasNext()) {
        String parameterValue = valueIt.next();
        queryString.append(OAuthCodec2.oauthEncode(sortedParameter.getKey())).append('=').append(OAuthCodec2.oauthEncode(parameterValue));
        if (paramIt.hasNext() || valueIt.hasNext()) {
          queryString.append('&');
        }
      }
    }
    return queryString;
  }

  /**
    * base string과 consumer secret key를 가지고 signature 생성
    * @param signatureBaseString
    * @param consumerSecret
    * @return
    * @throws NoSuchAlgorithmException
    * @throws UnsupportedEncodingException
    * @throws InvalidKeyException
    */
  private static String sign(String signatureBaseString, String consumerSecret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
    Mac mac = Mac.getInstance("HmacSHA1");
    SecretKeySpec spec = new SecretKeySpec(new String(consumerSecret + "&").getBytes("UTF-8"), "HmacSHA1");
    mac.init(spec);
    byte text[] = signatureBaseString.getBytes("UTF-8");
    byte signatureBytes[] = mac.doFinal(text);
    signatureBytes = Base64.encodeBase64(signatureBytes);
    String signature = new String(signatureBytes, "UTF-8");
    return signature;
  }

    /**
    * request URL 생성
    * @param requestParameters
    * @param signature
    * @return
    * @throws UnsupportedEncodingException
    */
  private static String makeRequestUrl(String requestUrl, SortedMap<String, SortedSet<String>> significantParameters, String signature) throws UnsupportedEncodingException {
    StringBuilder queryString = getRequestQueryString(significantParameters);
    queryString.append('&').append("oauth_signature").append("=").append(URLEncoder.encode(signature, "UTF-8"));
    return new StringBuffer(requestUrl).append("?").append(queryString.toString()).toString();
  }
}

class OAuthCodec2 extends URLCodec {

  private OAuthCodec2() {
  }

  public static String oauthEncode(String value) {
    if (value == null)
      return "";
    try {
      return new String(URLCodec.encodeUrl(SAFE_CHARACTERS, value.getBytes("UTF-8")), "US-ASCII");
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }
  }

  public static String oauthDecode(String value) throws DecoderException {
    if (value == null)
      return "";
    try {
      return new String(URLCodec.decodeUrl(value.getBytes("US-ASCII")), "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }
  }

  protected static final BitSet SAFE_CHARACTERS;

  static {
    SAFE_CHARACTERS = (BitSet)URLCodec.WWW_FORM_URL.clone();
    SAFE_CHARACTERS.clear(42);
    SAFE_CHARACTERS.clear(32);
    SAFE_CHARACTERS.set(126);
  }
}

main 메서드를 수행하면, 인증 URL이 포함된 아래와 같은 요청 URL을 볼 수 있습니다.

https://api.ncloud.com/server/?action=getServerImageProductList&oauth_consumer_key=7XwLfoAgCmToVU7w1Ba7&oauth_nonce=-4375476794962474999&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1392974756&oauth_version=1.0&platformTypeCodeList.1=LNX64&responseFormatType=xml&oauth_signature=JEt3O7HZ7skXXUIaYVWpzecNKK8%3D

사용자는 마이페이지 > API 인증키 관리 화면에서 Access Key, Secret Key를 발급받고, 위의 예제에서 consumerKey, consumerSecret 값을 해당 값으로 변경 후 테스트해야 합니다.

서버의 경우 /server/, 로드밸런서의 경우 /loadbalancer/의 namespace가 붙으니 참고하시기 바랍니다.

해당 URL을 복사하여, 브라우저로 요청하면 아래와 같은 결과를 볼 수 있습니다.

시나리오 수행

시나리오 수행 방법을 언급합니다. 모든 시나리오는 인증의 샘플코드 방식으로 설명되며, main 메서드의 파라미터 부분에 대해서만 설명합니다.

필요 정보

서버 인스턴스를 생성하기 위해서는 반드시 2개의 정보가 필요합니다. 첫 번째는 서버 이미지 상품 코드이고, 두 번째는 로그인키입니다. 서버 이미지 상품 코드는 서버의 OS를 결정하는 값이고, 로그인키는 서버의 패스워드를 암호화하기 위해 필요한 정보입니다.

서버명, 서버스펙, AccessControlGroup설정번호, 요금제, 존의 경우에는 모두 default로 설정됩니다.

서버 이미지 상품 조회

상품 조회를 통해서 서버 이미지 상품 코드를 획득합니다. Centos6.3 64Bit 이미지를 찾아봅니다. 이 예제에서는 플랫폼 타입 코드가 Linux 64 Bit (LNX64)인 이미지 상품을 찾아봅니다.

요청 URL 생성

  • 액션
    • getServerImageProductList
  • 액션 파라미터

    • platformTypeCodeList.1 : LNX64

      public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
      String requestMethod = "GET";
      String requestUrl = "https://api.ncloud.com";
      String serverNameSpace = "/server/";
      String loadBalancerNameSpace = "/loadbalancer/";
      
      Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
      requestParameters.put("action", Arrays.asList("getServerImageProductList"));
      requestParameters.put("platformTypeCodeList.1", Arrays.asList("LNX64"));
      requestParameters.put("responseFormatType", Arrays.asList("xml"));
      
      SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
      String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
      String signature = sign(signatureBaseString, consumerSecret);
      String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
      System.out.println(requestFullUrl);
      }
      

결과

https://api.ncloud.com/server/?action=getServerImageProductList&oauth_consumer_key=7XwLfoAgCmToVU7w1Ba7&oauth_nonce=-4375476794962474999&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1392974756&oauth_version=1.0&platformTypeCodeList.1=LNX64&responseFormatType=xml&oauth_signature=JEt3O7HZ7skXXUIaYVWpzecNKK8%3D

결과 수행

아래처럼 2건이 조회되었고, Centos6.3 64Bit의 상품 코드는 SPSW0LINUX000031임을 알 수 있습니다.

로그인키 생성

서버의 접속 패스워드를 알아내기 위해서 공개키를 이용하여, 패스워드를 암호화합니다. 사용자는 로그인키 생성 시 발급된 비공개키를 이용하여, 암호화된 패스워드를 복호화하여, 서버의 패스워드를 알아낼 수 있습니다.

요청 URL 생성

  • 액션
    • createLoginKey
  • 액션 파라미터

    • keyName : my-first-key

      public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
      String requestMethod = "GET";
      String requestUrl = "https://api.ncloud.com";
      String serverNameSpace = "/server/";
      String loadBalancerNameSpace = "/loadbalancer/";
      
      Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
      requestParameters.put("action", Arrays.asList("createLoginKey"));
      requestParameters.put("keyName", Arrays.asList("my-first-key"));
      requestParameters.put("responseFormatType", Arrays.asList("xml"));
      
      SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
      String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
      String signature = sign(signatureBaseString, consumerSecret);
      String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
      System.out.println(requestFullUrl);
       }
      

결과

https://api.ncloud.com/server/?action=createLoginKey&keyName=my-first-key&oauth_consumer_key=7XwLfoAgCmToVU7w1Ba7&oauth_nonce=7150129439378304669&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1392975247&oauth_version=1.0&responseFormatType=xml&oauth_signature=DqvfOjRpb9EJz%2F3sv0EwDGxzpbM%3D

결과 수행

아래처럼 privateKey가 발급될 것을 확인할 수 있습니다. 서버의 패스워드를 알아내기 위해서 사용하니, privateKey를 확장자 .pem 파일로 저장합니다(띄어쓰기에 주의).

서버 인스턴스 생성

서버 인스턴스를 생성합니다.

생성 시 userData를 이용하여, httpd 서버를 띄우고 l7HealthCheckPath URL을 생성해 놓습니다.

서버 인스턴스가 생성되면, 네이버 클라우드 플랫폼 관리 콘솔을 통해 서버에 접속해 보고, httpd 데몬이 실행되었는지 확인해 본 후 l7HealthCheckPath URL을 수행하여, 정상적으로 데몬이 실행 상태인지 확인해 봅니다.

userData의 경우 Base64 인코딩합니다.

서버 생성 요청 URL 생성

  • 액션
    • createServerInstances
  • 액션 파라미터

    • serverImageProductCode : SPSW0LINUX000031
    • loginKeyName : my-first-key
    • serverName : my-first-server
    • userData : "#!/bin/sh" + System.getProperty("line.separator") + "yum install -y httpd" + System.getProperty("line.separator") + "touch /var/www/html/l7check.html" + System.getProperty("line.separator") + "chkconfig --level 2345 httpd on"

      public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
      String requestMethod = "GET";
      String requestUrl = "https://api.네이버 클라우드 플랫폼.com";
      String serverNameSpace = "/server/";
      String loadBalancerNameSpace = "/loadbalancer/";
      
      Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
      requestParameters.put("action", Arrays.asList("createServerInstances"));
      requestParameters.put("serverImageProductCode", Arrays.asList("SPSW0LINUX000031"));
      requestParameters.put("loginKeyName", Arrays.asList("my-first-key"));
      requestParameters.put("serverName", Arrays.asList("my-first-server"));
      String userData = "#!/bin/sh" + System.getProperty("line.separator") + "yum install -y httpd" + System.getProperty("line.separator") + "touch /var/www/html/l7check.html" + System.getProperty("line.separator")
        + "chkconfig --level 2345 httpd on";
      requestParameters.put("userData", Arrays.asList(Base64.encodeBase64String(userData.getBytes())));
      
      requestParameters.put("responseFormatType", Arrays.asList("xml"));
      
      SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
      String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
      String signature = sign(signatureBaseString, consumerSecret);
      String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
      System.out.println(requestFullUrl);
        }
      

서버 생성 URL 생성 결과

https://api.ncloud.com/server/?action=createLoginKey&keyName=my-first-key&oauth_consumer_key=7XwLfoAgCmToVU7w1Ba7&oauth_nonce=7150129439378304669&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1392975247&oauth_version=1.0&responseFormatType=xml&oauth_signature=DqvfOjRpb9EJz%2F3sv0EwDGxzpbM%3D

서버 생성 결과 수행

아래처럼 서버 생성 요청이 성공했습니다. 서버 인스턴스 번호는 43607이라는 것을 알 수 있습니다.

공인 IP 생성

공인 IP 하나를 생성하여 서버에 접속해 봅니다.
서버가 생성이 완료되었으면, 공인 IP를 생성 후 서버에 할당하여, 공인 IP로 서버에 접속해 봅니다. 이곳에서는 공인 IP 생성에 대한 부분은 생략합니다. 서버에 할당하기 위해서 공인 IP를 조회합니다.

  • 액션
    • getPublicIpInstanceList
  • 액션 파라미터

    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
      String requestMethod = "GET";
      String requestUrl = "https://api.ncloud.com";
      String serverNameSpace = "/server/";
      String loadBalancerNameSpace = "/loadbalancer/";
    
      Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
      requestParameters.put("action", Arrays.asList("getPublicIpInstanceList"));
      requestParameters.put("responseFormatType", Arrays.asList("xml"));
    
      SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
      String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
      String signature = sign(signatureBaseString, consumerSecret);
      String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
      System.out.println(requestFullUrl);
    }
    

공인 IP 조회 URL 생성 결과

https://api.ncloud.com/server/?action=getPublicIpInstanceList&oauth_consumer_key=CCe2T0ilv4aO3kIevT3x&oauth_nonce=8733732594971233414&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1428051790&oauth_version=1.0&responseFormatType=xml&oauth_signature=XduU7%2B%2FWpzIBYcpzV9dps1ElBI0%3D

공인 IP 조회 결과 수행

아래처럼 공인 IP 조회가 성공되었습니다. 공인 IP 인스턴스 번호는 273772이라는 것을 알 수 있습니다.

공인 IP를 서버에 할당

위에서 조회한 공인 IP를 서버에 할당해 봅니다.

  • 액션
    • associatePublicIpWithServerInstance
  • 액션 파라미터

    • serverInstanceNo : 43607
    • publicIpInstanceNo : 273772

      public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
      String requestMethod = "GET";
      String requestUrl = "https://api.ncloud.com";
      String serverNameSpace = "/server/";
      String loadBalancerNameSpace = "/loadbalancer/";
      
      Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
      requestParameters.put("action", Arrays.asList("associatePublicIpWithServerInstance"));
      requestParameters.put("serverInstanceNo", Arrays.asList("43607"));
      requestParameters.put("publicIpInstanceNo", Arrays.asList("43606"));
      requestParameters.put("responseFormatType", Arrays.asList("xml"));
      
      SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
      String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
      String signature = sign(signatureBaseString, consumerSecret);
      String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
      System.out.println(requestFullUrl);
      }
      

공인 IP를 서버에 할당 URL 생성 결과

https://api.ncloud.com/server/?action=associatePublicIpWithServerInstance&oauth_consumer_key=7XwLfoAgCmToVU7w1Ba7&oauth_nonce=839716457229229031&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1393241966&oauth_version=1.0&publicIpInstanceNo=273772&responseFormatType=xml&serverInstanceNo=43607&oauth_signature=VqTwKVZz9OdrRQPWr6alRP3%2BbqI%3D

공인 IP를 서버에 할당 결과 수행

아래처럼 공인 IP를 서버에 할당하였습니다.

서버에 접속 및 httpd 데몬 확인

서버에 할당한 공인 IP로 서버에 접속해 봅니다.

SSH로 접속할 예정이므로, AccessControlGroup에 source : any, destination : TCP 22와 같은 접속 허용 Rule이 있는지 확인합니다. 없다면, 허용 Rule을 작성합니다(자세한 사항은 ACG 사용 가이드를 참고).

서버에 접속하여, 아래와 같이 httpd 데몬을 확인해 보고, 자신의 PC에서 httpd URL로 접속해 봅니다.

만일 접속이 되지 않는다면, AccessControlGroup에 source : any, destination : TCP 80로 접속 허용 Rule을 넣습니다(자세한 사항은 ACG 사용 가이드를 참고).

아래처럼 정상적으로 접속됨을 확인할 수 있습니다.

로드밸런서 인스턴스 생성/바인드

로드밸런서 인스턴스를 생성합니다.

생성 시 로드밸런서 Rule에는 HTTP 80 포트에 l7HealthCheckPath을 서버 인스턴스 생성 시 userData로 입력했던 URL로 입력해 둡니다. 또한 로드밸런서를 생성한 이후 바로 로드밸런서에 서버 인스턴스를 바인드할 예정이기 때문에, 위에서 생성했던 서버 인스턴스 번호를 파라미터로 전달하여 바인드할 수 있습니다.

요청 URL 생성

  • 액션
    • createLoadBalancerInstance
  • 액션 파라미터

    • loadBalancerName : my-first-loadbalancer
    • loadBalancerRuleList.1.protocolTypeCode : HTTP
    • loadBalancerRuleList.1.loadBalancerPort : 80
    • loadBalancerRuleList.1.serverPort : 80
    • loadBalancerRuleList.1.l7HealthCheckPath : /l7check.html
    • serverInstanceNoList.1 : 43607

      public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
      String requestMethod = "GET";
      String requestUrl = "https://api.ncloud.com";
      String serverNameSpace = "/server/";
      String loadBalancerNameSpace = "/loadbalancer/";
      
      requestParameters.put("action", Arrays.asList("createLoadBalancerInstance"));
      requestParameters.put("loadBalancerName", Arrays.asList("my-first-loadbalancer"));
      requestParameters.put("loadBalancerRuleList.1.protocolTypeCode", Arrays.asList("HTTP"));
      requestParameters.put("loadBalancerRuleList.1.loadBalancerPort", Arrays.asList("80"));
      requestParameters.put("loadBalancerRuleList.1.serverPort", Arrays.asList("80"));
      requestParameters.put("loadBalancerRuleList.1.l7HealthCheckPath",
      Arrays.asList("/l7check.html"));
      requestParameters.put("serverInstanceNoList.1", Arrays.asList("43607"));
      requestParameters.put("responseFormatType", Arrays.asList("xml"));
      
      SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
      String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + loadBalancerNameSpace, significantParameters);
      String signature = sign(signatureBaseString, consumerSecret);
      String requestFullUrl = makeRequestUrl(requestUrl + loadBalancerNameSpace, significantParameters, signature);
      System.out.println(requestFullUrl);
        }
      

결과

https://api.ncloud.com/loadbalancer/?action=createLoadBalancerInstance&loadBalancerName=my-first-loadbalancer&loadBalancerRuleList.1.l7HealthCheckPath=%2Fl7check.html &loadBalancerRuleList.1.loadBalancerPort=80&loadBalancerRuleList.1.protocolTypeCode=HTTP&loadBalancerRuleList.1.serverPort=80&oauth_consumer_key=7XwLfoAgCmToVU7w1Ba7&oauth_nonce=4264382811506899882&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1393246625&oauth_version=1.0&responseFormatType=xml&serverInstanceNoList.1=43607&oauth_signature=%2Bj5N6Ix1cIy8bCv1GRHxUlfzD7M%3D

결과 수행

로드밸런서가 생성되었습니다. 로드밸런서 인스턴스 번호는 43668이라는 것을 알 수 있고, my-first-server가 바인드된 것을 알 수 있습니다.

결과 확인

로드밸런서 생성이 완료되면, 위에서 생성한 서버에 로드밸런서를 바인드하였으므로, 로드밸런서와 서버가 정상적으로 통신하고 있는지 체크해 보고, 최종적으로 로드밸런서를 통해서 서버에 통신해 봅니다.

AccessControlGroup에 source를 any로 설정했으므로, 로드밸런서와 서버 간의 통신이 가능한 것입니다. 만약 any로 설정되어 있지 않다면, AccessControlGroup에 로드밸런서와 서버 간의 통신 허용 Rule을 등록해야 합니다.

로드밸런서 인스턴스 생성 시 함께 발급했던 도메인으로 /l7check.html을 접속해 봅니다. 아래처럼 정상적으로 접속됨을 확인할 수 있습니다.

연관 정보 바로가기

아래 가이드에서 연관 정보를 확인할 수 있습니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...