AWS 배포 및 Domain 설정하기

김민지·2025년 2월 14일

EC2 배포 과정

  1. EC2 컨테이너 생성하기
    아래 화면의 Launch Instances 클릭 후, AMI는 Ubuntu로 설정하고 나머지는 기본설정을 유지해서 생성함
    (이 때, free-tier로 사용할 수 있는 EBS Storage는 30GB이므로 만약 더 낮게 설정되어있다면 수정하기)
  1. Elastic Public Ip allocate 하기
    아래 화면과 같이 Network & Security > Elastic IPs에 들어가서 할당받기

  2. SSH창으로 접근되는지 확인
    아래의 connect 버튼 클릭 후,


    SSH Client를 클릭한 후 Example 코드를 복사해서 VsCode 등 에디터의 터미널에 붙여넣어서 접근하기

  1. pm2 로 서버 시작하기
    PM2(Process Manager 2): Node.js 애플리케이션을 프로덕션 환경에서 안정적으로 실행하고 관리하는 프로세스 관리자로, 애플리케이션이 자동 재시작, 서버 부팅 시 자동 실행, 로드 밸런싱, 로그 관리 등의 기능을 제공함
# PM2 전역 설치
sudo npm install -g pm2  

# 서버 실행
pm2 start app.js --name my-app

# 서버 재부팅 시 자동 실행
pm2 startup 
pm2 save

# PM2 실행 상태 확인
pm2 list

# 애플리케이션 재시작
pm2 restart my-app

# 오류 등 로그 확인
pm2 logs
  1. 만약 서버가 시작되지 않았다면 app.js 등 서버 정의 코드를 확인해보고 localhost로 설정되어있다면 다음과 같이 수정!
app.listen(3000, '0.0.0.0', () => {
    console.log('Server is running on port 3000');
});
  1. 만약 환경변수가 처리되지 않았다면 ssh에서 .env 파일 생성
cd <내레포지토리명>
nano .env
  • nano 파일 편집 키
    저장: Ctrl + OEnter
    종료: Ctrl + X
  1. Elastic IP:<포트번호>로 접근해서 서버가 실행되는지 확인
pm2 restart all

도메인 및 HTTPS 설정

  • 도메인 설정의 필요성
    웹사이트나 API 서버에 접속할 때, 클라이언트가 IP 주소를 직접 입력하기보다는 고정된 도메인 주소를 사용하는 것이 편리하다. 또한, 특정 기능(예: Google OAuth 인증)에서는 Redirect URL에 IP 주소를 사용할 수 없기 때문에 도메인 설정이 필수적이다. 마지막으로, HTTPS 설정을 적용하기 위해서도 도메인 설정이 필요하다.
  1. 도메인 구매
    도메인 이름을 구매하면 해당 도메인의 소유권을 가지게 되며, 이후 특정 IP 주소에 도메인을 매핑할 수 있다. 나는 가비아에서 도메인을 구매했으며, 이는 AWS Route 53에서 네임서버를 설정하는 과정과 연결된다.

  2. Route 53Hosted Zone을 생성
    Route 53은 AWS에서 제공하는 DNS(Domain Name System) 관리 서비스로, 도메인 이름을 특정 IP 주소(Elastic IP)에 연결하는 역할을 한다.
    이를 위해서는 아래 사진과 같이 Create record 버튼을 클릭 후 EC2의 고정 IP(Elastic IP)를 A 레코드로 설정해줘야 한다.

    또한, 동일한 방식으로 CAA 레코드도 추가해야 한다.

    CAA(Certification Authority Authorization) 레코드는 특정 SSL 인증 기관(CA, Certificate Authority)에서만 SSL 인증서를 발급할 수 있도록 제한하는 역할을 한다.
    Let's Encrypt를 통해 무료 SSL 인증서를 발급받기 위해 0 issue "letsencrypt.org" 값을 설정함을 통해서 다른 인증 기관에서 임의로 인증서를 발급하는 것을 방지하고 보안을 강화할 수 있다.

Type: CAA
Hostname: (비워둠)
Value: 0 issue "letsencrypt.org"
  1. 그 후, 아래 가비아 페이지의 관리 버튼을 누르면 Name Server 정보를 수정할 수 있게 된다.
    이 때, 아래 사진의 회색 사각형으로 표시한 부분의 Route 53의 네임서버 정보 4개를 하나씩 복사해서 가비아 페이지에 붙여넣고 다시 저장해준다.

  2. 네임서버 설정 및 전파
    Route 53에서 할당된 네임서버(NS) 정보를 가비아에서 설정하면, 해당 도메인이 AWS Route 53의 DNS 관리 시스템을 사용하도록 변경된다.
    이는 DNS 설정을 수정하는 것이기에 전파되는 시간이 조금 걸릴 수도 있는데, whatsmydns 라는 사이트에 도메인을 입력하고 카테고리 중 NS를 선택해서 상태를 확인할 수 있다.

  1. HTTPS로 자동 리디렉션 설정

    HTTPS(SSL/TLS) 설정의 필요성
    HTTP는 기본적으로 Plain Text 통신이므로, 네트워크 상에서 데이터가 도용되거나 변조될 위험이 있는 반면, HTTPS는 SSL/TLS 인증서를 통해 데이터 암호화를 적용하여 보안을 강화한다.
    또한, 일부 브라우저 및 OAuth 같은 외부 서비스에서는 HTTPS가 아닌 HTTP를 차단하기 때문에 HTTPS 설정의 필요성을 느끼게 되었다.

  • nginx : Nginx는 Reverse Proxy 서버로 동작하며, 클라이언트 요청을 내부 애플리케이션(예: Express.js 서버)으로 전달해주는 중간 역할을 한다.

    Nginx 사용 시 이점
    (1) 클라이언트가 Express 서버를 직접 HTTPS로 호출하지 않고 Nginx가 중간에서 SSL/TLS를 적용하여 HTTPS 요청을 받아 처리하므로, Express 서버의 내부 구조가 직접 노출되지 않아 보안이 향상된다.
    (2) Let's Encrypt 같은 무료 인증서를 쉽게 적용할 수 있다.
    nginx의 필요성을 정리한 블로그 링크

sudo apt update
sudo apt install nginx -y
  • certbot: certbot은 Let's Encrypt에서 제공하는 자동화된 SSL 인증서 발급 도구로, 아래의 명령어를 실행하면 해당 도메인의 소유권을 확인한 후, Let's Encrypt에서 인증서를 발급한다.
    이렇게 발급된 인증서는 /etc/letsencrypt/live/sof.backendbase.site/ 경로에 저장된다.
sudo apt install certbot python3-certbot-nginx -y
  • SSL 인증서 발급
sudo certbot certonly --standalone -d sof.backendbase.site
  • nginx 설정
sudo nano /etc/nginx/sites-available/default
# HTTP 요청을 HTTPS로 리디렉션
# 사용자가 http://sof.backendbase.site로 접근하면,
# → 301 Moved Permanently 응답 코드를 반환하며 HTTPS로 자동 리디렉션된다.

server {
    listen 80;
    server_name sof.backendbase.site;
    return 301 https://$host$request_uri;
}

# HTTPS 요청 처리 및 SSL 적용
server {
    listen 443 ssl;
    server_name sof.backendbase.site;

    ssl_certificate /etc/letsencrypt/live/sof.backendbase.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sof.backendbase.site/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

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

(1) SSL 인증서 적용
ssl_certificatessl_certificate_keyLet's Encrypt에서 발급한 인증서를 사용하여 HTTPS 통신을 가능하게 한다.
ssl_protocols TLSv1.2 TLSv1.3; → 보안성이 높은 TLS 프로토콜을 사용하도록 설정.
ssl_ciphers HIGH:!aNULL:!MD5; → 보안성이 낮거나 취약한 암호화 알고리즘을 차단.
(2) Reverse Proxy 설정
클라이언트 요청이 Nginx로 오면, 내부의 localhost:3000(Express 서버)로 요청을 전달한다.
proxy_set_header는 클라이언트의 원래 요청 정보를 유지하기 위해 사용된다.

sudo nginx -t  # 설정 오류 체크
sudo systemctl start nginx # nginx 시작
sudo systemctl status nginx  # 상태 확인
  • pm2로 서버 재시작
pm2 restart all
  • 설정한 도메인으로 접속되는 것 확인 후 마무리

0개의 댓글