Print
카테고리: [ Amazon Web Services ]
조회수: 5413

1. AWS 인프라 구축 입문

서버 구축부터 배포, 모니터링, 관리 자동화, DevOps까지 따라하며 배우는 과정의 기록입니다.


2. AWS (Amazon Web Services)

AWS는 미국 기업인 아마존에서 만든 클라우드 서비스 플랫폼입니다.

2000년도 쯤 인터넷 쇼핑몰을 운영하던 아마존은 늘어나는 트래픽과 주문량을 감당하면서 자연스럽게 뛰어난 내부 인프라 시스템을 구축했습니다.

2006년부터 이 인프라를 누구나 쉽게 사용할 수 있게 만들어서 다른 회사에 돈을 받고, 서비스를 하게 되면서 탄생한 것이 AWS입니다.


3. EC2를 생성하기 위해 꼭 알아야 하는 개념

EC2 (Elastic Compute Cloud)는 우리가 쉽게 사양을 고르고 원하는 시간만큼 사용할 수 있는 '가상 서버'입니다.

EC2를 생성하기 위해서는 AMI, 보안 그룹, 키 페어를 꼭 알아야 합니다.

3.1. AMI (Amazon Machine Image)

생성할 EC2 인스턴스의 기반이 되는 이미지. 윈도우를 설치 할 때 CD나 ISO파일을 이용해 특정 버전의 윈도우를 설치하는 경우를 생각해보면, 윈도우 CD나 ISO파일을 만드는 것과 같은 원리라고 생각하면 됩니다.

AWS에서 유우명한 auto scaling이 가능한 이유도 인스턴스들이 AMI를 이용해서 만들어 졌기 때문입니다.

3.2. 보안 그룹 (Security Group)

보안을 위해 IP와 포트 번호를 이용해 정희하는 서버 접속 규칙.

특정 IP와 포트에 대해서만 서버에 접속을 허용하거나 금지 할 수도 있습니다.

3.3 키 페어 (Key pair)

글자 그대로 서버에 접속하기 위한 열쇠라고 이해하면 됩니다.

공개 키 암호화 기법으로 서버에는 공개키(public key)를 두고 사용자는 개인키(private key)를 들고 접속하게 됩니다.

*개인키는 유출될 경우 허가받지 않은 사람도 서버에 접근할 수 있으니 안전하게 보관합시다...


4. EC2 생성 및 기타 설정

4.1. 인스턴스 생성(몇번의 클릭만으로 바로 생성할 수 있었습니다)

 

4.2. 보안그룹 설정

그림에는 HTTP(80)와 HTTPS(443)에 대한 보안그룹만 보여주고 있습니다. 바로 아래 putty를 통해 EC2에 접근하기 위한 ssh(22)도 설정해 주었습니다.

생성한 보안 그룹을 인스턴스에 적용하는 방법은 (인스턴스 생성 후) 우클릭 -> 네트워킹 -> 보안 그룹 변경 에서 가능합니다.

4.3. EC2 인스턴스 정보 확인.

그림처럼 생성한 EC2 인스턴스의 정보를 확인할 수 있으며, IPv4 퍼블릭 IP 를 사용하여 putty로 EC2에 접근할 수 있습니다.

(public domain과 IP는 별도의 설정을 하지 않으면 인스턴스가 꺼지고 켜질 때마다 새로 할당 됩니다.)


5. 실습을 위한 서버 환경 구성

*엔진, 로그, 소스로 파일시스템을 구성하고 진행했습니다. 원하는 대로 생성하셔도 무방합니다.

*권한은 기본적으로 생성되는 사용자인 ec2-user로 전부 바꿔주고 진행합니다.

*실습은 github에 공개된 어플리케이션으로 진행하고, 서비스할 어플리세이션은 Node.js로 만들어 졌습니다.

5.1. Node.js 설치

nvm을 설치하는 스크립트 파일 다운로드

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

*nvm (node version manager)은 원하는 버전의 노드르 설치 및 관리할 수 있는 어플리케이션입니다.

내려받은 스크립트 실행

~/.nvm/nvm.sh

nvm을 이용해 Node.js 10.13.0 버전 설치

nvm install 10.13.0

설치 확인

node -e "console.log('Running Node.js ' + process.version)"
#콘솔에 Running Node.js v10.13.0 이라고 뜨면 정상

코드 배포

#시스템 패키지를 설치할 때는 root 권한이 필요
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

git clone https://github.com/deopard/aws-exercies-a.git
cd aws-exercise-a
npm install

(시스템 패키지를 설치할 때는 root 권한이 필요하다)

 

Nginx, Phusion passenger 설치

*Nginx 는 2019.9.17 기준 전 세계 점유율 30.8%를 차지하는 대표적인 WEB서버 입니다. Nginx가 주 목적은 아니기 때문에 설명은 생략하지만 문서가 잘 되어 있으니 참고하시면 좋을 것 같습니다.

(출처 : https://w3techs.com/technologies/overview/web_server/all )

 

*WAS는 처음 접해보는 Phusion passenger 를 사용합니다.

Phusion passenger는 여러 언어로 된(Node.js, Python, Rudy, Meteor) 어플리케이션을 지원하고 문서화가 굉장히 잘 돼 있다는 장점이 있다고 합니다.

특이하게, 별도의 WEB서버 없이 단독으로 동작하는 독립형 모드(Standalone mode), Apache HTTP server 혹은 Nginx와 연동되어 실행 되는 

통합모드를 지원합니다.(각, Apache/Nginx integration mode)

자세한 설명은 공식홈페이지(https://www.phusionpassenger.com)에서 확인할 수 있습니다.

wget http://s3.amazonaws.com/phusion-passenger/releases/passenger-5.3.6.tar.gz
#Phusion Passenger도 파일을 호스팅 할 때 AWS를 사용하고 있네요!

tar zxvf passenger-5.3.6.tar.gz
mv passenger-5.3.6 passenger
#공개키 내려받기
#저는 아래와 같이 진행했을 때 에러가 발생했습니다.
#에러가 생긴 경우 gpg -> gpg2 로 바꾸고 다시 진행하시거나 콘솔에 추천 명령어가 보이실 겁니다. 그걸 복사 해서 실행하시면 됩니다.
curl -sSL https://rvm.io/mpapis.asc | gpg --import
#stable 버전의 rvm
curl -L get.rvm.io | bash -s stable
#rvm 명령어를 현재 터미널 세션에서 사용할 수 있도록 설정
source ~ec2-user/.rvm/scripts/rvm
rvm reload

#Ruby를 설치하는데 필요한 라이브러리와 Ruby 설치
rvm requirements run
rvm install 2.4.3

#Passenger 명령어 실행 편의를 위한 환경변수 설정
echo export PATH=/engn001/passenger/bin/:$PATH >> ~/.bash_profile
source ~/.bash_profile

#Phusion Passenger를 이용해서 nginx를 설치 할 수 있습니다.
passenger-install-nginx-module

#진행 중 경고 메세지와 함께 시스템에 가상메모리가 부족해서 설치 시에 문제가 생길 수 있다고 표시 됩니다.
#<ctrl + c>를 누르고 installer에서 추천하는 명령어로 가상 메모리의 크기를 늘립니다.
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

#다시 진행
passenger-install-nginx-module

5.2. Nginx 설정 변경(nginx.conf)

http{
    #긴 서버 name을 허용하도록 추가
    server_names_hash_bucket_size 256;
    passenger_root [passenger설치 경로];
    passenger_ruby /home/ec2-user/.rvm/gems/ruby-2.4.3/wrappers/ruby;

    ...
}
#서버등록
server {
    listen 80;

    server_name [EC2 인스턴스의 Ipv4 퍼블릭 주소];
    #Document root 설정! Apache의 Document root 설정을 nginx에서는 root로 하더군요
    root [aws-exercise-a 디렉토리 경로]/public;

    #Passenger 앱임을 명시
    passenger_enabled on;

    #Passenger에게 Node.js 앱임을 명시해준다
    passenger_app_type node;

    #Passenger 시작 파일
    passenger_startup_file [aws-exercise-a 디렉토리 경로]/app.js;

    #기본설정은 삭제
    #location / {
    #    root    html;
    #    index   index.html index.htm;
    #}
}

5.3. Nginx 기동 테스트

설치가 제대로 되었는지 기동해볼 차례입니다.

우선 80포트를 사용하고 있으니 저는 nginx엔진/sbin/nginx에 setcap 설정을 해주었습니다.

sudo setcap 'cap_net_bind_service=+ep' /nginx엔진 경로/sbin/nginx

그리고 nginx가 기동된다면 브라우저에 EC2인스턴스의 주소를 입력하면

 

        AWS exercise의 A project입니다.

 

위와 같은 문구가 화면에 보일 것이고, 그러면 끝입니다!

 

(EC2 인스턴스 정보에서 퍼블릭 DNS(IPv4)를 입력하시면 됩니다.)

 

*저는 기동시 아래와 같은 에러를 마주했습니다.. 

*Node.js에서 심심치 않게 마주하는 에러로 모듈을 못찾는 것 같습니다.

 

 

#nginx의 error.log에서 가져왔습니다.

App 32536 output:     throw err;
App 32536 output:     ^
App 32536 output: Error: Cannot find module 'express'
App 32536 output:    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:580:15)
App 32356 output:    at Function.Module._load (internal/modules/cjs/loader.js:506:25)
...

 

이런 에러가 나온 경우에는 aws-exercise-a 디렉토리의 경로로 가서(packag.json 이 있는 경로입니다)

cd [aws-exercise-a 경로]
npm install express

를 실행하면 제대로 동작이 됩니다.

 

마치며

이제 실습을 위한 AWS EC2 인스턴스, WEB/WAS 구성을 완료했습니다.
지금까지 작업한 내용을 가지고 계속해서 진행하도록 하겠습니다!