배포는 크게 서버, 클라이언트, 데이터베이스 단에서의 배포 세 단계로 나누어진다. 이 블로그에서는 세 파트를 단계 별로 알아볼 것이다.
생성한 인스턴스에 원격으로 접속하면 된다.
SSH 연결을 통해 인스턴스에 접속해 보자.
인스턴스 선택 후 연결 버튼 클릭
키 페어 파일 권한 수정 (pem 파일에 누구나 접근할 수 있는 권한이 부여되어 있다면 인스턴스가 연결을 거부함.) chmod 400 key_name.pem, ssh 명령어를 통해 인스턴스에 접속 가능, yes를 입력하면 됨.
패키지를 최신상태로 업데이트를 함 (sudo apt update) -> nvm, node.js, npm를 설치함. -> git을 통해 서버 클론 코드를 받기 -> server 폴더로 이동 후 npm install 수행. -> sudo npm start로 서버를 실행함.
아직 EC2 인스턴스의 DNS 주소를 눌렀을 때 사이트에 연결할 수 없다는 메시지가 뜸 (보안그룹을 설정하지 않았기 때문) 보안 그룹 HTTP 80 0.0.0.0/0을 추가함.
보안 그룹이란 인스턴스로 들어가고(인바운드) 인스턴스에서 나가는(아웃바운드) 트래픽에 대한 가상 방화벽입니다.
인바운드 규칙에 허용되는 규칙만 인스턴스에 접근할 수 있습니다. EC2 인스턴스를 생성하면 기본적으로 SSH 접속을 위한 SSH 규칙만 생성되어 있습니다. EC2 인스턴스를 생성하면 기본적으로 나가는 모든 트래픽을 허용합니다. -> 인바운드 규칙을 설정합니다. -> 규칙 추가 버튼을 누른다. HTTP 80 0.0.0.0/0을 추가함. 모든 주소에 대해 요청을 허락하는 설정임. 이 때 소스는 특정 보안 그룹일 수도 특정 IP 주소일 수도 혹은 모든 트랙픽에 대해 허가일 수도 있습니다.
PM2 (프로세스 매니지먼트 도구)
프로세스: 컴퓨터 프로그램이 실행될 때 프로그램 실행에 필요한 내용이 컴퓨터 메모리에 적재된다. 실행 중인 프로그램.
웹 서버가 구동 중인 node 프로세스가 종료되지 않게 해야 한다는 것
node 프로세스가 ssh 접속 여부와는 상관없이 늘 실행되게 만들 수는 없을까?
프로그램을 백 그라운드로 실행하는 방법은 linux/unix 계열 운영체제에서는 '&'라는 키워드를 명령어 뒤에 붙여 백그라운드 실행으로 만들어줄 수 있습니다. (node index.js &)
PM2: 프로세스를 전문적으로 관리해주는 프로그램.
PM2는 node.js로 실행되는 프로그램(프로세스)를 관리해 주며, 백그라운드에서 실행되게 만들 수 있습니다.
PM2의 다른 기능
pm2가 프로세스를 실행시킬 때 관리자 권한으로 실행하지 못해 생긴 문제 -> 관리자 권한을 부여하기 위해서는 'authbind'라는 패키지를 추가적으로 설치해야 함.
authbind를 설치하는 법:
sudo apt-get update
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown ubuntu /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80
authbind --deep pm2 update
관리자 권한을 부여하기 위해서는 authbind --deep 명령어를 앞에 추가해야 함.
authbind --deep pm2 start app.js 명령어를 통해 서버를 다시 실행하면 문제없이 작동할 것임.
모든 과정이 끝나면 다른 사용자들이 버킷에 업로드된 정적 웹 페이지에 접속할 수 있다.
빌드하기에 앞서 환경변수를 담은 .env파일을 확인합니다. 이 환경변수에는 필히 http://나 https://를 포함해야 합니다. 환경 변수를 제대로 설정하지 않으면 서버에 요청을 제대로 보내지 못하게 되고, 그 결과 정상적인 응답을 받아올 수 없습니다.
환경 변수 관령 설정이 완료되면, 터미널에 npm run build 명령어를 입력하여 빌드 과정 진행 -> compiled successfully 라는 문구가 보이며 빌드 과정이 마무리 됨. 빌드 과정이 끝나면 build 폴더를 local로 이동시킨 후 s3에서 만든 버킷에 build 폴더 안에 있는 모든 파일을 upload를 시킨다.
퍼블릭 액세스 차단 옵션을 해제하고 정책을 생성함. 퍼블릭 액세스 차단을 해제하고 S3 Bucket Policy를 선택하고 모두에게 공개한다는 의미에서 Principal에 *를 입력합니다. GetObject 옵션을 선택한다. (버킷에 접근하는 모든 사용자가 버킷 내에 저장된 객체 데이터를 읽을 수 있게 됨, 버밋
킷을 웹 사이트 용도로 구성할 때 선택하면 좋음) Generate Policy 버튼을 누르면 정책이 생성됨. 정책은 JSON 형태로 생성됨. 속성 메뉴로 이동하여 웹 사이트 엔드 포인트 주소를 클릭하면 브라우저에 정상적으로 화면이 출력된다.
MySQL 데이터베이스 엔진을 사용하는 DB 인스턴스를 생성함.
로컬 환경에서 MySQL 클라이언트를 활용하여 DB 인스턴스에 연결함.
서버 환경 설정하여 데이터베이스에 연결
DB 인스턴스를 생성
데이터베이스 메뉴 클릭 -> 데이터베이스 생성 버튼을 클릭 -> MySQL과 프리티어를 선택 -> DB 클러스터 식별자 이름, 마스터 사용자 이름, 마스터 암호 기재 -> 퍼블릭 액세스 가능 부분 예로 설정 -> 보안 그룹 default로 설정 -> 데이터베이스 포트를 번호 노출 방지 목적으로 13306으로 지정 -> 데이터베이스 이름을 test로 설정 -> 데이터베이스 생성 버튼 클릭
MySQL 클라이언트를 활용하여 DB 인스턴스에 연결
DB 인스턴스를 클릭하여 엔드포인트 주소 확인 -> MySQl을 통해 DB 인스턴스에 접속 (mysql -u [마스터 이름] --host [엔드 포인트 주소] -P 13306(포트 번호) -p) -> 마스터 비밀번호 입력 -> MySQL에 접속이 되면 터미널에 show databases;를 입력 -> 초기 데이터베이스 test가 보인다면 정상적으로 연결된 것임.
서버 환경 설정
서버를 종료하고(ctrl + c) 환경 설정 파일을 수정한다. (.env.example -> .env) -> nano .env 로 .env파일을 연 후
DATABASE_HOST 변수에는 생성한 DB 인스턴스의 엔드포인트 주소를 넣는다.
DATABASE_USER 변수에는 마스터 사용자 이름을 넣는다.
DATABASE_PASSWORD 변수에는 마스터 암호를 넣는다.
DATABASE_PORT에는 DB 인스턴스의 port 번호를 넣는다.
서버를 실행하면 데이터베이스가 서버에 성공적으로 연결된 것입니다.