2017년 5월 8일 월요일

[AWS] AWS Cognito 입문 가이드

AWS Cognito 입문 가이드

본 포스팅에서는 AWS에서 제공하는 회원 관리 서비스인 AWS Cognito를 입문하는 방법에 대해 정리해보려 합니다.
제가 시작하면서 경험한 내용을 바탕으로 작성하여 미래의 저 스스로와 다른 분들께 도움이 되면 좋겠습니다.

0. AWS Cognito의 사용 예

저는 Cognito 입문자이기 때문에 매우 단순하게 사용하려 합니다.
AWS에서 제시하는 Cognito의 사용 예는 3가지 정도가 있으나, 이 중에서 가장 간단한 첫번째 사용 예를 실습해보았습니다.
아래 그림이 가장 간단한 Cognito의 사용 예 입니다.
(출처 : AWS Summit 2017 Seoul 발표자료)

사용 예의 상황은 다음과 같습니다.
사용자(User)가 사용하고 싶은 API(AWS API Gateway로 만들어진)가 있는데, 이 API를 이용하기 위해서는 사용이 인가된 사용자여야합니다.
그래서 사용자(User)는 S3에서 웹호스팅 된 회원가입 및 사용자 인증, 로그인 페이지에 접속해서 회원가입을 하고 로그인을 해서 Token을 획득한 뒤에 해당 Token을 이용해서 API를 호출하는 상황입니다.
그림에 표시된 번호대로 설명하면 아래와 같습니다.
  1. 먼저 서비스 제공자가 AWS S3에서 웹페이지(가입, 인증, 로그인이 가능한 웹페이지)를 웹호스팅을 하고 있는 상태입니다.
    사용자(User)는 자신의 기기(Client)에서 해당 웹페이지에 접속합니다.
  2. 접속한 웹페이지에서 회원가입(Sign-up)을 합니다.
  3. 회원가입만 한 상태에서는 사용자 인증이 되어있지 않습니다. 경우에 따라서 이메일 또는 핸드폰 번호로 인증번호가 발송됩니다.
  4. 사용자는 이 코드를 웹페이지에 입력해서 사용자 인증을 받습니다.
    사용자 인증을 받고나면 로그인을 할 수 있습니다. 로그인에 성공하면 응답으로 Token을 받을 수 있습니다.
  5. 드디어 사용자는 사용하고 싶은 API를 호출합니다. 이때, 로그인하면서 받은 Token을 헤더에 같이 넣어서 호출합니다.
  6. API Gateway는 이 Token이 유효한 Token인지 Cognito에 확인합니다.
  7. Cognito는 Token의 유효성을 응답해줍니다.
  8. API Gateway가 Cognito로부터 유효한 사용자라고 응답을 받으면 API 호출에 대한 적절한 응답을 사용자에게 반환합니다.
이 사용 예에서 가장 중요한 것은 Token을 획득하는 일입니다.
본 포스팅에서는 이 Token을 Cognito로 부터 획득하기 위해서 Cognito를 준비하고 회원가입, 인증, 로그인 페이지에서 어떻게 코드를 작성해야 하는가를 정리해보겠습니다.

1. 실습

본 실습에서는 html로 회원가입, 인증, 로그인 폼을 만들고, javascript로 각각의 동작을 구현합니다.
절차는 크게 아래와 같습니다.
  • Cognito에 사용자(User)를 받을 수 있는 User Pool 준비
  • 준비한 User Pool에 사용자(User)를 가입, 인증, 로그인 시킬 수 있는 웹페이지 구현

1-1. AWS Cognito 준비하기

(1) AWS Cognito 서비스에 들어갑니다.
그럼 아래와 같은 화면이 나오는데, 여기서 'Manage your User Pools'를 클릭합니다.

'User Pool'이라는 것은 간단히 사용자 데이터베이스 라고 생각할 수 있습니다.
회원의 ID(Username), email, phone number 등의 정보를 저장할 수 있습니다.
(2) 'Create a User Pool'을 클릭합니다.  


(3) User Pool의 이름을 입력하고, 'Review defaults'를 클릭합니다.
(4) 여러 Setting 값들을 적절하게 수정합니다. (아래에서 하나씩 설명하겠습니다.)

1번은 필수로 입력받아야할 속성들을 선택할 수 있습니다. 기본적으로 모든 항목에 대해서 회원가입 시에 데이터를 입력시킬 수 있는데, 이때 필수로 입력 받아야 하는 항목을 선택하는 것입니다.
Alias는 해당 속성을 ID(Username)으로도 사용 할 수 있게 해주는 것입니다.
User Pool을 생성한 이후에는 필수입력 속성을 더 선택하거나 빼거나 하는 수정이 되지 않습니다. 신중히 체크하셔야 합니다.

2번은 암호의 규칙을 설정하는 곳입니다. 최소 글자수, 특수문자, 대문자, 소문자를 필수로 포함해야 하는지 아닌지를 선택할 수 있습니다.

3번은 사용자 인증 방법을 선택하는 곳입니다.
Email 또는 Phone number를 이용해서 사용자 인증을 할 수 있습니다.
Email을 선택하면 사용자가 회원가입 시에 입력한 메일로 인증 코드가 발송되며, Phone number로 하면 핸드폰 번호로 인증코드가 발송됩니다. 핸드폰 번호를 입력 받으실 때는 국제번호 포맷으로 저장해야합니다.(ex. +821012345678)
그리고 'Create role'을 눌러서 Cognito에서 알아서 인증 메세지를 보낼 수 있게 권한을 만들어줘야합니다.

4번은 'App Client'를 만드는 곳입니다. App Client를 만들면 고유번호가 생성되는데 이 고유번호를 회원가입 페이지에서 알고 있어야지 지금 생성하는 User Pool을 이용할 수 있습니다.
'Add an app client'를 누릅니다.

'App client name'을 입력하고, 반드시! 'Generate client secret'의 체크를 해제합니다.

Client secret의 정확한 의미를 찾으려 했으나.. 잘 안보이네요.. 아마 이 App Client를 사용할 때 추가적으로 암호를 사용하려는거 같은데, 어떤 문서를 봐도 이걸 해제라고 되어있고 아직 활성화된 기능이 아니라는 등의 말만 나오네요..
그리고 무엇보다도 Javascript에서 Cognito를 사용할 때는 'Generate client secret'을 무조건 체크 해제 해야합니다. 그렇지 않으면 사용하려할 때 에러가 발생한다고 하네요.

App Client를 만들었으면 'Return to pool details'를 클릭해서 설정 리뷰 화면으로 돌아갑니다.
부가적인 설명으로, 아마 App Client는 여러개를 만들 수 있는 것 같습니다. 그래서 여러 App에서 하나의 User Pool에 접근할 수 있게 하는 것 같습니다.

다 만들고나면 User Pool 생성 성공 메세지가 나타나고 'Pool Id'와 'Pool ARN'이 표시됩니다.
여기서 'Pool Id'가 Javascript에서 필요합니다.

(5) 그리고 왼쪽에 'App clients'를 누르면 'App client Id'가 나오는데, 이것도 Javascript에서 필요합니다.

이제 User Pool은 준비가 되었습니다! 회원을 맞을 할 준비가 된 것이죠 ㅎㅎㅎ


1-2. Html과 Javascript를 이용해서 웹페이지 구현

이제 회원을 받을 수 있는 웹 페이지를 만들어야합니다.
(1) html 페이지 작성
폼은 그냥 일반적인 input text와 button으로 만들면 됩니다.
너무나 일반적이라서 AWS에서 설명도 안해줍니다...
대강 아래처럼 필요한 정보를 입력할 수 있게만 input 폼을 만들고 버튼만 만들면 됩니다.
중요한 것은 버튼을 클릭했을 때 Javascript 함수가 동작하게 하고 해당 함수 내에서 Cognito 함수들을 사용하는 것입니다.


그리고 Cognito를 사용하기 위해서는 3개의 js 파일을 로드해와야합니다.
2개는 다운받아서 넣어줘야하고 1개는 url로 입력하시면 됩니다.
다운로드는 아래 링크에 들어가셔서 'amazon-cognito-identity.min.js'와 'aws-cognito-sdk.min.js'를 받습니다.
(링크 : https://github.com/aws/amazon-cognito-identity-js/tree/master/dist)

다운 받으시면 아래처럼 html의 head에 js를 추가해줍니다.
'/path/to'는 아시다시피 본인의 경로에 맞게 대체해주시면 됩니다.
<script src="/path/to/aws-cognito-sdk.min.js"></script>
<script src="/path/to/amazon-cognito-identity.min.js"></script>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js"></script>

(2) javascript 함수 구현
javascript 함수는 3개를 만듭니다. 회원가입(Sign up), 인증(Activate code), 로그인(Sign in) 이 3개입니다.
우선, 범용적으로 사용될 설정값을 하나의 js파일에 넣어둡니다.(ex. aws-cognito-config.js)
작성되야할 내용은 아래와 같습니다.

region은 user pool을 생성한 리전이고, userPoolId과 appClientId는 User Pool을 만들고 나서 생성된 고유값입니다.
apiGWEndpoint는 Token을 얻은 후에 api를 호출할 주소인데, 본 포스팅에서는 사용하지 않습니다.
이렇게 변수로 만들어 놓고 앞으로 구현할 함수에서 해당 값이 필요할 때 불러다 쓰시면 됩니다.

이제 버튼 클릭 이벤트를 처리할 함수를 담을 js 파일을 만들고 아래의 방법으로 코드를 작성합니다.

우선, 다수 함수에서 공통적으로 사용할 변수를 전역변수로 작성해 놓습니다.
// AWSCognito 객체를 계속해서 사용하는데 여기에 리전 정보를 저장합니다.
// CognitoConfig.region이 위에서 별도의 js 파일에 넣어둔 설정값입니다.
AWSCognito.config.region = CognitoConfig.region;

// 사용할 User Pool의 정보를 담고있는 변수입니다.
var poolData = {
  UserPoolId : CognitoConfig.userPoolId,
  ClientId : CognitoConfig.appClientId
};

// 입력한 User Pool 정보를 가지고 실제 User Pool에 접근할 수 있는 객체를 만듭니다.
var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);

// 아래 변수는 회원가입을 하고 가입이 성공했을 때 사용자 정보를 반환받는 변수인데,
// 회원가입 함수와 인증 함수에서 같은 객체를 사용해야하기 때문에 전역변수로 뺐습니다.
var cognitoUser;
그럼 첫번째, 가입 함수입니다.
function submitSignUp() {
  // 가입할 때 사용자가 입력한 정보들을 저장할 배열입니다.
  var attributeList = [];

  // 입력 폼에서 입력된 값을 받아오는 부분입니다. 일반적인 javascript입니다.
  var user_Name = document.getElementById("signup_username").value;
  var user_PhoneNumber = document.getElementById("signup_phonenumber").value;
  var user_Pw = document.getElementById("signup_pwd").value;
  console.log('user data : ', user_Name, ', ', user_PhoneNumber, ', ', user_Pw);

  // 이 변수가 사용자가 입력한 정보 중 하나를 입력하는 변수입니다.
  // 저는 핸드폰 번호만 입력받았습니다.
  // 변수명은 자유롭게 사용가능하나, Name은 AWS Cognito에서 정해주는대로 써야합니다.
  // 목록 : address, birthdate, email, family_name, gender, given_name, locale
  //   , middle_name, name, nickname, phone_number, picture, preferred_username
  //   , profile, timezone, updated_at, website
  var dataPhoneNumber = {
    Name: 'phone_number',
    Value : user_PhoneNumber
  };

  // Attribute를 AWS Cognito가 알아들을 수 있는 객체로 만듭니다.
  var attributePhoneNumber = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute(dataPhoneNumber);

  // 방금 위에서 만든 Attribute 객체를 Attribute List에 추가시킵니다.
  // 이렇게 배열에 다 추가시키고 한번에 Cognito에 넘길겁니다.
  attributeList.push(attributePhoneNumber);

  // 전역변수로 만들어 놓은 User Pool 객체에서는 signup 함수를 제공합니다.
  // 인자는 User name(ID 인것 같네요.), Password, Attribute List, null(무슨 자리인지 모르겠어요..확인해야합니다.ㅎㅎ), 처리 결과가 오면 수행 될 callback 함수 입니다.
  userPool.signUp(user_Name,user_Pw, attributeList, null, function(err, result) {
    if(err) {
      // error가 발생하면 여기로 빠집니다.
      alert(err);
      return;
    }

    // 가입이 성공하면 result에 가입된 User의 정보가 되돌아 옵니다.
    // 인증 함수에서 사용해야하기에 위에서 만든 전역변수인 cognitoUser에 넣어놓습니다.
    cognitoUser = result.user;
    console.log('user name is '+cognitoUser.getUsername());
  });
}
두번째, 인증 함수입니다.
function submitActivateCode() {
  // 회원가입을 하면 User Pool을 어떻게 만들었냐에 따라서 email 또는 phone으로 인증코드가 발송됩니다.
  // 사용자로부터 인증코드를 입력받아옵니다.
  var user_activatecode = document.getElementById("activate_code").value;

  // cognitoUser는 가입함수에서 가입 성공 후 되돌아온 사용자 정보가 담겨있습니다.
  // 이 변수에서 바로 confirmRegistration함수를 수행하면 AWS Cognito로 인증 요청을 합니다.
  // 인자는 인증코드, true(이것도 알아봐야합니다..ㅎㅎ), callback 함수 입니다.
  cognitoUser.confirmRegistration(user_activatecode, true, function(err, result){
    if(err) {
      alert(err);
      return;
    }
    // 인증이 성공하면 SUCCESS 문자가 되돌아 옵니다.
    console.log('call result : ' + result);
  });
}
세번째, 로그인 함수입니다. 이 함수를 수행하면 드디어 Token을 얻을 수 있습니다.
function submitSignin() {
  // 입력 폼에서 ID와 비밀번호를 입력받습니다.
  // 저는 phone number를 alias로 설정해서 ID 처럼 사용할 수 있게 했습니다.
  var user_PhoneNumber = document.getElementById("signin_phonenumber").value;
  var user_Pw = document.getElementById("signin_pwd").value;

  // ID와 Password를 정해진 속성명인 Username과 Password에 담습니다.
  var authenticationData = {
    Username : user_PhoneNumber,
    Password : user_Pw
  };

  // 여기에는 ID와 User Pool 정보를 담아 놓습니다.
  var userData = {
    Username : user_PhoneNumber, // your username here
    Pool : userPool
  };

  // 로그인을 위해 Cognito 객체 2개를 준비합니다.
  var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
  var cognitoSignedUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);

  // authenticateUser 함수로 로그인을 시도합니다.
  cognitoSignedUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result) {
      // 로그인에 성공하면 Token이 반환되어 옵니다.
      console.log('access token + ' + result.getAccessToken().getJwtToken());
      // API Gateway로 만든 API에 Request를 보낼 때는 Authorization 헤더의 값으로 idToken을 넣어야합니다.
      console.log('idToken + ' + result.idToken.jwtToken);
    },
    onFailure: function(err) {
      alert(err);
    }
  });
}
이번 포스팅에서는 Token을 획득한 것으로 마치겠습니다.
다음 포스팅에서 이 Token을 가지고 API Gateway로 만든 API를 호출하고, 연결된 Lambda함수를 실행해서 응답을 받는 실습을 정리해보겠습니다.

* API Gateway+Lambda 사용 방법 링크
https://walkinpcm.blogspot.kr/2017/05/aws-aws-api-gateway-lambda-rest-api.html

2017년 3월 23일 목요일

[Web/Server] Ubuntu(우분투)에서 Nginx(엔진엑스) 설치하기

Ubuntu(우분투)에서 Nginx(엔진엑스) 설치하기


이번 포스팅에서는 Apache의 대항마라고 불리는 차세대 웹서버인 Nginx의 설치방법을 정리해보겠습니다.
Nginx는 Apache에 비해서 가볍고 설정이 간편하면서, 성능이 좋고 속도가 빠른 장점이 있다고 합니다.

설치 방법은 nginx의 wiki를 참고하였습니다.
https://www.nginx.com/resources/wiki/start/topics/tutorials/install/#official-debian-ubuntu-packages

저는 Ubuntu 16.04 LTS에서 설치하려고 합니다.

nginx를 설치하는 방법은 3가지 정도가 있는 것 같습니다.
- 첫번째, PPA를 이용해서 설치하는 방법
- 두번째, apt repository를 추가해서 설치하는 방법
- 세번째, 소스코드를 컴파일해서 설치하는 방법

저는 두번째 : apt repository를 추가해서 설치하는 방법을 해보려고 합니다.
PPA의 경우 비공식 소프트웨어인데 nginx가 아닌 자원자들이 개발하는 버전이라고 합니다. 저는 공식적인 버전을 사용하기 위해서 PPA는 사용하지 않으려고 합니다.
소스코드를 컴파일 하는 방법은 nginx의 설정을 좀 더 커스텀해서 사용할 수 있다고 하는데, 저는 nginx의 입문자라서 그냥 기본 설정으로 충분할 것 같아서 소스코드를 컴파일 하지는 않을 것입니다.

본격 설치 방법

(1) apt-get repository 추가
apt repository에 nginx 패키지의 출처를 추가합니다. 추가할 위치는 아래와 같습니다.
/etc/apt/sources.list

sources.list 파일을 사용하시는 에디터로 열어서 맨 밑에 아래의 두줄을 추가합니다.
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx
참고로 위의 두줄은 ubuntu 16.04 버전을 위한 것입니다.
ubuntu 14.04는 아래 두줄이 맞습니다.
deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx
버전이 다르면 단지 버전에 따른 코드네임만 변경하면 됩니다.

(2) apt-get으로 nginx 설치
apt repository를 수정했으니 적용시키기 위해서 update를 해줍니다.
sudo apt-get update

그런데!!! update를 수행하고 나면 nginx와 관련해서 아래와 같은 주의가 나타났을 겁니다.
W: GPG error: http://nginx.org/packages/ubuntu xenial InRelease:
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY {key}
이 주의문구는 nginx의 repository에 있는 nginx 패키지가 검증되지 않아서 나타나는 것입니다.
nginx 공식 wiki에서는 위의 문제가 발생하면 아래처럼 key를 등록하라고 합니다. {key}자리에는 주의 문구에 {key} 자리에 있는 키를 넣어주면 됩니다.
key를 등록하고 다시 update까지 해줍니다.
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys {key}
sudo apt-get update
이번 update에서는 주의문구가 나타나지 않을 것입니다.

update가 완료되면 설치를 합니다.
sudo apt-get install nginx

설치 끝 입니다!


이번 포스팅에서는 설치만 정리하고 다음 포스팅에서 설정파일에 대한 정리와 함께 node.js와의 연동에 대해 정리해보도록 하고 링크 걸겠습니다.



2017년 3월 16일 목요일

[Web/Node.js] Express 설치 및 웹페이지 연결시키기

Express 설치 및 웹페이지 연결시키기


1. Express 설치

express를 사용할 node.js 프로젝트 폴더로 이동합니다.
해당 폴더에서 아래 명령어를 수행합니다.
npm install express --save

설치를 하고 나면 package.json에 아래와 같은 dependency가 추가됩니다.
"dependencies": {
    "express": "^4.15.2"
  }


2. 웹페이지 연결

express를 이용해서 웹서버를 열고, 브라우저에서 접속했을 때 index.html을 나타내도록 해보겠습니다.

우선 index.html을 만듭니다. 위치는 프로젝트 루트에서 views라는 폴더를 만들고 그 안에 만들어 줍니다.
mkdir views
nano index.html

index.html의 내용을 적당히 채워줍니다. 되는지 먼저 봐야하니깐 화려할 필요는 없습니다.

그리고 npm 패키지 하나가 더 필요합니다. ejs 패키지 인데, 프로젝트 루트 위치에서 아래 명령어로 설치합니다. express 설치하는 것과 같습니다.
npm install ejs --save

ejs 패키지는 html 템플릿 엔진입니다. ejs에 대한 자세한 사항은 다음에 다시 살펴보도록 하겠습니다.

이제 메인이 되는 자바스크립트 코드를 아래처럼 작성합니다.
1 |var express = require('express');
2 |var app = express();
3 |
4 |app.set('views', __dirname + '/views');
5 |app.set('view engine', 'ejs');
6 |app.engine('html', require('ejs').renderFile);
7 |
8 |app.get('/',function(req,res){
9 |        res.render('index.html');
10|});
11|
12|var server = app.listen(80, function(){
13|        console.log("The server has started on port 80");
14|});

1번 줄은 express 패키지를 본 코드에서 사용할 수 있게 가져오는 것입니다. java에서의 import, c에서의 include와 유사합니다.
2번 줄은 express의 기능을 사용할 수 있는 객체를 가져오는 것입니다. 가져온 객체를 app이라는 이름의 변수에 담아서 express의 기능을 사용하는데 쓸겁니다.
4번 줄은 html 파일들을 위치시킨 경로를 설정하는 것입니다.
5,6번 줄은 html을 나타내는 엔진으로 ejs 패키지를 사용하다는 것입니다.
8번 줄은 '/'로 get요청이 오면 index.html 파일을 반환한다는 것입니다.
12번 줄은 80번 포트로 웹서버를 연다는 것입니다.

이렇게 작성하고 node로 자바스크립트를 실행하면 웹서버가 시작됩니다.
그리고 웹브라우저에서 해당 서버로 http 접속을 하면 index.html에 작성한 내용이 표시되는 것을 확인할 수 있습니다.
(80번 포트는 root 권한으로 웹서버를 실행시켜줘야합니다. 그래서 우분투에서는 sudo를 붙이도록 합니다.)

[Node.js] npm 프로젝트 시작하기

npm 프로젝트 시작하기


node.js에서는 내가 직접 만든 .js 파일들 뿐만 아니라 이미 다른 사람들이 만들어 놓은 .js 파일들을 사용할 수 있습니다. 보통 이런 .js파일들을 패키지 라고 부르게 됩니다.

npm은 node.js에서 사용하는 패키지 관리도구입니다. 즉, 다른 사람들이 만들어 놓은 패키지를 사용할 수 있게 도와주는 도구인것이죠.
Maven이나 Gradle 같은 부류라고 생각할 수 있을 것 같습니다.

본 포스트에서는 프로젝트를 npm 패키지로 선언하는 방법을 정리해봅니다.

1. npm 설치

npm은 node.js를 설치하면 함께 설치됩니다.
우분투에서의 node.js의 설치 방법은 아래 링크에 정리되어 있습니다.
https://walkinpcm.blogspot.kr/2017/03/webnodejs-nodejs.html


2. npm 패키지 선언

프로젝트에서 npm을 사용하려면 해당 프로젝트를 npm 패키지로 만들겠다고 선언해줘야 합니다.

이 과정은 git의 선언과 유사하다고 생각합니다.
git도 프로젝트를 git과 연결시킬때, 해당 폴더에서 git init 을 수행하지요. 그러고 나면 git 관련 파일이 생성됩니다.
npm도 유사합니다. 프로젝트를 npm 패키지로 선언하고 나면 package.json이라는 파일이 생성됩니다.

npm 패키지 선언은 아래 명령어로 시작합니다.
npm init

init 명령을 수행하고 나면 몇가지 질문이 차례대로 나옵니다.
name            : 패키지의 이름. 
version         : 패키지의 버전.
description     : 패키지 설명.
entry point     : 패키지 실행시 이 패키지를 구동시키는 자바스크립트 파일
test command    : TDD를 할 때의 명령. 빈칸으로 넘어가도 됨.
git             : 연결되는 git 주소.
keyword         : 옵션. 빈칸으로 넘어가도 됨.
author          : 옵션. 빈칸으로 넘어가도 됨.
license         : 디폴트로 넘어가도 무방.


질문에 대한 답을 입력하고나면 package.json 파일이 생성됩니다.
이 파일이 만들 패키지에 대한 개요 정도라고 봐도 될 것 같습니다.

package.json에는 앞으로 프로젝트에 외부 패키지를 설치할 때마다 해당 dependency에 대한 내용이 자동으로 추가됩니다.




[Web/Node.js] Node.js 설치

우분투(Ubuntu)에서 Node.js 설치하기



개인적인 프로젝트를 진행하는데 server-side를 새롭게 node.js로 해보고 싶은 욕심이 생겨서 설치부터 정리해봅니다.

1. Node.js 설치

node.js 홈페이지에 가면 다양한 플랫폼에 대한 node.js 설치파일이나 설치방법이 제공됩니다.
우분투에서 설치하는 방법은 아래 링크처럼 설명되고 있습니다.
https://nodejs.org/ko/download/package-manager/#debian-ubuntu-linux

지원가능한 우분투 버전도 나오는데 12.04, 14.04, 16.04가 지원되네요. 저는 14.04에 해볼 겁니다.

설치는 간단합니다. 아래 명령어 2줄만 차례대로 수행해주면 됩니다.
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
참고로 위의 방법으로는 node.js 6.x 버전을 설치합니다.
이 글을 쓰는 시점에서는 6.x 버전이 안정된 버전이고, 7.x는 최신이기는 하나 아직 안정되지 않은 버전이기 때문에 저는 6.x를 선택했습니다.

위 두줄로 간단히 설치를 마치고 나면 버전 확인으로 설치가 된것을 확인할 수 있습니다.
$node --version
v6.10.0

2. Node.js 실행

node.js는 확장자가 .js인 파일을 실행할 수 있습니다.
실행방법은 간단하게 node 명령어를 이용하면 됩니다.

예를 들어서 아래와 같이 콘솔로그를 출력하는 helloworld.js 파일을 만듭니다. 에디터는 무엇을 이용하든 무관합니다.
console.log('Hello World!');

이 helloworld.js 파일의 실행은 아래와 같이 하면됩니다.
$node helloworld.js
Hello World!
그러면 작성한 문구가 실행됩니다.


3. Express를 이용한 웹서버 실행

Express는 node.js에서 사용가능한 웹 프레임워크입니다. node.js에서 웹서버를 더욱 간편하게 구축할 수 있게 해주는 도구라고 보면 됩니다.

Express에 대한 내용은 다음 포스트에서 정리합니다. 링크를 걸어놓았습니다.
https://walkinpcm.blogspot.kr/2017/03/webnodejs-express.html

2017년 3월 8일 수요일

[Server] 가비아의 서버 모니터링 솔루션 적용해보기.

[Server] 가비아의 서버 모니터링 솔루션 적용해보기.


가비아에서 무료로 사용할 수 있는 서버 모니터링 상품을 내놓았습니다.
가비아에서 자체 개발한 SaaS형 서버모니터링시스템(SMS)라고 합니다.
(링크 : https://event.gabia.com/s_event_170221?utm_source=facebook&utm_medium=banner&utm_term=20170221_idc_%EC%84%9C%EB%B2%84%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81&utm_campaign=%EC%84%9C%EB%B2%84%ED%98%B8%EC%8A%A4%ED%8C%85 )


서버를 운영하면 현재 상태가 어떤지 확인하는 것은 필수적이죠.
본 포스팅에서는 가비아의 서버모니터링시스템을 적용하는 과정을 정리해보고 어떤 서비스를 어떻게 제공하고 있는지 확인해 보겠습니다.

우선, 링크에서 설명되는 가비아 SMS의 특징은,
 1. 간편한 에이전트 설치(가이드 제공)
 2. 저장 장치 사용량, I/O Read/Write 모니터링
 3. 네트워크 사용량(In/Out bps, In/Out pps) 모니터링
 4. CPU, 메모리, Swap 등의 성능 모니터링
 5. 항목별 임계치 설정, 이벤트 스탭샷 등 이력관리
 6. 사용자 인터페이스 극대화 최적의 UI 제공

기본적인 사항들에 대한 모니터링은 지원하는 것 같습니다.

또한, 에이전트만 설치하면 무료로 계속 사용할 수 있고, 가비아가 아닌 외부 서버에도 설치할 수 있고(단, 가비아 회원 가입이 필요합니다.), 서버 대수의 제한도 없고, 정식 오픈 이후에도(지금은 베타에요) 현재 제공하는 기능은 계속 무료로 제공한다고 합니다.

참고로, 데이터 수집 주기는 1분이며 이 데이터는 최대 60일간 보관 및 조회할 수 있다고 합니다.

그럼 이제 에이전트를 설치해보겠습니다.

> 가비아 서버 모니터링 시스템(SMS) 이용 방법

크게 순서를 보면
 1. 가비아 회원 가입 & 로그인
 2. 관리툴 페이지 접속
 3. 에이전트 설치 후 서비스 이용

간단합니다.

1. 가비아 회원 가입 & 로그인

가비아 홈페이지에서 회원가입을 합니다.
네이버와 페이스북 로그인을 지원하는데, 저는 그냥 가입해서 해보겠습니다.

가입 절차는..뭐 굳이 정리할 것도 없이 간단합니다.
아이디, 비밀번호, 이름, 이메일, 핸드폰 번호 적고 인증하고 하면 끝나네요.


2. 관리툴 페이지 접속

로그인 후에 관리툴 페이지로 접속합니다.
가비아 홈페이지에서 메뉴를 찾으려 했는데 못 찾겠어서 그냥 링크를 타고 들어갔습니다.
링크 : http://xms.gabia.com

3. 에이전트 설치 후 서비스 이용

관리툴 페이지에 들어가니깐 바로 에이전트 설치 방법이 친절하게 설명됩니다.

지원 OS는 Ubuntu, CentOS/Fedora, Windows입니다.
각 운영체제별로 지원 버전도 바로 나타납니다. 저는 우분투를 쓰는데 제가 사용하는 14.04 LTS도 지원하고 있습니다.

(1) apt repository 추가.
설치도 매우 간단하네요.
apt를 이용해서 설치하게 되는데, 기본적인 apt repository에 포함되어 있는 패키지가 아니기 때문에 먼저 repository를 추가합니다.

wget http://monrepo.gabia.com/repo/debian/gabiarepo.gpg -O - |sudo apt-key add -
wget http://monrepo.gabia.com/repo/debian/gabiamon-repo_1.0.0-1_all.deb
sudo dpkg -i gabiamon-repo_1.0.0-1_all.deb
sudo apt-get update

(2) apt-get으로 에이전트 설치
apt-get install 명령으로 가비아 SMS 에이전트를 설치합니다.

sudo apt-get install gabia-mond

설치 과정에서 2가지 질문이 나옵니다.
- User? : 기본적으로 root가 선택되어 있는데, 저는 따로 만들어 놓은 계정을 적었습니다.
- Use "sudo"? : root계정이 아닌 계정을 선택해서 그런지 sudo를 쓸거냐고 묻네요. y를 선택합니다.

설치를 하고 났는데 아래처럼 intall 완료라고 뜨면서 그 다음줄에는 찜찜하게 오류가 있는듯한 메세지가 뜨네요..

Install completed...
/etc/init.d/gabia_mond: 6: [: sudo: unexpected operator

베타버전의 버그인건지.. 문의메일이나 넣어봐야겠습니다.

(3) 키 발급 & 스크립트로 에이전트 실행
관리툴 페이지에서 설치 가이드를 따라가다보면 [Key 발급] 버튼이 있습니다. 이 버튼을 눌러서 Key를 발급받습니다.
긴 문자열도 아니고 다소 짧은 문자열로 키가 바로 옆에 표시됩니다. 이것을 복사해 둡니다.
(참고로 Agent Key는 모니터링 페이지에서 확인할 수 있으니 별도로 저장해둘 필요는 없습니다.)

서버에서 아래 명령어로 위에서 설치한 에이전트를 실행시킵니다.

sudo env PATH=$PATH:/usr/local/gabia_mond/bin gabia_mond --start --key

그러면 Agent Key를 묻는데 방금 복사한 키를 입력합니다.
아래와 같은 시작 메세지가 뜨면서 모니터링이 시작됩니다.

gabia_mond[1599] has started
Gabia Server Monitoring Agent Start

시작되고 나면 터미널 창에서 커맨드 입력 라인이 안 뜨는데 엔터한번 치면 나타납니다.

(4) 모니터링 확인
관리툴 페이지의 좌측 사이드 메뉴에서 '모니터링' 메뉴를 선택하면 현황을 볼 수 있습니다.
처음 에이전트를 설치하고 난 뒤에는 데이터를 수집하는데 몇분이 소요되는 듯 합니다.

기본적인 CPU상태나 메모리 사용량을 확인하는데는 충분하지 싶습니다.
개인적으로 모니터링 부분을 깊게 알지 못하여서 이 정도도 만족스럽네요.

아! IP 주소가 표시되는데 저는 AWS의 EC2에 설치한 우분투에서 진행해서 그런지 IP가 Public IP가 아니라 Private IP가 표시됩니다. EC2 우분투에서 ip를 확인하면 Private IP만 나타나는데 그래서 그런가봅니다.

상단의 탭들을 선택하면 각각에 대한 좀 더 자세한 현황을 볼 수 있습니다.


2017년 2월 21일 화요일

[Web] Atom에서 git-plus 설치하기

Atom에서 git-plus 설치하기

(부제 : git-plus 에러 시행착오)

1. git-plus 설치

Atom의 상단 메뉴에서 'Packages'-'Settings View'-'Install Packages/Themes'를 선택합니다.

그 다음, git-plus를 검색해서 Install합니다.
설치는 끝입니다.(너무 간단)

2. git-plus 설정

사실 이 부분이 난관이었습니다.

처음 Atom을 접하고 여러 패키지들을 설치했는데, 아무것도 따로 설정을 해줄 필요는 없었습니다.
그래서 git-plus도 설치하고 아무런 설정을 해주지 않았죠...
이게 실수였습니다.

Atom뿐만 아니라 git을 사용하는 어떤 프로그램이든 git프로그램의 위치를 알아야 git을 수행합니다.
그래서 git-plus도 자신이 사용할 git프로그램이 어디있는지 경로를 알아야 정상적으로 동작합니다.

위에서 git-plus를 설치하고 나면 바로 'Install'이 있던 자리에 'Settings' 버튼이 생깁니다.
Setting에 들어가면 Git Path를 설정 할 수 있는데, 여기에 자신이 사용하는 git프로그램의 경로를 입력해주면됩니다.



git-plus가 사용할 git프로그램의 위치를 모르면 아래와 같이 텍스트가 깨진 상태로 어쩌고저쩌고 에러가 발생합니다.