본문 바로가기
웹 개발

AWS EC2 설정 - nodejs 기반 backend

by siina 2024. 9. 13.

AWS EC2는 가상 서버를 제공하는 서비스로, 애플리케이션을 실행하고 서버 운영이 필요한 경우에 사용할 수 있다.

이후에 프로젝트를 배포하는 과정에서 다른 서버를 이용할수도 있겠지만 이번엔 사용자도 많고 레퍼런스도 많은 EC2 를 이용해서 간단한 앱을 배포하는 과정을 정리해두려한다.

 

AWS EC2 배포과정

1. EC2 링크 선택

아마존 홈페이지에 접속하여 상단의 검색바에 EC2 를 검색하여 EC2 페이지로 접근한다.

최종 링크 : https://us-east-1.console.aws.amazon.com/ec2/home?region=us-east-1#Instances:

 

2. 인스턴스 시작 버튼 클릭

EC2 대시보드 화면

페이지에 접근하게 되면 다음과 같은 화면을 마주할 수 있는데 빨간색 사각형 영역안의 인스턴스 시작 버튼을 눌러 인스턴스를 생성 할 수 있다.

이후 해당 페이지에서 필요한 내용들을 작성하면 된다. ( 아래서 계속 )

 

3. 인스턴스 이름 작성

이름은 인스턴스를 구분하는 명칭으로 인스턴스가 늘어났을 때 구분을 위해 어떤 역할을 하는 인스턴스인지 명확하게 적어주는게 좋다.

 

4. OS 이미지 선택

실행할 OS 이미지를 선택하면 되는데 나의 경우 무난한 Ubuntu 이미지로 진행하기로 했다. 필요한 서버 유형이나 버전이 있는 경우 해당 이미지를 골라서 작성하면 된다.

 

5. 인스턴스 유형

인스턴스 유형은 상황에 따라 정말 다양한 옵션이 있고 비용도 천차만별이다.

이후 명확한 목적이 생긴다면 해당 인스턴스 유형을 맞춰 작성하면 좋을듯하다. 이번에는 간단한 서비스 배포가 목적이니 범용적인 t 시리즈 인스턴스를 선택했다. 

 

6. 키패어 생성

키페어는 비대칭 암호화 방식(공개 키와 개인 키)을 사용하여 인스턴스에 대한 SSH 또는 RDP 액세스를 제공한다. 이후 인스턴스에 접근할 때 사용한다.

마찬가지로  이름은 구분하기 쉽게 작성하고 키페어 유형은 RSA, 키 파일 형식은 pem 으로 선택한 뒤 키 페어 생성 버튼을 누르면 높은 확률로 Downloads 폴더에 키페어가 생성된다.

 

7. 네트워크 설정

보안 그룹은 기존 작성해둔 보안 그룹이 없는 경우 보안 그룹 생성을 선택하면 된다. (보안 그룹 개수에 따라 비용이 달라지는지는 잘 모르겠다.)

이번 인스턴스는 백엔드로 사용하기 위해 생성하는 인스턴스로 엔드포인트 설정이 필요하기 때문에 HTTPS와 HRRP 트래픽 허용을 체크했다. 

 

8. 인스턴스 시작

설정이 끝났으면 인스턴스 시작 버튼을 통해 인스턴스를 생성한다.

인스턴스가 성공적으로 생성되면 다음과 같은 화면을 마주할 수 있다.

예산관리나 과도한 비용등으로 인해 걱정이 된다면 왼쪽의 알림 생성을 통해 예산대비 특정 사용량 이상 등 조건을 걸어 알림을 받을 수 있다.

인스턴스에 연결을 선택하면 연결(접속)을 위한 화면으로 이동할 수 있고 RDS 데이터베이스 연결은 동일한 지역내에 생성한 RDS 를 연결해주는 것 같은데 잘 모르겠다..

모든 인스턴스 보기 버튼을 눌러 대시보드로 나오면 다음과 같은 화면을 볼 수 있고 관리 역시 가능하다.

 

9. 보안그룹 설정 확인

 인스턴스 보안그룹 페이지에 들어오게 되면 다음과 같은 화면을 보게되는데 이 부분 설정이 조금 중요하다.

인바운드 규칙은 외부에서 인스턴스에 접근할 때 어디까지 허용해주고 어떤 접근을 차단할지를 설정하는 것이다.

endpoint 사용을 위해 HTTP와 HTTPS 요청을 허용해주고 소스는 0.0.0.0/0 으로 설정하여 모든 IPv4 에서의 요청이 가능하도록 설정하였다.

이 부분에 대해선 좀 더 공부하여 추가할 수 있으면 따로 작성할 예정이다.

 

10. 인스턴스 연결 ( SSH 클라이언트 )

다시 인스턴스 페이지로 돌아가서 연결하고자 하는 인스턴스를 체크하고 인스턴스 연결 버튼을 누르면 나오는 창에서 SSH 클라이언트 탭을 선택하고 하단의 ssh -i 로 시작하는 명령어를 미리 복사해둔다.

 

인스턴스 연결을 위해 cmd 창을 열고 연결을 위한 키인 key_name.pem 파일이 있는 Downloads 폴더로 이동한 뒤 다음과 같이 아까 복사해둔 명령어를 붙여넣고 실행한다.

 

10. 인스턴스 연결 ( EC2 인스턴스 연결 )

해당 방법을 통해서도 바로 연결을 진행할 수 있다. 다음과 같이 설정하고 연결 버튼을 누르면 새로운 웹 브라우저 창이 열리며 명령어 입력이 가능한 콘솔창이 뜬다. 속도는 상대적으로 느리다고 하는데 나의 경우 큰 차이를 느끼진 못했어서 본인이 편한걸 쓰면 될 듯하다.

 

11. github에 deploy용 프로젝트 업로드

GitHub Actions를 이용하여 CI/CD ( 개발의 work flow )를 자동화하고자 한다. 이번 프로젝트의 경우 frontend 와 backend 를 따로 관리하길 원했고 이를 위해 GitHub repo를 front 와 back 으로 분리할 필요가 있었다.

이번 스탭의 경우 backend deploy를 위해 backend deploy 용 repo 를 새로 생성하고 프로젝트 파일들을 업로드 하였다.

 

12. GitHub Actions - Runners 세팅

깃허브 레포에서 settings -> actions -> runner 선택하면 위와 같은 페이지로 이동한다.

우측 위의 초록색 ( New self-hosted runner ) 버튼을 클릭해 새로운 Runner 를 등록해주자.

 

그러면 다음과 같은 페이지로 이동하는데, 위에서 aws ec2 인스턴스로 linux 기반을 선택했기에 Linux 를 체크해주면 된다.

만약 mac이나 windows 기반으로 서버를 선택한 경우 각각 알맞는 이미지를 선택하면 된다.

 

 

이후 아래 있는 명령어를 쭉 실행해주면 되는데,

./run.sh 이전 까지만 실행해주면 된다.

 

Download 까지 실행 한 모습 : Actions runner 실행에 필요한 파일을 다운받고 압축을 풀어둔 모습.

 

configure 스탭을 실행하게 되면 다음과 같은 화면을 볼 수 있는데 self-hosted 를 사용할것이기에 크게 신경쓸 부분은 없다. 전부 Enter 를 눌러주자.

 

config 세팅이 끝나면 다음과 같이 svc.sh 파일이 생긴 것을 확인할 수 있다.

 

아직까진 이를 실행하지 않아서 깃헙페이지에서 Runners 화면을 확인했을 때 offline 인것을 확인할 수 있다. 이를 실행중으로 변경하기 위해 aws 콘솔창에 다음 명령어를 입력하자.

sudo ./svc.sh install
sudo ./svc.sh start

 

위 명령어를 실행하고 정상적으로 실행되면 각각 위와 같은 출력을 얻을 수 있다. 이 부분에서 에러가 나면 인스턴스를 재시작 후 다시 시도해보거나 검색을 통해 해결해야한다.

이후 Runners 페이지를 확인해보면 정상적으로 실행되고 있는것을 확인할 수 있다. 

 

이제 내 GitHub repo 와 아마존 인스턴스가 연결?되어 GitActions 를 사용할 준비가되었다.

 

13. 비밀키 설정

노출되면 곤란한 비밀키 관리를 위해 GitHub ropo 내에 이를 등록해줄 필요가 있다.

설정 탭에서 github secrets and variables 탭으로 이동하면 아래와 같은 화면이 나오는데 초록색 ( New repository secret ) 버튼을 클릭하자.

 

버튼을 클릭하면 위와 같은 화면이 나오는데 .env 파일로 관리하던 키 값을 잘 집어넣자.

이후 actions 기능을 통해 해당 내용을 기반으로 서버(aws 인스턴스)에 .env 파일을 생성할것이다. 

Add secret 버튼을 눌러 저장해주자.

 

저장 완료된 모습

 

14. GitHub Actions - Workflow 등록

 

깃헙 레포 상단 메뉴바에서 actions 탭을 선택하면 다음과 같은 화면이 나온다. 아래 카드태그에서 원하는 workflow 유형을 선택 할 수 있는데 나의 경우 nodejs 기반 backend 구축을 원하기에 node.js 를 선택해야한다.

 

스크롤을 내리다보면 Node.js 카드를 확인할 수 있는데 Configure 를 눌러 세팅을 시작한다.

 

그러면 다음과 같은 화면이 나오는데 이곳에 GitActions 가 실행되면 순차적으로 실행하고 싶은 내용들을 작성하면 된다. 아래 코드를 복사해서 붙여넣자.

 

name: Node.js CI/CD

on:
  push:
    branches: [ "main" ]

jobs:
  build:

    runs-on: self-hosted

    strategy:
      matrix:
        node-version: [18.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm ci
    - run: |
        touch .env
        echo "${{ secrets.PROD_ENV_FILE }}" > .env

 

간단하게 설명하면 on 은 어떤 동작에서 실행할지를 의미한다. 위의 경우 main branches 로 push 가 이뤄지면 아래의 jobs 부분을 실행하게 된다. 하단의 steps 의 경우 연결된 github repo 에 접근하여 필요한 파일 및 설정들을 받아 온 뒤 적어둔 명령어들을 실행해준다.

 

Commit changes 버튼을 눌러 실행해주자.

 

그러면 위와같이 새로운 폴더가 생성되고 yml 파일이 생성된다.

 

다시 아마존 콘솔 창으로 돌아와서 다음과 같은 과정을 통해 확인해보면 위와 같이 git repo에 관리중인 파일들이 생성된것을 확인할 수 있고 환경변수 역시 가져온것을 확인할 수 있다.

 

15. 필요한 모듈 설치

sudo apt update
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
apt 업데이트 및 필요한 모듈 설치

node -v
node 버전 확인
npm -v
npm 버전 확인

sudo apt-get install -y nginx
sudo npm i -g pm2 
터미널 종료 이후에도 서버가 꺼지지 않도록 설정

cd /etc/nginx/sites-available
ls 
default 파일 생성을 확인

 

아마존 콘솔에 위 명령어를 입력하자.

 

이후 아마존 인스턴스 페이지에서 퍼블릭 ip 주소 확인 후 포트번호를 붙여 접속해보면 웹 페이지가 하나 불러와진다.

형식 - 아이피주소:포트번호 로 확인 (디폴트 80)
예시 - 19.202.95.82:80

( 접속하면 위와 같이 welcome to nginx 라는 텍스트가 출력 됨 )

 

아래 명령어를 통해 default 파일을 수정하자.

sudo vi default

방향키를 통해 스크롤을 내리다보면 다음과 같은 location 영역이 나오는데 이 부분을 아래와 같이 수정하자.

location / {
	proxy_pass http://localhost:8080;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

 

그리고 아래 명령을 통해 nginx 를 재시작한다.

sudo systemctl restart nginx

 

실행 상태 확인을 위해 디렉토리를 변경한다.

cd ~/actions-runner/_work/{git-repo-name}/{git-repo-name}
pm2 start index.js --name=BackendAPI
실행 후 결과 확인

 

위 예시는 오타가 있어 BackendAP 로 나오는데 아무튼 --name 에 지정해준 이름으로 index.js 파일을 실행하게 된다.

 

마찬가지로 아마존 인스턴스 페이지로 이동하여 퍼블릭 아이피 주소/백엔드 엔드포인트 경로 로 테스트 해보면 정상출력 되는것을 확인할 수 있다.

 

마지막으로 깃 허브 레포에 코드를 푸쉬하면 정상적으로 CI/CD 가 이루어지는지 확인하는 과정이다.

깃 허브 레포 에서 ..github/workflows/node.js.yml 파일로 이동 후 편집 버튼 클릭

편집 버튼은 오른쪽 연필 모양

위와 같이 들여쓰기를 맞춰 run: pm2 restart BackendAPI 명령어 추가

run: pm2 restart BackendAPI

 

 

마지막으로 local 의 vscode 에서 pull 깃 허브 레포 내용을 업데이트 한뒤 변경사항을 push 했을 때 아마존 인스턴스 까지 자동 업데이트 되는지 확인하면 된다.

 

 

아래는 좋은 레퍼런스 :

https://zzsza.github.io/development/2020/06/06/github-action/