2015.07.02 08:33

AWS04 - 클라우드 서버들을 묶어 Load Balancing하자

앞단의 서버랑 뒷쪽 DB까지 분리해보고, 앞단의 여러대 서버까지 늘여 보았습니다. 이제 이들을 하나의 서비스 (URL)로 묶고 사용자들이 이중 더 여유가 있는 서버로 자동 연결되도록 (Load Balancing) 해봅니다.


“AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 33 페이지에 나오는 구성입니다.


AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2),  AWS02 - 클라우드에 DBMS를 연결 (AWS RDS), 와 AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자 를 통해 아래와 같이 시스템이 구성되어 있다고 가정합니다.



두개의 서버가 카운터 db는 공유하지만 호스트 이름이 다르다는 것을 확인할수 있습니다.


로드 벨런싱 생성  


우선 EC2 Dashboard에가서 Load Balancers를 선택합니다.




여기서 “Create Load Balancer”를 선택합니다. 대부분 기본 설정으로 가면 됩니다. 이 예제에서는 웹 서비스를 여러 서버에서 공유하는 것이라 HTTP에 관한 포트 설정만 하면 됩니다.



다음은 Security Group 설정. 이 security group은 http가 열려있는 그룹으로 반드시 선택하거나 설정을해야 외부에서 웹접속이 됩니다.



HTTPS등에 대한 이야기가 나오는데 일단은 pass.

서버의 건전성 확인하는 설정도 기본으로 해둡니다.

그리고 Load Balancer에 추가할 instance들을 선택합니다. 여기서 우리는 이미 만들어 놓은 두개의 instance를 모두 선택합니다. 다른 존에 포함된 instance들 간에도 Load Balancing 이 가능하네요. 멋집니다.






마지막으로 테그 부분은 pass. 끝으로 설정을 살표본후 Load Balancer를 생성시킵니다.



아래와 같이 생성에 성공했다는 이야기가 나옵니다.


생성된 Balancer의 자세한 정보를 봅니다.


이중 가장 중요한 것은 DNS Name 으로 이 경우 hunkim-104723420.us-west-2.elb.amazonaws.com

로 주어집니다. 이것이 바로 웹주소. 일단 웹으로 접속해 봅니다.


이 주소로 연결하면 예상한것 처럼 172-31-19-88 서버와 172-31-26-143에 교차로 연결됩니다. 설정이 잘 되었습니다.


필요할 경우 본인이 가지고 있는 도메인 이름의 DNS CNAME등의 설정으로 hunkim-104723420.us-west-2.elb.amazonaws.com 이름을 짧게 (hunkim.noip.me 등) 이용할수 있습니다.


AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.02 08:31

AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

앞단의 서버랑 뒷쪽 DB까지 분리해보았는데 이번에는 앞단의 EC2 서버를 늘려 봅시다.

“AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 23 페이지에 나오는 이런 형식입니다.


AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2)AWS02 - 클라우드에 DBMS를 연결 (AWS RDS) 를 통해 아래와 같이 시스템이 구성되어 있다고 가정합니다.



이미지 만들기


새로운 instance에 LAMP를 비롯하여 새로 설치와 설정을 하면 되지만 이 작업은 번거럽기 때문에 바로 이미지를 만들어 옮기는 것이 좋습니다. 기존의 instance를 선택한다음 Actions/Image/Create Image를 선택합니다.


이미지의 이름을 정하고 나머지는 기본으로 하여 이미지를 만듭니다.


성공적으로 이미지가 만들어 졌습니다.

이미지로 인스턴스 만들기  

EC2 Dashboard에 가서 Images 밑 AIMs 를 선택합니다.  



여기 메뉴 Actions/Launch 를 선택하여 이 이미지를 가지고 새로운 instance를 만듭니다.


그러면 바로 instance를 설정하는 메뉴로 가게 됩니다.

바로 Review and Launch로 이동합니다. 여기서 Security group만 기존의 EC2가 사용하고 있는 것으로 지정을 하고 나머지는 기본값으로 설정합니다.



한가지더, 어떻게 서버로 접속할것 인지 물어 봅니다. 이전에 서버를 위해 만들고 다운 받아 두었던 키를 그대로 사용합니다.


그러면 성공적으로 새로운 instance가 생겼습니다.


3. [새 인스턴스 바로 시험]

이미지를 그대로 복사했기 때문에 아마 LAMP를 비롯 우리가 이전에 만들어준 index.php도 있기 때문에 바로 접속해 봅니다. 우선 Public DNS ec2-52-25-8-206.us-west-2.compute.amazonaws.com 를 확인합니다.



예상했던 대로 잘됩니다.

4. [index.php에 호스트 이름 추가]

어떤 호스트가 연결되는지 보기 위해 visitor count 에 추가로 호스트 이름을 보여주도록 해봅니다.



Macintosh-2:website hunkim$ ssh ubuntu@ec2-52-25-8-206.us-west-2.compute.amazonaws.com  -- 같은 key를 사용하여 로그인


--- 서버에 접속

ubuntu@ip-172-31-26-143:~$ vi /var/www/html/index.php

echo "<P>My hostname is " . gethostname();  -- 한줄 넣어 줍니다.



서버가 2개라 다른 서버에도 들어가서 소스를 고쳐야 합니다. (뭔가 이건 아닌듯: http://www.se.or.kr/145 의 git 사용방법 참조) 그러나 예제에서는 그냥 간단하게 고쳐봅니다.



Macintosh-2:~ hunkim$ ssh ubuntu@hunkim.noip.me


ubuntu@ip-172-31-19-88:~$ vi /var/www/html/index.php

echo "<P>My hostname is " . gethostname();  -- 한줄 넣어 줍니다.


예상대로 두개의 서버가 같은 일을 하지만 호스트 이름이 다릅니다.

아래과 같이 구성이 완료 되었습니다.


필요하면 같은 방법으로 서버를 3대, 4대, 더 많이 늘려갈수 있습니다.


AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.07.01 17:43

AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)


이번에는 AWS의 별도 DB서비스인 RDS를 통해 DB서버를 분리해내는 방법을 알아 봅니다. 더 확장성 있는 서비스가 가능하겠죠? “AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기, http://www.slideshare.net/awskorea/your-first-10-million-users-channy” 26 페이지에 나오는 이런 형식입니다.


AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2) 를 통해 아래와 같이 ssh로 서버 접근이 가능하고 간단한 index.php를 만들었다고 가정합니다.


local $ ssh ubuntu@hunkim.noip.me          -- ubuntu 사용자 이름 주의  

The authenticity of host 'hunkim.noip.me (52.27.17.52)' can't be established.

RSA key fingerprint is ce:3b:b5:f6:fb:e4:50:01:78:fe:d0:ac:c3:1e:bc:67.

Are you sure you want to continue connecting (yes/no)?    --- 이 서버가 맞는지 확인. yes 를 입력

ubuntu@ip-172-31-19-88:~$ cd /var/www/html

ubuntu@ip-172-31-19-88:/var/www/html$ sudo vi index.php

ubuntu@ip-172-31-19-88:/var/www/html$ cat index.php

<html>

<head>

 <title>PHP Test</title>

</head>

<body>

<?php echo '<p>Hello World</p>'; ?>

</body>

</html>



아래와 같이 Hello World를 보셔야 합니다.


로컬 DB돌리기


이전에 설치한 LAMP에 포함된 Local MySQL을 사용해봅니다. 간단한 예제로 DB를 사용하여 visitor count를 보여주는 프로그램을 PHP로 만들어 보겠습니다. (http://www.webexpertlabs.com/visitor-counter-using-php-mysql/)


  1. [DB 설정]

간단하게 mysql 에 root로 로그인 하고 (LAMP설치할때 비번 기억) database와 table을 만들고 사용자 (dbuser) 를 하나 만들어 이 database에 권한을 주도록 해봅니다. 이 사용자 아이디를 php에서 사용하도록 합니다. (root는 소중하니까.)


Macintosh-2:~ hunkim$ ssh ubuntu@hunkim.noip.me    -- 일단 서버로 ssh


---  이제부터 서버에서 돌아 갑니다.


ubuntu@ip-172-31-19-88:~$ mysql -u root -p  Enter password: ****

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 44

Server version: 5.5.43-0ubuntu0.14.04.1 (Ubuntu)

[...]

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> create DATABASE phpdb;

Query OK, 1 row affected (0.00 sec)


mysql> use phpdb;

Database changed


--- 아래 Table을 만들어 줍니다. (http://www.webexpertlabs.com/visitor-counter-using-php-mysql/)


mysql> CREATE TABLE `tb_counter` (

   -> `counter` INT( 11 ) NOT NULL AUTO_INCREMENT ,

   -> PRIMARY KEY ( `counter` )

   -> ) ENGINE = MYISAM ;

Query OK, 0 rows affected (0.01 sec)


mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY '*****';    --- dbuser 아이디를 생성

Query OK, 0 rows affected (0.00 sec)                                          --- ***** 부분이 비밀번호


mysql> GRANT ALL PRIVILEGES ON phpdb.* TO 'dbuser'@'%' WITH GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)                  --- dbuser에게 phpdb 의 모든 table 권한을 줌


그런 다음 dbuser로 접속해서 잘 되는지 시험해봅니다.


ubuntu@ip-172-31-19-88:~$ mysql -u dbuser -p

Enter password: ***

Welcome to the MySQL monitor.  Commands end with ; or \g.

[...]

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> use phpdb;


Database changed


mysql> show tables;

+-----------------+

| Tables_in_phpdb |

+-----------------+

| tb_counter      |

+-----------------+

1 row in set (0.00 sec)


mysql> select * from tb_counter;

Empty set (0.00 sec)


잘 되는듯 합니다.


2. [PHP 프로그래밍] 간단한 counting (http://www.webexpertlabs.com/visitor-counter-using-php-mysql/)



ubuntu@ip-172-31-19-88:/var/www/html$ vi index.php

<?php

/* define your data connection here*/

define("hostname","YOUR HOST NAME HERE");

define("username","YOUR DATABASE USERNAME HERE");

define("password","YOUR DATABASE PASSWORD HERE");

define("database","YOUR DATABASE NAME HERE");

//syntax used for mysql connection

mysql_connect(hostname,username,password) or die(mysql_error());

//syntax used for selecting database

mysql_select_db(database)or die(mysql_error());


$counter='';//initilize counter

$sql="SELECT counter FROM tb_counter";

$result=mysql_query($sql);

$rows=mysql_fetch_assoc($result);

$counter=$rows['counter'];


// if count is empty

if(empty($counter)){

$counter=1;

$insertCounter="INSERT INTO tb_counter set counter='".$counter."'";

$result1=mysql_query($insertCounter);

}


echo "You are visitor num=>". $counter;


// increment visitor count

$increasecounter=$counter+1;

$sql2="update tb_counter set counter='".$increasecounter."'";

$result2=mysql_query($sql2);

?>



(참고: 위 db 접속 정보부분은 다른 파일, 즉 config.php등으로 분리하신 다음 /var/www/html 바깥에 두어 웹으로 이 파일이 직접 접근이 안되게 한다음 index.php에서 include 하시는 것이 보안상 좋습니다. 이글의 예제에서는 간단하게 하기 위해 그냥 index.php에 포함.) db 접속 정보를 이런 형식으로 고쳐 줍니다.


3. [웹 브라우징] 이제 웹브라우즈로 접속해 봅니다. refresh를 여러번 눌렀더니 3번이나 방문한 것으로...

DBMS도 당연 update 되었겠지만 한번더 확인해 봅니다.


mysql> select * from tb_counter;

+---------+

| counter |

+---------+

|       4 |

+---------+

1 row in set (0.00 sec)


모든것이 잘 되었군요.

AWS RDS로 DB 분리해보기

이제 DB 서버를 따로 분리해보록 합니다. (주의: 지금부터는 별도의 AWS 서버를 사용하므로 일부 과금이 될수 있습니다.) http://aws.amazon.com/ko/free/ 참고: “Amazon RDS 단일 AZ 마이크로 DB 인스턴스 750시간 무료 사용.” 즉 한대의 RDS를 계속 돌릴경우 한달간 무료로 사용가능합니다.


위 그림처럼 한대의 EC2에 다 들어 있는 것에서 확장성을 위해 DB 서버를 분리하는 것입니다.


  1. [RDS] 만들기 - AWS 콘솔에 들어간다음 Database 섹션에 있는 RDS를 선택



아래와 같이 빨리 시작해보라는 화면이 나옵니다.



우선 DB engine으로는 MySQL을 선택하고 (또는 본인의 기호에 맞는 엔진 선택)



이 RDS를 production에 사용할것인지를 물어 봅니다. 이 옵션에는 두가지가 있는데 Multi-AZ deployment는 아마존이 가지고 있는 각각의 데이터 센터에 DBMS의 복사본을 두어서 접속 속도를 빠르게 한다는 것입니다. 추가로 IOPS라는 빠른 속도의 디스크를 사용합니다.


우린 EC2가 하나 (한지역)에 있기때문에 그냥 No를 선택합니다.




다음은 DB서버의 사양과 zone, 데이터의 용량을 선택합니다. 대략 아래와 같이



추가로 DB instance의 이름과 관리자 아이디/비번을 설정합니다.


마지막으로 넷트웍과 보안관련 설정인데 Security group을 만들고 어느 컴퓨터에서 이 DBMS로 접속이 가능할지를 설정해야 합니다. 중요!


추가로 백업 주기와 MySQL의 업데이트를 자동으로 할것인지 선택.

그런다음 Launch를 누르시면 됩니다. (선택사항 많네요.)


그럼 초록색으로 잘 되었음을 알리고 우리의 DB instance를 보실수 있습니다.



아래처럼 인스턴스를 볼수 있는데 이때 중요한거 2가지. Endpoint: DB 서버 주소 와 security group: 접속 보안 설정



우선 Security Group의 rds….어쩌구를 click하여 Inbound를 설정해봅니다.




모든 곳에서 접속되도록 완전 열어도 되고, 우리 같은 경우 EC2에서만 사용할 예정이므로 EC2의 private IP를 사용해서 이곳에서만 접속 되도록 해도 됩니다. (반드시 private ip 사용, public ip는 서버를 재가동시키면 바뀝니다.)



EC2의 dashboard에서 private IP를 찾아 볼수 있습니다. 추후 EC2 instance가 많아 지면 각각에 대해 룰을 여러개 추가 하면 됩니다.



다른 더 좋은 방법으로는 같은 Security groups를 사용하는 모든 서버에서 접속 가능하게 할수 있는데 EC2 서버들이 많고 이들이 같은 Security group을 사용한다면 매우 유용한 설정 방법입니다. 다시 한번 EC2 Dashboard에서 우리 instance를 보도록 합시다. Security groups에 ssh+http 를 사용하는데 이를 Inbound rule에 넣을수 있습니다.



설정을 위해 RDS의 Security group 으로 간다음



Inbound를 Edit 합니다. (또는 Rule추가) 여기에 EC2가 사용하는 Security group 이름을 입력하면 이렇게 선택할수 기존 security group의 이름이 보여져 쉽게 입력 가능하도록 도와 줍니다. 이렇게 하면 DB 서버를 ssh+http Security group을 사용하는 모든 EC2 서버에서 접속 가능합니다. 멋진 세팅이죠?



2. [RDS] DB연결 - 이제 RDS에 있는 Endpoint 의 주소로 접속이 가능합니다. (이주소도 엄청 길어요.)


길지만 접속을 시도...

Macintosh-2:~ hunkim$ mysql -h rds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p

Enter password: ****

ERROR 2003 (HY000): Can't connect to MySQL server on 'rds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com' (110)


그러나 이상하게 연결이 안됩니다. 왜 그럴까요? 역시 Inbound 설정이 잘 되었습니다. 오직 저의 EC2 서버에서만 접속 가능하게 설정이 되었으니까요. 일단 EC2 서버로 ssh한다음 DB연결해봅니다. 이제는 잘 되는 군요.


Macintosh-2:~ hunkim$ ssh ubuntu@hunkim.noip.me


-- ssh로 서버로 접속후

ubuntu@ip-172-31-19-88:~$ mysql -h rds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

[...]


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql>



3. [MySQL Dump and Restore] 그럼 local의 데이타를 RDS 서버로 옮겨봅니다.


ubuntu@ip-172-31-19-88:~$ mysqldump -hlocalhost -uroot -p phpdb > /tmp/phpdb-database.sql                       -- phpdb를 dump


ubuntu@ip-172-31-19-88:~$ echo "create database phpdb" | mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p   -- phpdb 생성


ubuntu@ip-172-31-19-88:~$ mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p phpdb < /tmp/phpdb-database.sql   -- dump 된 sql load


--- 이전과 마찬 가지로 dbuser 아이디를 만들고 권한을 줌

mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -uroot -p phpdb


mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY '*****';

Query OK, 0 rows affected (0.00 sec)


mysql> GRANT ALL PRIVILEGES ON phpdb.* TO 'dbuser'@'%' WITH GRANT OPTION;

Query OK, 0 rows affected (0.01 sec)


귀찮지만 마지막으로 dbuser로 로그인해 시험 해봄


ubuntu@ip-172-31-19-88:~$ mysql -hrds1.cqs7vyyg9qag.us-west-2.rds.amazonaws.com -udbuser -p phpdb

Enter password:

[...]


mysql> show tables;

+-----------------+

| Tables_in_phpdb |

+-----------------+

| tb_counter      |

+-----------------+

1 row in set (0.01 sec)

mysql> select * from tb_counter;

+---------+

| counter |

+---------+

|       4 |

+---------+

1 row in set (0.00 sec)


4. [PHP DB설정 고치기] 마지막으로 PHP가 RDS DB를 사용하도록 수정해줌.



5. [웹 브라우징] 마지막으로 웹으로 접속. 우선 확실히 하기 위해 local mysql을 중지시킨다.


ubuntu@ip-172-31-19-88:~$ sudo service mysql status

mysql start/running, process 8288


ubuntu@ip-172-31-19-88:~$ sudo service mysql stop

mysql stop/waiting


ubuntu@ip-172-31-19-88:~$ mysql -hlocalhost -udbuser -p

Enter password:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)


그런다음 웹으로 마지막 확인. visitor count가 증가 된다. 7번이나 방문!

AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(
이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)


저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.06.30 22:04

AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2)

“인터넷에 연결되지 않은 컴퓨터는 컴퓨터도 아니다.”


제가 막 인터넷을 접하기 시작했던 1995년 전후로 나왔던 이야기 인데 그때도 그랬지만 지금은 정말 더 공감됩니다. 인터넷 없는 컴퓨터로 무엇을 할수 있었을까요?


(조금 늦은감이 있지만) 이제

“클라우드에 연결되지 않은 서버는 서버도 아니다.”


라고 말할때가 된것 같습니다. 본인이 하드웨어나 소프트웨어 업데이트등 직접 관리하지 않아도 되는 그냥 서버에서 내가 하고 싶은 일에만 집중할수 있게 해주는, 그리고 필요하거나 사용자가 많을때 자동으로 늘어나서 서버 느리다는 소리 듣지 않아도 되는 그런 서버 말입니다.


제가 "깨비메일"이라는 서비스를 운영할때 가장 많은 시간을 투자한것이 서버 추가 구입과 설정이였습니다. 그러나 늘어가는 사용자들의 부하를 감당하지 못했고 한꺼번에 많은 서버를 구매할 비용이 없어서 (워낙 큰 투자라) 과감하게 늘리지 못한것이 "깨비메일"이 더 큰 성공을 하는 걸림돌이였습니다.


http://www.slideshare.net/awskorea/your-first-10-million-users-channy 


를 보니 매우 훌륭하더군요.

그때 이런 AWS같은 서비스가 있었다면 하는 생각을 할때가 있습니다.


서론이 길어졌는데 이런 시대에 클라우드에 연결된 서버를 한번 가져보는 것은 매우 의미 있는 일입니다. 클라우드에 연결된 서버를 가지고 여기에 흔하게 하는 LAMP (Linux, Apache, MySQL, and PHP) 한번 가져 봅시다. “AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기” 21 페이지에 나오는 이런 형식입니다.


(AWS와 함께 확장성 높은 천만 사용자 웹 서비스 만들기 21 page)



12개월 무료로 서버하나를 돌릴수 있는 AWS로 바로 시작해봅니다.


...

계속 진행하여 가입을 합니다. 신용카드는 본인 확인용이므로 하나 입력. 사용한 만큼만 요금이 부과되고 우리는 12개월 무료 서버를 사용할 예정이므로 아마존에서 우리 돈을 꺼내가지는 않습니다.



성공하셨으리라 생각하고 이제 로그인 가능하다고 가정합니다.



항상 본인 이름 메뉴에 있는 금전관련 메뉴를 선택해 보는 습관을 가지는 것이 좋습니다. 이렇게 저처럼 0이 많을 수록 좋습니다. (첫 $1이 청구될때 alert을 받도록 설정도 가능하니 메뉴를 찾아 보세요.)



1부 서버 instance  만들기


로그인을 하면 상당히 많은 선택이 있지만 우리는 여기서 EC2에만 집중합니다.


대략 이런것이 보일텐데 “Launch Instance”를 눌러줍니다.



총 7단계가 있는데 ...


  1. 우선 처음 무슨 OS를 선택할것인가 물어 봅니다. 전 Ubuntu로 선택. (각자 기호에 따라 선택).



2. 다음은 사용할 서버의 사양을 물어 봅니다. 망설이지 말고 일단은 무료 (Free)를 선택해 줍니다.



3. 이 과정 설정은 너무 많고 어렵네요. 그냥 모두 기본값으로.


4. 하드디스크! 30G까지는 무료라고 하니 기분좋게 30G로 주욱~ 올립니다.



5. 인스턴스에 테그를 주는것 같은데 나중에 이것으로 관리 하려고 하는것 같지만 우리는 일단 하나니까 그냥 pass.


6. 가장 중요한 부분입니다. 이 서버를 어떻게 어디에서 접속가능하게 할것인가 설정합니다. 서버입장의 firewall을 설정한다 보면 됩니다.


Security group name에 의미 있는 이름을 주시고, “Add Rule”을 눌러 http를 아래와 같이 추가해줍니다. 0000이면 아무곳에서나 접속 가능. 나중에 이 서버에 다른 서비스를 추가 하려면 반드시 이 security group에 와서 Rule을 추가해야 합니다. 아니면 서버는 실행이 되지만 외부에서 연결이 되지 않습니다.



7. 마지막으로 한번더 설정을 보여 주고 확인 합니다.


여기 큰 박스로 ssh와 http로 외부에서 접속 가능한데 정말 괜찮겠냐고 물어 봅니다. ssh같은 경우 본인의 학교 서버나 집에서만 접속이 가능하도록 설정하는 것도 도움이 되겠습니다. http는 다 열어두어야 겠지요?


마지막으로 “Launch” 버턴을 눌러줍니다. 짜잔~~ 이라고 하려고 했는데 하나를 더 물어 봅니다.


8. 매우 중요! 이 서버 접속 어떻게 할래? 어떤 키를 사용할래? 아니면 새로운 키를 만들까?


여기에 의미 있는 키의 이름 (키 파일 이름)을 적고 키를 다운로드 합니다. 다운 받은 key (pem)는 이렇게 생겼습니다. (이 예제는 일부만 보여줌)



이 키는 정말 정말 잘 보관하여야 합니다. 다른 사람에게 보여주거나, 이메일로 보내거나, (실수로) github 같은데 올리면 큰일 납니다. 이 키만 있으면 비밀번호 없어 서버에 마음대로 들어 갈수 있으니 이 키를 잘 다운 받아 놓고 파일 이름 기억.


파일 다운로드가 끝나면 더디어 인스턴스를 시작할수 있습니다. 아래 “Launch Instances” 버턴을 한번더 눌러 줍니다.


그럼 성공을 암시하는 녹색 글이 많이 보이고 아래 참고할 문서들의 링크를 덤뿍 걸어 줍니다. (읽을 것이 너무 많네요.)

그럼 다시 EC2 데시보드로 가봅니다. 이전에는 0이던 것이 이제 1개씩 뭔가 돌고 있습니다.



Instances 메뉴를 선택해봅니다.


잘 돌고 있습니다. Instance ID의 번호를 선택해서 이 instance를 자세히 봅니다.


여기서 중요한 것은 Public DNS: ec2-52-27-17-52.us-west-2.compute.amazonaws.com

이름은 정말 길군요. 여기 어떻게 접속하지? 위에 있는 Connect란 버턴을 눌러 봅니다.



뭐 복잡하게 설명합니다.

한마디로 이전에 받은 키로 ubuntu 아이디로 그 서버에 접속하라는 것입니다. 이제 서버 준비 완료!


2부 서버 설정 시작


  1. [DNS] 우선 이 복잡한 이름좀 어떻게 해보죠.

ec2-52-27-17-52.us-west-2.compute.amazonaws.com

이건 암기나 타이핑 불가능! 여러분이 DNS를 가지고 있다면 CNAME 같은것으로 처리해줍니다. 아니면 간략한 호스트 이름을 주는 noip.com 같은 것을 이용해 짧은 이름을 지어 줍니다. (Public IP는 부팅시 바뀌기 때문에 반드시 이 이름을 사용.)


설정후 이제 hunkim.noip.me 로 EC2 서버 사용가능합니다.


2. [ssh-add] 키를 제 로컬 컴퓨터에 추가해봅니다.

ssh를 이용해 서버에 접속하면 되는데, 이때 위에서 다운 받은 키파일을 이용합니다. local$ 은 본인이 사용하고 있는 리눅스나 Mac이라 생각하시면 됩니다.


local $ chmod 400 hunkim-key.pem    -- 본인만 읽을수 있도록 권한 설정

local $ ssh-add hunkim-key.pem

Identity added: /Users/hunkim/Downloads/hunkim-key.pem (/Users/hunkim/Downloads/hunkim-key.pem)      


3. [server] 이제부터 서버에 접속해서 작업


local $ ssh ubuntu@hunkim.noip.me          -- ubuntu 사용자 이름 주의  

The authenticity of host 'hunkim.noip.me (52.27.17.52)' can't be established.

RSA key fingerprint is ce:3b:b5:f6:fb:e4:50:01:78:fe:d0:ac:c3:1e:bc:67.

Are you sure you want to continue connecting (yes/no)?    --- 이 서버가 맞는지 확인. yes 를 입력

ubuntu@ip-172-31-19-88:~$



4. [LAMP 설치] 하나의 명령으로 설치해봅니다.


ubuntu@ip-172-31-19-88:~$ sudo apt-get update   -- 우선 전반적으로 필요한 업데이트를 해줍니다.

ubuntu@ip-172-31-19-88:~$ sudo apt-get install lamp-server^    -- ^를 잊지마세요.


중간에 MySQL의 root 비밀번호를 설정합니다.   


그러면 놀랍게도 LAMP 설치가 완료 되었습니다.


5. [index.php] 그럼 index.php를 하나 만들어 봅시다. 웹 디렉토리는 /var/www/html 입니다.


ubuntu@ip-172-31-19-88:/var/www/html$ sudo vi index.php

ubuntu@ip-172-31-19-88:/var/www/html$ cat index.php

<html>

<head>

 <title>PHP Test</title>

</head>

<body>

<?php echo '<p>Hello World</p>'; ?>

</body>

</html>


6. [웹접속] 좋아 하는 브라우즈로 접속해 봅니다. 아래와 같이 Hello World가 뚜렷이 보인다면 성공!


AWS 기본 시리즈

  1. AWS01 - 12개월간 무료로 클라우드 연결된 서버를 돌려보자 (EC2).

  2. AWS02 - 클라우드에 DBMS를 연결 (AWS RDS)

  3. AWS03 - 앞단의 클라우드 서버를 N대로 늘려보자.

  4. AWS04 - 클라우드 서버들을 묶어 Load Balancing하자.

  5. AWS05 - 클라우드 서버가 부하에 따라 자동으로 추가/삭제 (auto scaling)


(
이글에 나오는 AWS관련 지식은 Amazon Web Services Korea 테크에반젤리스트 윤석찬 <channy@creation.net> 님에게 배운 것입니다.)

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.06.29 23:06

Git으로 웹/테스터 서버 관리해보기

(GIT으로 웹개발을 하다가 배운 것인데 기록을 위해 정리해 봅니다. 간략하게 적기 위해 경어를 사용하지 않았습니다.)


git으로 많이 하는데 본인이 랩탑 (Mac)에서 개발을 하면서 AWS (Amazon Web Services, http://aws.amazon.com/) 등 여러 서버들을 사용하여 테스트도 하고 (테스트 서버)  또 일부 사용자들에게 베타 테스트도 하고 또 마지막으로 전체 사용자들에게 릴리즈 (프로덕션 서버)할텐데  


1. 로칼에서 개발을 하고 테스트를 한다음 잘되면

2. 테스트 서버로 자동으로 파일들을 보내주고

3. 문제 없으면 프로덕션 서버로 자동으로 보내 준다면

4. 그리고 이 모든것을 본인의 로컬인 렙탑에서 할수 있다면 




위의 그림처럼 할수 있다면 얼마나 좋을까? 많이 사용하는 git push와 hook으로 쉽게 할수 있는 방법이 있다. (http://toroid.org/ams/git-website-howto 에서 배워왔습니다. heroku, https://www.heroku.com/ 도 이와 비슷한 원리.)


우선 (1) Mac에서 간단하게 git (clone) 등으로 개발한다고 가정. 여기서는 간단하게 index.html을 가진 git depository를 만듬.


$ mkdir website && cd website 

$ git init

Initialized empty Git repository in /home/ams/website/.git/

$ echo 'Hello, world!' > index.html

$ git add index.html

$ git commit -q -m "The humble beginnings of my web site."


그런후 서버 (2) 에 로그인 한다음 

$ssh ubuntu@test.serv

---- login 이후 서버 (2) 에서 작업

$ mkdir website.git && cd website.git

$ git init --bare

Initialized empty Git repository in /home/ams/website.git/

$ pwd

/home/ubuntu/website.git    -- git의 디렉토리를 확인하세요.


그런다음 서버 (2)의 웹 디렉토리가 어디인지 확인하고, 이 예에서는 /var/www/html/hunkim 이라 가정하고 이 디렉토리를 GIT_WORK_TREE로 설정하고 git checkout 을 하도록 post-receive hook을 지정하면 된다. 물론 git의 hook을 실행시키는 사용자 (예제의 경우 ubuntu)가 /var/www/html/hunkim 디렉토리에 쓰기 권한이 있어야 한다.

---- 서버 (2) 에서 계속 작업

$ cat > hooks/post-receive

#!/bin/sh

GIT_WORK_TREE=/var/www/html/hunkim git checkout -f

$ chmod +x hooks/post-receive



이제 설정 거의 완료! 마지막으로 로컬인 Mac (1) 으로 돌아 온다음 위 git을 remote에 추가 한다.

--- 로컬 (1) 에서 작업

$ git remote add test ssh://test.serv/home/ubuntu/website.git  -- remote의 이름을 'test'로 붙여줌    

                                                                                -- 아까 서버 (2) 에서 확인한 git directory

                                                                                -- 로그인은 ssh-agent등을 사용 자동으로 되게하면 편리.

$ git push test +master:refs/heads/master  -- git refspec을 통해 master를 가져오도록 설정.


이제 서버 (2)의 지정된 디렉토리 (/var/www/html/hunkim) 에 index.html이 생겨난 것을 확인.


그럼 이제 Mac (1) 로컬에서 마음껏 수정하고 파일도 추가한 다음 늘 하던데로 git commit하고 바로 다음 한명령만 주면 모든 수정된 내용이 test 서버 (2)에 적용! 이렇게 쉬울수가 없죠?


--- 로컬 (1) 에서 작업

$ git push test


이런 방식으로 원격 repository를 --bare로 만들고 work_tree를 분리하는 이유는 지정된 디렉토리 (/var/www/html/hunkim)에 불필요한 git의 메타데이타 (.git 디렉토리)를 남기지 않기 위한이다. 이렇게 하면 지정된 디렉토리에는 작업한 파일만 보내 지게 된다.


그럼 production 서버 (3)나 다른 서버들을 추가 하려면 어떻게 하면 될까? 위와 똑 같은 방법으로 설정하신다음 remote을 add 할때 다른 이름으로 하면 되겠죠? 그럼 git push test, git push production, git push XXX 등으로 각각 다른 서버로 commit된 파일들을 보낼수 있게 된다.


혹 더 좋은 방법이나 툴들이 있다면 댓글로 알려 주세요.


저작자 표시 비영리 변경 금지
신고
트랙백이 없고 Comment 2
  1. 김홍식 2015.10.02 18:46 신고 address edit & del reply

    다짜고짜 질문 정말 죄송합니다. 제 나름대로는 너무 중요한 일이라서.... T.T
    mobius9@gmail.com입니다.

  2. 2015.10.02 18:48 address edit & del reply

    비밀댓글입니다

2015.05.25 13:39

10년의 리젝경험을 바탕으로 SE 연구에 무섭게 일어나는 중국

ICSE는 소프트웨어 공학 (SE) 최고의 학회인데 보통 SE 연구가 활발한 곳을 중심으로 개최 됩니다. 이런 큰 학회를 개최하기 위해서는 ICSE 커뮤니티에서 활발하게 활동하는 현지인이 필요합니다. 그래서 보통 전체 학회를 준비하는 준비위원장 (General Chair)는 현지 사람이 하게 됩니다.


그러던중 이상한 일이 일어났습니다. 2006년 ICSE의 개최가 중국 상해로 결정된 것입니다. 그 당시 중국에서 활발하게 SE연구자로 활동하는 사람도 없었기때문에 중국분중 준비위원장을 할만한 분도 없고 ICSE에 오시는 중국 분들도 많지 않았고 또 무엇보다도 중국에서 나오는 논문은 거의 없었기 때문입니다. 이례적으로 준비위원장은 중국분이 아닌 다른 유명한 분이 맡고 프로그램 위원장도 중국분들이 아닌 다른 분들이 맡아서 ICSE가 개최되었습니다.




당시 이에 대해 많은 이야기가 오갔습니다. 상하이가 시차원에서 전폭지원 + 금전적 지원설을 비롯해 심지어 프로그램 위원회 (PC) 몇명은 중국대학 사람으로 쿼터를 요구했다는 이야기도 있고 심지어 일부 중국논문 쿼터설까지... ICSE에서 PC는 몇몇 중국 분들을 넣어 준것으로 알고 있고, 논문 심사와 질에대해서는 절대 양보가 없어서 우회적으로 Far East Asia Experience Track 이라는 것을 만들어 사실상 China Track을 만들어 주었다는 이야기도 있습니다.


그러나 2006년 ICSE에 이상한 일이 일어났습니다. 한해 전인 2005 년 313편의 논문이 접수 되었는데, 2006년 갑자기 393편으로 거의 400편에 가까운 논문이 접수된것입니다. 그 당시 분위기는 중국에 가는 것을 꺼리는 분들이 많았기 때문에 위치적으로 보자면 논문 접수가 줄어야 하는데 오히려 더 많이 늘어난 것입니다. (2007년에는 다시 334, 2008년 371, 2009년이 되어서야 다시 400편대로 올라서게 됩니다.)


더욱 이상한 것은 2006년 논문의 억셉트 비율이 ICSE 최초로 한자리수 (9%)를 기록했다는 것입니다. (보통 15~20% 정도인데 ) 9%는 정말 말도 안되는 낮은 수치입니다. 반대로 생각해 보면 제출된 논문의 질이 매우 낮았다는 이야기인데요, 이 질이 낮은 논문들은 어디서 온것일까요? 바로 그렇습니다. 2006년에 중국에서 100편 정도는 제출하지 않았나 생각합니다. (제가 당시 PC는 아니라 이는 단순 예측입니다.) 위 9% 억셉트에서 유추해볼수 있듯이 2006년 당시 메인 연구 트랙에는 중국 논문들을 모두 떨어졌습니다.


이 2006년 ICSE를 계기로 중국 논문들이 계속 접수됩니다. 그러나 억셉트 되는 논문은 0 입니다. 가끔 농담으로 중국 논문들이 100편 정도 들어 와서 모두 1차 예선에서 리젝된다는 이야기도 있습니다. 그러나 이들은 계속 계속 계속 논문을 보내고 또 리젝되었습니다.


이렇게 리젝의 역사 10년, 놀라운 변화가 일어나기 시작합니다. 드문 드문 중국 대학에서 작성한 논문이 보이기 시작하더니 올해 2015년 ICSE에는 중국 대학에서 발표된 논문이 최소 2편 (제가 PC가 아니라 그냥 본것), 그리고 FSE 2015년에도 중국대학 논문이 2편이나 억셉트 되었습니다. (물론 유학을 하는 중국 학생, 미국 등에서 교수로 일하고 있는 중국 연구자들의 논문은 이제는 셀수 없이 많습니다.) 이 글에서는 중국 대학 자체로 억셉트 된 논문을 말하는 것입니다. 리젝되면서 보내진 리뷰를 10년간이나 보면서 이들은 매우 좋은 연구를 하고 또 좋은 논문을 쓸수 있는 경험이 축적된 것입니다. 이제 2016, 2017년 중국 대학 논문들이 몇편이나 있을지 뻔히 보이고 이제 무섭기까지 합니다.


자랑스러운 우리 대한 민국은 어떨까요? FSE 연구 트렉의 경우 2013년 KAIST류석영 교수님 연구실 논문이 유일하게 한국 대학자체 연구로 나온 논문이고 ICSE 연구트랙에는 2004년에 하나 정도 있는 것으로 알고 있습니다. 더욱 큰 문제는 ICSE나 FSE에 보면 한국에서 체출되는 논문의 수가 아예 없거나 매우 적다는 것입니다. 


우리도 빨리 ICSE/FSE등 최고 학회로 가능하면 많은 논문을 보내어 빨리 그리고 더 많이 리젝 경험을 쌓아야 합니다. 그래서 한국에서 논문이 매년 몇편 또는 수십편 ICSE/FSE에서 발표되는것이 당연한 그런 날이 빨리 오기를 기대합니다. 우선 제가 프로그램 보드로 일하게될 ICSE 2016년 부터 시작할수 있습니다. 여러분 최고의 논문을 ICSE 2016 로 마구 마구 보내 주시기를 기대합니다.

  

저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.
2015.05.25 04:04

홍콩과기대 컴퓨터 공학과 세계 8위 진입! (2015 QS Ranking)

제가 일하고 있는 홍콩과기대 컴퓨터 공학과가 2015년 QS Ranking 에 따르면 세계 10위권에 진입하였습니다. 정말 좋은 대학들이 많은데 10위권에 들게 되어 매우 기쁘고 또 아시아의 대학이 세계에서도 크게 인정받고 있다는 것이 아주 의미 있는 일이라 하겠습니다.


참고: http://www.topuniversities.com/university-rankings/university-subject-rankings/2015/computer-science-information-systems


저희 학교에서 멋진 컴퓨터 공학/소프트웨어 공학 연구를 같이할 대학원생들을 계속 모집중입니다!



저작자 표시 비영리 변경 금지
신고
트랙백이 없고 댓글이 없습니다.


티스토리 툴바