AWS lightsail 선택 이유
AWS lightsail 의 좋은 점은 원하는 사양을 선택하면 한 달에 딱 이만큼의 돈이 나간다 하는게 정해져 있다는 것입니다.
(다만, AWS lightsail 을 이용해서 가상머신을 생성하고 단 30분만에 없애더라도 똑같이 한 달치 비용이 나갑니다)

aws lightsail 이 ec2 보다 좋은 점은 초기 세팅 시 비교적 쉽다라는 것입니다.
저도 이번 실습을 통해 직접 해봤는데, 더 쉬웠던 것 같아요. route53, loadbalancer 까지 한 콘솔에 더 모여있는 점도 좋았습니다.
Pre-requisite (사전 준비물)
본 실습을 따라오기 위해서는 아래 사항이 준비되어 있어야 합니다.
- 프로젝트 소스코드
- 소스코드가 올라가 있는 GitHub 레포지토리
소스코드에 .gitignore 생성하기
루트 디렉토리에 .gitignore 생성합니다.
여기에 기재된 파일명이나 폴더는 git push 시, 포함되지 않으므로 보안이 중요한 파일들을 적으면 됩니다.

SSH Key 생성해서 GitHub으로 안전하게 코드 push 하기
HTTPS , SSH 두 가지 방식이 있는데 SSH 가 더 안전하고 권장되는 방식이라 SSH 를 채택하겠습니다.
SSH 인증 방식의 장점은 로컬에서 GitHub 으로 코드 push 할 때, 데이터가 완전히 encrypt 되어서 넘어갑니다.

인증 방식
1. 로컬 컴퓨터에서 ssh key 생성하기
public key, private key 가 나오는데 github 에 public key 를 전달해주면 됩니다.
% ssh-keygen -t rsa -b 4096 -C "macbook m2"
Generating public/private rsa key pair.
% ls ~/.ssh
id_rsa id_rsa.pub # 이렇게 2개 key 가 보이면 됩니다.
2. [github -> settings -> SSH and GPG keys] 에서 public key 등록하기
key 부분에 위에서 생성된 key 를 등록해주면 됩니다.
이 이후, 로컬 소스 코드를 github 에 push 하는 명령어를 입력해주면 끝입니다.

aws lightsail 인스턴스 생성하기
선택 사양
- Ubuntu 22.04 LTS
- 메모리:1GB, 2 vCPUs 사양의 인스턴스
- 메모리 1GB 미만짜리 인스턴스도 존재하긴 하는데 그걸 선택하면, 빌드가 안 되는 경우도 있습니다. 빌드가 메모리를 좀 많이 먹기 때문인데요.. 사실 이거 때문에 빌드를 CI/CD 로 빼버리는 것도 방법입니다!



VM 에 Node.js, Redis 설치해주기
[주의] 제가 배포할 프로젝트는 Node.js 와 Redis 가 필요한 프로젝트이기 때문에 설치하는 것이고요. 본인 프로젝트에 필요한 프로그램을 찾아서 그에 맞게 설치해주세요. "Ubuntu 환경에서 설치는 이런 식으로 하는거다"의 느낌 정도만 참고해 주세요.
새로 생성된 인스턴스의 터미널 모양을 클릭해서 SSH 접속을 진행합니다. (* 인스턴스가 Pending 이 아닌 Running 상태여야 합니다)

그럼 이렇게 새로운 터미널 창이 열립니다. 새 VM 내부로 접속 성공했습니다 :->

현재 이 서버는 Ubuntu 운영체제만 깔려있는 깡통서버입니다. 소스코드를 실행하는데 필요한 Node.js, Redis 등은 직접 깔아야합니다.
먼저, Node.js 를 다운받기 위해 공식 홈페이지로 갑니다.
VM 에서는 GUI 로 프로그램을 다운받아서 설치할 수 있는 환경이 아니기 때문에,
Package Manager 탭을 클릭하면 터미널에서 바로 설치할 수 있는 스크립트가 나오는데요, 이를 VM 터미널 창에서 실행 시켜줍니다.

다음으로 Redis 공식 홈페이지 가서, Linux 전용 설치 커맨드를 복사해와 실행해 줍니다.

(참고) Amazon Lightsail의 Ubuntu에서 Systemd 를 이용한 서비스 자동 시작 설정
redis 를 설치하고 redis start 명령어를 입력하지 않아도, 이미 redis 가 실행중일 겁니다.
Lightsail 에서 Ubuntu 인스턴스를 생성할 때, 일부 서비스들은 이미 자동 실행 설정이 되도록 Systemd 에 입력되어 있기 때문입니다.
$ redis-cli
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> GET foo
"bar"
VM 에서 git clone 으로 소스 코드 받아오기
git clone 하기 이전에 VM 에서 ssh 키를 생성한 후 github 에서 해당 public key 를 등록해주어야 합니다.
(이 과정은 위에서 작성되었으니, 생략하도록 하겠습니다)
ssh 등록까지 완료되었다고 가정하고 git clone 해줍니다.
$ git clone git@github.com:debbs061/express.git
Cloning into 'express'...
환경변수 세팅해주고 백엔드 실행해보기
서버를 실행하기 이전에, .env 파일을 생성하고 PORT, REDIS_URL 등 필요 정보들을 작성한 후 저장합니다.
$ vim .env
빌드 및 실행을 하면, 4000 포트로 정상적으로 실행되는 걸 볼 수 있습니다.
$ npm i -D
$ npm run build
$ npm start
> express@1.0.0 start
> node build/index.js
App listening at port 4000
서버까지 띄었으니, 브라우저에서 접속 가능한 지 확인해보겠습니다.
콘솔 창에서 VM의 Public IP 를 확인하여 브라우저에 접속을 시도해보면, 접속이 되지 않을겁니다(!)
ex) http://54.180.135.107:4000

외부에서 VM 으로 접근하기 위해 Firewall 설정
외부망에서는 이 localhost 안에 있는 것들을 접속할 수 없습니다.
왜냐하면, 몇 가지 포트를 제외하고는 기본적으로 다 차단되어 있기 때문인데요.
콘솔창에서 [Networking] 탭으로 가보면 inbound 로 80, 22 포트만 열려있는 것을 볼 수 있습니다.
예를 들어, Redis 의 6379 포트는 외부에서 접근이 불가능한거죠.
(redis 에 id/pwd 가 걸려 있고 없고에 상관 없이 애초에 포트에서 막힙니다)

외부에서 VM 에서 띄운 웹서버로 접속되게 하려면 해당 포트 번호를 Firewall 에 추가하면 됩니다.

여기까지 하면, 브라우저에서 접속이 가능한 걸 확인할 수 있습니다.

(참고) ssh 세션을 종료하더라도 서버가 계속 동작하도록 하기
보통 리눅스 계열에서는 screen 을 많이 이용합니다.
SSH 세션을 종료하더라도 서버가 계속해서 동작하게 하기 위함입니다. (백그라운드 실행)
sudo apt-get install screen # Ubuntu/Debian 기반 시스템
screen
npm run start
여기까지 하면 aws 에 서버를 배포하여 브라우저에 접속하는 것까지 완료가 됐습니다.
여기서 마무리해도 괜찮지만, 실제 운영할 서비스이거나 혹은 나만의 도메인을 만드려는 상황이라면 로드밸런서 파트까지 따라오시길 추천합니다.
