[중요] API 활용 가이드 문서 지원 종료 (Deprecated) 안내

본 API 문서는 네이버 클라우드 플랫폼의 확장성 있는 API 제공을 위해 Deprecated 되어 공식적으로 사용하지 않으며, 앞으로 사용이 정지될 예정입니다. (2018년 12월)
새롭게 제공되는 Ncloud APIs 가이드에서 네이버 클라우드 플랫폼의 API 사용 방법을 확인해 주십시오.



=========================================== @deprecated 문서(~2018년12월) ==========================================



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

자세한 문서는 네이버 클라우드 플랫폼 서버-로드밸런서 API reference를 참고합니다.
이 절에서는 간단한 시나리오를 통해, 서버를 생성해보고, 로드밸런서를 생성하여, 서버를 바인드합니다.
해당 시나리오를 따라 해 봄으로써 네이버 클라우드 플랫폼 서버/로드밸런서 API 사용법을 익힐 수 있습니다.

시나리오 설명

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

서버이미지상품 조회

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

로그인키 생성

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

서버인스턴스 생성

서버인스턴스를 생성합니다.
생성 시 userData를 이용하여, httpd 서버를 띄우고 l7HealthCheckPath URL을 생성해 놓습니다.
서버인스턴스가 생성되면, Ncloud 관리콘솔을 통해 서버에 접속해 보고, httpd 데몬이 실행되었는지 확인해 본 후 l7HealthCheckPath URL을 수행하여, 정상적으로 데몬이 실행상태인지 확인해 봅니다.

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

로드밸런서인스턴스를 생성합니다. 생성 시 위에서 생성한 서버에 바인드합니다.
생성 시 HTTP 80 포트에 l7HealthCheckPath을 서버인스턴스 생성 시 userData로 입력했던 URL로 입력해 둡니다.
생성이 완료된 이후 로드밸런서와 서버가 정상적으로 통신되고 있는지 체크해 보고, 최종적으로 로드밸런서를 통해서 서버에 통신해 봅니다.

인증

인증 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 포함하여 쉽게 요청할 수도 있습니다.
자세한 사항은 Ncloud OAuth 인증 가이드를 참고합니다.

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

요청 URL 생성 java sample code

아래는 요청 URL을 생성하는 java sample code입니다.
해당 코드는 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

사용자는 My Page > 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을 생성해 놓습니다.
서버인스턴스가 생성되면, Ncloud 관리콘솔을 통해 서버에 접속해 보고, 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.ncloud.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 생성에 대한 부분은 skip 합니다. 서버에 할당하기 위해서 공인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을 넣어 줍니다. (자세한 사항은 AccessControlGroup 사용 가이드를 참고합니다.)

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

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

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

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

로드밸런서인스턴스를 생성합니다.
생성 시 로드밸런서 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을 접속해 봅니다. 아래처럼 정상적으로 접속됨을 확인할 수 있습니다.

연관 정보 바로가기

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

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

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

    처리중...