mac 커맨드 라인에서 AWS로 파일 올리기

앞으로 이사 만료일까지 4일 남았다. 4일안에 모든걸 해치워야한다. 귀차니즘을 이겨내고 잘 할수있을까? 일단 닷네임에서 AWS로도메인 이전하는건 보류.. 그냥 기존에 닷네임에서 카페24로 바라보던 DNS 서버를 다시 닷네임 자체 DNS로 변경후 A레코드만 추가하면 되는거였다. 이렇게 간단한걸 왜 싹다 AWS로 통일하려고 했을까? AWS가 그렇게 싸지도 않은데 말이지… 암튼 사설이 길었다. 각설하고,…

Mac 에서 AWS로 파일 올리기

매우 간단하다. secure copy 라는 명령어를 이용하면 된다. 여기서 중요한건 바로 콜론(:)!! 콜론을 빼먹으면 안된다.

$> scp -i [aws-인증키.pem] [/로컬PC의 경로/파일명.zip] ec2-user@xxx.xxx.xxx.xxx:[올릴 파일명]

서버에서 AWS로 파일 옮기기

이것도 사실 매우 간단하다. 그냥 wget이나 curl을 응용하면 된다.

$> wget '서버URL'

나도 모르게 줄줄이 새고 있었어 ㅜㅜ

AWS로 옮긴지 이제 한달도 안됐다. 그동안은 AWS로 연습한다고 라우터도 만들고 RDS도 만들어보고 물론 EC2 인스턴스도 만들었었지. 그러다 문득, AWS 비용이 만만치 않다라는 얘기를 상기시키며 살짝 불안감에 떨면서 청구 금액을 봤는데,.. 지난달에 내가산 도메인 말고 비용은 0원이다. 당연하지! 1년간 무료라메? 라고 생각하면서 별 생각없었는데….ㅜㅜ

1년간 무료는 EC2 서버 한다였다는 사실을 이제서야 깨달았다. 청구서의 상세 내역을 보니까 어머나~ 내가 테스트로 만들어본 RDS가 엄청 비싼 녀석이었다. 한번도 접속안했고, 그냥 켜놓기만 했는데.. 벌써 40불… 후덜덜…. 바로 RDS 인스턴스 삭제…

젠장,.. 물론 세미나가서 받은 100불짜리 크레딧으로 직접적인 비용을 쓰진 않았으나… 아깝네..ㅎㅎ 또,.. 새는 돈이 없는지 다시 확인했다. 다행히 다른 녀석들은 한달 써봐야 0.1불도 안나가네.. 다행이다.

강의나가면 AWS로 실습하려했는데 전략을 바꿔야겠다.

AWS 서버로 이전하기 위해 필요한 지식들 1탄

Cafe24에서 약 2년간 가상 서버 호스팅을 이용하다 이번에 AWS로 넘어왔다. 막상 이사오려니 귀찮은 작업들이 많아서 미루고 미뤄뒀는데, 결국 호스팅 계약 만료일에 이르러서야 실행에 옮겼다. 혹시 잊어먹을까 해서 그동안 했던 작업들을 정리해본다.

1. AWS 계정 만들기

맨 처음 해야할 일은 아마존 웹서비스라고 불리는 AWS 계정을 만드는 일이다. 1년간 무료에 혹해서 일단 만들었는데 신용 카드 정보를 입력해야한다. 이말은 즉, “테스트 서버를 1년간 돌리다 니가 그 서버를 직접 내리지 않으면 난 과금하겠다!” 라는 얘기. 하지만 뭐 이미 난 1년 내내 돌릴 개인 서버가 필요하므로 비용은 일단 무시하고 실행에 옮겼다! 다만 AWS는 초보자가 접근하기엔 무리가 좀 있지 싶다. 필요하다면 AWS Essential 무료 강의를 찾아서 듣길 권한다.

2. EC2 인스턴스 만들기

AWS에서 EC2라고 부르는 녀석은 Cafe24에서 가상 서버 호스팅이라고 부르는 가상 서버와 동일한 녀석이다. 일반적으로 서비스가 커지면 Application 서버와 DB 저장소 뿐만아니라 라우터와 로드 발란서도 두고 캐시 서버도 막 두고 그러던데,.. 솔직히 나도 그러고 싶었다. 개인적으로 블로그 외에 연습용 서비스를 몇개 만들어서 돌리고 있기 때문에 EC2 인스턴스를 여러개 만들어두고 올렸다 내렸다 하고 싶은데, 나중에 과금이 얼마나 될지 가늠이 안되서… 불안하다. 특히 DB를 분리할까말까 엄청 고민을 했다. 하지만 역시나 내 결론은 과금문제..ㅜㅜ.. 그래서 결론은 “EC2 서버 인스턴스 한대를 열씨미 쪼개서 써야겠다.” 라는 결론에 이르렀고 나중에 이사는 그만 다니고 싶어서 평생 AWS에서 살겠다는 각오로 EC2 인스턴스를 어떻게 활용할까 전략을 짰다.

3. EC2 인스턴스 활용 전략

일단 내가 EC2 인스턴스 하나에 개인 블로그를 포함해 몇개의 서비스를 돌릴지 추려봤다.

  1. 워드프레스 블로그 (Nginx + PHP + MySQL)
  2. 개인 위키 페이지 (Nginx + PHP + MySQL)
  3. NodeJS Application N 개 (nodejs + MongoDB)
  4. NodeJS Application M 개 (nodejs + MySQL)
  5. 기타 잡다 저장소

대충 요렇게 정리하고 보니 몇가지 걸림돌이있었다. 이전 서버에선 APM(Apache + PHP + MySQL) 조합을 이용했는데 이번에 Nginx로 갈아타려고 맘먹고 보니 Nginx 설정도 허들중에 하나였다. 물론 그보다 앞서 서버 접근 권한과 계정을 어떻게 정리하고 관리할지도 문제였다.

4. 서버 접근 권한 및 계정 정리

서버 접근 권한은 나에겐 좀 신세계였다. 나는 프로그래밍은 좋아하지만 리눅스라는 서버와는 그렇게 친숙하지 않기 때문에 찾아보고 옆 짝지한테 물어보고 참… 성가시게 굴었네. 학교 다닐때 나도 남들처럼 PC에 리눅스 좀 설치하고 “나 컴터 존나 잘해 리눅스 깔았꺼든.. 나 쫌 짱이지~?” 하며 뻐기고 다닐껄 그랬다. 특히나 리눅스라는걸 딱히 배우거나 공부한적도 없기 때문에 일반적으로 리눅스 유저들이 계정관리를 어떻게하는지 그게 진짜 궁금했다. 근데 나와 같은 궁금증을 가진 사람이 없는건지 다들 대충 쓰는건지 계정을 추가하거나 삭제하는 글들은 쉽게 검색해서 찾을수있는데, 어떤 룰을 가지고 계정관리를 하고 있는지 아무리 찾아도 안나오드라. ㅎㅎ 나만 못찾는건가? (꿍시렁.. 꿍시렁…)

나의 궁금증을 한번더 자극하는 것은 바로 EC2 서버에 접속하기 위한 Key Pair란 녀석이었다. 이전엔 서버 접속을 위해 계정과 비밀번호가 필요했는데 AWS는 비밀번호 자체가 필요없다는 것이다! 오호라~! 맨날 비번 입력하는거 귀찮았는데 이거 정말 좋은데? 라는 생각도 잠시,… ssh 도움말을 좀 읽어보니… ‘아~ 원래 있는거구나…ㅎㅎㅎ’ 암튼 EC2 서버는 공개키를 이용한 접속을 기본으로 제공한다. 이왕 하는 김에 접속 주소와 공개키를 alias로 엮어 놓으면 엄청 편했다. 공개키 생성관련 내용은 아마존 가이드 문서를 참고하시길….

$> vi ~/.bash_profile
alias "aws"="ssh -i [your-key-pair-name].pem ec2-user@xxx.xxx.xxx.xxx"
대충 요렇게 적고,...

$> source ~/.bash_profile
$> aws 

   __|  __|_  )
   _|  (     /   Amazon Linux AMI
  ___|\___|___|

Wow~~ 벌써 연결됐네... 엄청 간단한걸??? 

여튼 EC2 인스턴스를 만들면 ec2-user 라는 계정이 기본으로 생성되는데, 이 녀석은 sudo 권한이 있는 사실상의 루트라고 보면된다. 다만 루트(root)계정과 다른점은 sudo를 쳐야한다는 귀차니즘 정도? 어쨌든 루트 계정은 아니니까 보안 면에서는 일단 안심! 기존에 Cafe24 가상 서버를 사용할땐 어짜피 나 혼자 쓰는 서버고 또 다른 계정을 만드는 것도 귀찮아서 그냥 root로 접속해왔는데, 그때 무차별 패스워드 대입 공격(BruteForce)에 한번 털린 적이 있어서 Fail2ban도 걸어보고 별짓을 다 해봤던거 같다. 애초에 패스워드 접속을 막고 공개키로만 접속했다면 털리는 일은 없었을텐데… 하는 아쉬움을 뒤로하고 어찌됐든 AWS는 ec2-user라는 계정을 기본으로 생성해준다. 그래서 일단 요걸로 당분간 쓰고 필요할때 루트로 작업하는 걸로… 정리

리눅스를 설치하면 기본적으로 root와 더불어 wheel이 라는든가 demon, staff, bin, sshd, ftp 등등 그리고 apache라는 계정은 자동으로 만들어 주는지 어쨌는지는 모르겠지만 암튼 여러 계정을 자동으로 생성해준다. 어떤 계정들이 있는지 확인을 위해서는 /etc/passwd 파일을 확인해보면 된다.

$> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
....
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
ec2-user:x:500:500:EC2 Default User:/home/ec2-user:/bin/bash
nginx:x:498:498:Nginx web server:/var/lib/nginx:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
....

보통 계정이 생성된 순서대로 기록되기 때문에 ec2-user 까지가 아마도 EC2 인스턴스를 만들면 자동으로 생성해주는게 아닐까 생각된다. 처음에 인스턴스 생성하고 확인해보지 않아서 정확히는 모르겠지만 그럴 가능성이 99.9% 일듯… 참고로 adduser 라는 명령으로 특별한 옵션없이 계정을 생성하면 생성된 계정의 ID는 500번 이후의 번호를 할당받는데, ec2-user가 500인걸로 봐서는 기본 셋팅후 가장먼저 생성한 계정이 아닐까 싶다. 그리고 ec2-user 이후로는 내가 설치한 프로그램의 돌아갈때 필요한 권한을 얻기 위해 자동으로 생성된 녀석이다.

그나저나 난 apache를 깐 기억이 없는데,.. 저 계정은 언제 생성된거징? 리눅스 설치하면 자동으로 생성되는건가? 아시는 분?? 댓글좀… 굽씬굽씬~

5. 계정과 프로세스 그리고 파일 및 폴더 소유자

그동안 리눅스 서버를 만지작 거리면서 계정은 서버에 접근하기 위한 일종의 로그인 유저, 그 이상 그 이하도 아니라서 크게 신경쓰지 않았다! 하지만 이 계정이 참 중요하다는 사실을 nginx에 워드프레스를 깔면서 새삼 실감했다. 어쩜 “개발자라면서 그건 기본인데 그것도 몰랐냐?” 할수도 있지만… 그래요 전 몰랐어요 흑흑… 지금이라도 알아서 참 다행이야!! 아는게 중요한게 아니라 제대로 이해했다는게 중요!!

일단 리눅스에서 프로그램을 실행시키면 누가 그 프로그램을 실행시켰는지 ps 명령어를 통해 알수있다.

$> ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Oct13 ?        00:00:01 /sbin/init
root         2     0  0 Oct13 ?        00:00:00 [kthreadd]
root         3     2  0 Oct13 ?        00:00:01 [ksoftirqd/0]
... 
mysql      447 32720  0 Nov03 ?        00:01:04 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysq
root       473     2  0 Oct13 ?        00:00:00 [md]
root       598     2  0 Oct13 ?        00:00:00 [khungtaskd]
... 

ps -ef 라는 명령을 치면 엄청 많이 나오기 때문에 필요한 것들만 필터해서 찾을수있는데 이때 grep를 사용하면 된다. grep는 정규식을 의미한다는건 참고로 알아두자!

$> ps -ef | grep nginx
nginx    17077 17075  0 Nov04 ?        00:00:05 php-fpm: pool www
nginx    17078 17075  0 Nov04 ?        00:00:05 php-fpm: pool www
...
root     26088     1  0 06:18 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    26090 26088  0 06:18 ?        00:00:00 nginx: worker process
nginx    26400 17075  0 07:04 ?        00:00:00 php-fpm: pool www
ec2-user 26785 26605  0 09:06 pts/0    00:00:00 grep nginx

여기서 보면 nginx의 마스터 프로세스는 root가 실행시켰다. 그리고 실제로 동작하는 워크 프로세스는 nginx 라는 계정으로 실행됐다. 서버가 실행중에 항상 떠있는 데몬을 띄우기 위해서는 service 라는 명령을 이용해 프로그램을 실행시키는 경우가 있는데 service 명령은 ec2-user 계정으로는 권한이 없어서 실행이 안된다. 따라서 sudo를 사용하거나 root로 로그인 해야한다.

ec2-user $> sudo service nginx start
ec2-user $> sudo su
root $> service nginx start

암튼 이렇게 데몬으로 서비스되는 녀석들은 루트가 실행하고 실제 프로그램이 동작할때는 루트 권한을 주면 안되기 때문에 워커 프로세스에는 다른 권한으로 동작시키는 것 같다. 그래서 nginx 라는 계정이 nginx를 설치할때 자동으로 생성되고 이 계정으로 실제 nginx가 실행된다.

여기서 엔진엑스 서버가 nginx 계정으로 실행되는게 매우 중요한데 그 이유는 바로 워드프레스 때문이다. 워드프레스는 테마나 플러그인을 자동으로 다운받고 설치하는데 이때 다운받고 설치하는 일을 엔진엑스 프로세스가 하기 때문에 프로세스의 권한으로 파일을 생성하고 소유하게 된다.

아직 쓸 얘기가 많은데.. 오늘은 너무 많이 써서… 일단 내일 다시 To be continues….