본문 바로가기

about DEV

AWS EC2 + S3FS + AutoScaling 설정 방법에 대해서...

서비스하는 웹사이트에서 결제모듈을 연동했다.
문제는,  PG사에서 제공하는 결제Log 에서 생겼다.  Order 가 들어올때, 자체 DB에 저장하긴 하지만, 혹시나 PG사에서 쌓고있는 Log와 비교해야할 상황이 생길 수 있기 때문이다.

물론 위와 같은 상황이 생기지 않는게 가장 Best긴 하지만... 어쨌든 현재까지의 상황은 이렇다.

EC2는 ELB를 거치고 Auto Scaling Group에서 관리한다.  대략적인 스토리보드는 아래와 같다.

1. 해당 EC2의 CPU점유율이 일정수준 이상으로 올라갈 경우, Auto Scaling Manage를 통해서 다음 EC2를 생성한다. 

2. ELB로 접근하는 트래픽을 분산 접속시킨다.

3. 점유율이 일정 수준 이하로 내려갈 경우, 생성했던 EC2를 삭제한다.

DB는 RDS를 이용하고 있기 때문에 따로 처리를 해주지 않아도 되지만, Server Local Storage 에 저장되는 Log파일들은 다르게 처리할 필요가 있다.  찾아보니, S3의 Bucket을 마운트해서 로컬스토리지 처럼 사용할 수 있는 방법이 있었다. 일단 시작해보자.

AWS 콘솔에서 S3메뉴를 선택한 후 새로운 Bucket을 생성한다.


그 후에 S3FS를 내 서버에 설치해야한다. 아래 안내를 따라하도록 하자. 각자의 서버환경이 다르기 때문에 관련 메뉴얼은 S3FS 공식 사이트의 Install Guide를 참조한다.

필자의 서버환경은 Ubuntu 14.04LTS 이며, 일단 터미널의 ssh를 이용해서 서버에 접속한다.

서버에 접속하면 기본적으로 /home/ubuntu 로 접속이 되는데 여기서 진행한다.

$sudo apt-get install build-essential git libfuse-dev libcurl4-openssl-dev libxml2-dev mime-support automake libtool
$sudo apt-get install pkg-config libssl-dev
git clone https://github.com/s3fs-fuse/s3fs-fuse

여기까지는 필요한 패킷들을 설치하고, GIt을 통해 clone 받는다. 

$cd s3fs-fuse/
$./autogen.sh
$./configure --prefix=/usr --with-openssl
$make
$sudo make install


정상적으로 설치가 되었다면, 이렇게 나타나며, 터미널에서 s3fs를 입력하고 엔터를 누르면 옵션이 설정되어있지 않다는 경고가 뜬다.  별다른 이슈없이 설치가 끝났으니 다음 스텝으로 넘어간다.

$sudo vi /etc/fuse.conf



처음에 위 이미지중 user_allow_other 가 주석처리(코멘트처리)가 되어있는데, uncomment시킨다.
그리고 아래 명령어를 입력해서 AWS S3 액세스키와 시크릿키를 입력해준다.

$sudo vi /etc/passwd-s3fs

입력양식은 다음과 같다. ACCESSKEYID:SECRETACCESSKEY 
그리곤 아래의 터미널 명령어들을 입력한다.

$sudo chmod 640 /etc/passwd-s3fs
$sudo mkdir MOUNT_PATH
$sudo s3fs BUCKETNAME -o allow_other MOUNT_PATH
$cd MOUNT_PATH
$touch hello-world.txt

위 순서는 대략 이렇다.  위에 입력한 액세스키/시크릿키의 권한을 부여한 후, 마운트할 디렉토리를 생성한다. s3fs 명령어를 이용해서 맨 처음에 생성한 BUCKET을 새로 생성한 디렉토리에 마운트해준다.  해당 경로로 이동한 후에 테스트용 파일을 생성한다.

그리고 Web의 S3 Console을 접속해보면 hello-world.txt 파일이 생성되어있는 것을 확인할 수 있다.

여기까지는 일반적인 EC2 + S3에 마운트하는 작업이 완료되었다. 하지만 우리가 서비스하는건 AutoScaling을 통해 EC2가 생성되었다가 삭제되기 때문에 자동으로 마운트되는 작업이 자동적으로 되어야한다.  일단 언마운트를 실행한다.

$sudo umount MOUNT_PATH
$sudo vi /etc/init/s3fsmount.conf


그리고 위의 이미지를 참조해서 입력한다.  복사하기 편리하게 아래 텍스트를 참조한다.

start on startup
start on runlevel [2345]
script
exec s3fs BUCKETNAME -o allow_other MOUNT_PATH
end script

그리고 터미널에서 마지막 명령어를 입력하면 끝!

$sudo start s3fsmount

여기까지 완료한 후에 다시 AutoScaling Group을 생성하기 위해서 EC2 Instance를 AMI로 이미지화 시킨 후에 다양하게 테스트해본다. 정확하게 적용이 잘 된다면, 직접 적용을 시키면 된다. 

에러사항이 몇가지가 있었는데, 구글링을 해보면 S3FS 예전 코드를 기준으로 설명하기도 하고, Linux를 기준으로 설명하기도 하고 또 홈 디렉토리가 아닐 경우에 제대로 컴파일이 되지 않는 이슈들이 있었다. 필자는 서버기술이나 우분투/리눅스에 대해서 지식이 별로 없기 때문에 제법 애를 먹었는데, 이 포스팅을 본 다른 개발자분에게 많은 도움이 되었으면 좋겠다.

마지막으로 S3FS를 이용해서 S3 버킷을 마운트할 경우에 속도를 보장하진 않는다. 단순히 텍스트 로깅정도야 문제없겠지만, 고용량을 처리해야할 때는 AWS CLI를 이용해서 코딩해줘야할 필요가 있다. 물론 위와 같이 PG 로그같은 경우엔 내가 접근할 수 없기 때문에 이렇게 처리하는게 가장 낫다고 판단했다.  물론 결제 테스트를 해봐도 큰 이슈가 없었기 때문...

그리고 참고URL은 아래와 같다.

http://www.mornin.org/blog/scalable-wordpress-amazon-web-services/
https://github.com/s3fs-fuse/s3fs-fuse/wiki/Installation-Notes