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

    비밀댓글입니다



티스토리 툴바