본문 바로가기
개인서버

AWS 배포 방법 정리

by 데이빗제이2 2024. 9. 26.

1. 백엔드 서버 설정 및 배포

1.1 백엔드 서버 설정

먼저 AWS EC2에 배포할 백엔드 서버를 구성합니다.

 

1. SSH를 통해 EC2 인스턴스에 접속:

ssh -i /path/to/your-key.pem ec2-user@123.123.123.123

 

/path/to/your-key.pem 부분은 PEM 키 파일의 경로로 바꿔주세요.

 

2.  필요한 패키지 설치:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.nvm/nvm.sh
nvm install node
nvm install 16
node -v
npm -v

sudo yum update -y
sudo yum install git -y

Node.js와 Git을 설치합니다.

 

3. GitHub에서 백엔드 프로젝트 클론:
git clone https://github.com/blahblah/blahblah-backend.git
프로젝트를 클론한 후 해당 디렉토리로 이동합니다.
cd blahblah-backend

 

4. 필요한 npm 패키지 설치:
sudo chown -R ec2-user:ec2-user /blahblah-backend

npm install
 
5. 백엔드 환경 변수 설정: .env 파일을 만들어 아래와 같이 환경 변수를 설정합니다.이 정보는 데이터베이스 연결 및 JWT 토큰 발급에 사용됩니다.
touch .env
nano .env

# 서버 설정
PORT=5000

# CORS 설정
FRONTEND_URL=https://www.blahblah.com  # 실제 프론트엔드 URL로 변경

# 이메일 설정
EMAIL_USER=blah.blah@gmail.com
EMAIL_PASS=blah
EMAIL_RECEIVER=blah@blah.com

# 데이터베이스 설정
DB_HOST=hostname
DB_USER=admin
DB_PASSWORD=blah
DB_NAME=blah

# JWT Secret Key
JWT_SECRET=yourGeneratedSecretKey



echo ".env" >> .gitignore
 
6. 백엔드 서버 실행:
node src/app.js
백엔드 서버가 정상적으로 실행되는지 확인합니다.

 

 

1.2 백엔드 서버를 항상 실행되도록 설정

일반적으로 PM2를 사용해 백엔드 서버를 관리합니다.

PM2 설치:

sudo npm install -g pm2​
 
PM2를 통해 백엔드 서버 실행:

 

pm2 start src/app.js --name blahblah-backend
이렇게 하면 백엔드 서버가 항상 실행되며, EC2가 재부팅되어도 계속 실행됩니다.
 

PM2를 시스템 시작 시 자동 실행하도록 설정:

pm2 startup
pm2 status
위 명령어를 실행했을 때 출력된 내용을 다음과 같이 실행하여 시스템 시작 시 PM2를 자동으로 실행하도록 설정:
sudo env PATH=$PATH:/home/ec2-user/.nvm/versions/node/v16.20.2/bin /home/ec2-user/.nvm/versions/node/v16.20.2/lib/node_modules/pm2/bin/pm2 startup systemd -u ec2-user --hp /home/ec2-user
이 과정에서 다음 파일이 생성되고 설정되었음.
/etc/systemd/system/pm2-ec2-user.service

pm2 save
상태 저장

pm2 status
다시 확인

위 명령어를 실행했을 때 출력된 내용을 다음과 같이 실행하여 시스템 시작 시 PM2를 자동으로 실행하도록 설정:

  

2. Nginx로 프록시 설정 

 

AWS EC2 인스턴스에 Nginx를 설치하고 도메인을 설정하여 트래픽을 프록시로 전달합니다.

2.1 Nginx 설치 및 설정

 

Nginx 설치:

sudo yum install nginx -y​
Nginx 설정 파일 편집:
sudo vi /etc/nginx/nginx.conf
기본 설정 파일을 아래와 같이 수정합니다.
server {
    listen 80;
    server_name www.blahblah.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
이 설정은 www. blahblah .com 도메인으로 들어오는 요청을 백엔드 서버(localhost:5000)로 전달합니다.
Nginx 시작 및 재시작:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl restart nginx

 

3. 도메인 연결

AWS S3와 Route 53을 사용하여 도메인 연결을 하는 자세한 단계

3.1 도메인 구매

  • 가비아와 같은 도메인 업체에서 blahblah.com이라는 도메인을 구매합니다.

3.2 S3 버킷 생성 및 정적 웹 호스팅 설정

  1. S3 버킷 생성:
    • AWS S3 콘솔에서 도메인 이름과 정확히 일치하는 버킷을 생성합니다: blahblah.com.
    • 주의: 버킷 이름은 반드시 도메인 이름과 정확하게 일치해야 합니다.
  2. 정적 웹 호스팅 설정:
    • 생성한 버킷의 속성(Properties) 탭에서 정적 웹 사이트 호스팅(Static website hosting)을 활성화합니다.
    • 인덱스 문서(Index document)에 index.html을 입력합니다.
    • 이때 제공되는 정적 웹 호스팅 엔드포인트 주소를 기억해 둡니다.

3.3 Route 53에서 호스팅 영역 생성 및 NS 레코드 설정

  1. Route 53에서 호스팅 영역 생성:
    • Route 53 콘솔에서 호스팅 영역(Hosted zones)으로 이동하여 blahblah.com에 대한 호스팅 영역을 생성합니다.
  2. 네임서버(NS) 값 설정:
    • 호스팅 영역 생성 후 나타나는 NS(네임서버) 값을 복사합니다.
    • 가비아와 같은 도메인 업체의 네임서버 설정 페이지로 이동하여 해당 NS 레코드 값을 붙여넣습니다.

3.4 Route 53에서 레코드 설정

  1. Alias 레코드 연결:
    • Route 53에서 호스팅 영역의 레코드 섹션으로 이동하여 A 레코드(Alias)를 생성합니다.
    • 도메인 이름에는 blahblah.com을 입력하고, Alias 대상으로 생성한 S3 버킷의 정적 웹 호스팅 엔드포인트를 선택합니다.
  2. CNAME 레코드 연결:
    • CNAME 레코드를 생성하여 www.blahblah.com을 blahblah.com으로 연결합니다.
    • 이 설정으로 www 버전과 non-www 버전 모두를 도메인에 연결할 수 있습니다.

3.5 최종 레코드 확인

  • 이 과정을 완료하면 Route 53에는 총 4개의 레코드가 존재해야 합니다:
    • A 레코드(Alias): blahblah.com → S3 정적 웹 호스팅 엔드포인트
    • NS 레코드: 가비아에 입력한 네임서버 값
    • SOA 레코드: 기본적으로 Route 53에서 생성하는 레코드

1. AWS Certificate Manager(ACM)에서 SSL 인증서 발급

  1. ACM 콘솔 접속
    • AWS Management Console에 로그인하고 "Certificate Manager" 서비스로 이동합니다.
    • Cloudfront를 사용할 것이기 때문에 리전을 반드시 ㅁ
  2. 인증서 요청
    • "Request a certificate"(인증서요청) 버튼을 클릭합니다.
    • "Request a public certificate"(퍼블릭인증서요청) 선택 후 "Next" 클릭
  3. 도메인 이름 입력
    • 도메인 이름에 blahblah.com과 www. blahblah .com을 모두 추가합니다.
    • 이렇게 하면 두 도메인 모두에 대해 HTTPS를 적용할 수 있습니다.
  4. 인증 방법 선택
    • "DNS validation"을 선택하고 "Next"를 클릭합니다.
      • DNS 검증은 Route 53을 통해 자동으로 검증할 수 있습니다.
  5. 검토 및 요청 제출
    • 입력 내용을 확인하고 "Request" 버튼을 클릭합니다.
  6. DNS 검증 완료
    • ACM에서 제공하는 CNAME 레코드 정보를 Route 53에 추가합니다.
      • 상단의 추가작업 필요에서 next를 눌러 전부 ROUTE53에 있는 도메인의 레코드로 등록합니다(www.blahblah.com,blahblah.com 두개)
    • ACM에서 검증이 완료되면 SSL 인증서가 활성화됩니다.

2. CloudFront 배포 생성

    1. CloudFront 콘솔 접속
      • AWS Management Console에서 "CloudFront" 서비스로 이동합니다.
    2. 배포 생성
      • "Create Distribution"을 클릭하고 "Web"을 선택합니다.
    3. CloudFront 설정
      • Origin Domain Name: S3 버킷의 엔드포인트 URL을 입력합니다. (blahblah.com.s3-website.ap-northeast-2.amazonaws.com)
      • Alternative domain name (CNAMEs) - optional : blahblah.com, www .blahblah.com  등록
      • Origin path: 비워둡니다. (필요한 경우, 특정 경로에 대해 CloudFront를 통해 콘텐츠를 제공하고 싶다면 입력하지만 일반적으로 비워둡니다.)
      • 사용자 정의 헤더 추가 (Optional) :일반적으로 이 부분은 특별한 경우가 아니면 비워둡니다. 필요한 경우에만 사용자 정의 헤더를 추가합니다.
      • Enable Origin Shield : Origin Shield는 선택 사항입니다. 이 기능을 활성화하면 CloudFront의 캐싱 효율이 향상되어 원본 서버의 부하를 줄일 수 있습니다. 사용하지 않을 경우 "아니요"로 두시면 됩니다.
      • Enable기본캐시동작 : 전부 기본값으로 설정
      • 웹 애플리케이션 방화벽(WAF)  : XSS, SQL 인젝션과 같은 흔한 공격으로부터 웹사이트를 보호하고, IP 차단 및 필터링 규칙을 적용할 수 있습니다.  월 기본요금 $8 + 100만건당 0.6$씩 추가됨
    •  
  • Viewer Protocol Policy
    • "Redirect HTTP to HTTPS" 선택 (HTTP로 접속하는 사용자를 HTTPS로 리디렉션)
  • 가격 분류 (Price Class) :
    • 북미 및 유럽: 데이터 전송량당 약 $0.085~$0.12/GB
      아시아 및 오세아니아: 데이터 전송량당 약 $0.14~$0.20/GB
      남아메리카: 데이터 전송량당 약 $0.25~$0.30/GB
  • Custom SSL Certificate 설정
    • "Alternate Domain Names (CNAMEs)"에 blahblah .com과 www.blahblah.com을 추가합니다.
    • "SSL Certificate"에서 이전에 발급받은 ACM 인증서를 선택합니다. > 권장설정을 따릅니다.
  • 기타 설정 확인 후 배포 생성
    • 표준 로깅은 
    • 모든 설정을 검토한 후 "Create Distribution"을 클릭합니다.
    • CloudFront 배포가 생성되고 배포 완료까지 시간이 다소 걸릴 수 있습니다.
  • Cloud Front 도메인 ROUTE53의 blahblah.com CNAME 레코드 추가 확인
    : www.blahblah.com → asdfasdg.cloudfront.net