Reco Everything you wanna value. 자세히보기

[IT|Programming]

AWS Ubuntu 에서 서버가 갑자기 죽었을때 자동으로 재부팅 시켜주는 방법 + 부팅 시 자동으로 서버 돌아가게 만드는 방법

kipid 2025. 8. 5. 17:41
반응형
# AWS Ubuntu 에서 서버가 갑자기 죽었을때 자동으로 재부팅 시켜주는 방법 + 부팅 시 자동으로 서버 돌아가게 만드는 방법 AWS Ubuntu 인스턴스에서 서버가 갑자기 죽었을 때 자동으로 재부팅시켜주는 방법과 부팅 시 자동으로 서비스를 실행하는 방법을 설명해 드리겠습니다. AWS 환경에서는 물리 서버와 달리 몇 가지 차이점이 있으므로, 이를 고려한 접근이 필요합니다. ## PH
  • 2025-08-03 : First posting.
## TOC ## AWS Ubuntu에서 서버가 갑자기 죽었을 때 자동으로 재부팅 시켜주는 방법 AWS EC2 인스턴스가 "갑자기 죽는" 상황은 크게 두 가지로 나눌 수 있습니다. OS 내부의 문제로 인한 정지 (커널 패닉, OS Hang 등): 이 경우 EC2 인스턴스 자체는 running 상태로 보이지만, 내부에 접속할 수 없고 응답이 없습니다. 이 문제는 AWS EC2의 상태 확인(Status Checks) 기능을 사용하여 해결할 수 있습니다. EC2 인스턴스 자체의 문제로 인한 종료 (하드웨어 장애, 인스턴스 손상 등): 이 경우 EC2 인스턴스의 상태가 running에서 stopped 또는 terminated로 바뀝니다. ### AWS EC2 상태 확인(Status Checks) 활용 AWS EC2에는 두 가지 상태 확인 기능이 있습니다. 시스템 상태 확인 (System Status Checks): AWS 인프라 자체의 문제(하드웨어, 네트워크 등)를 확인합니다. 인스턴스 상태 확인 (Instance Status Checks): 인스턴스 내부의 문제(OS, 파일 시스템, 네트워크 설정 등)를 확인합니다. 이 중 인스턴스 상태 확인을 사용하여 OS가 멈췄을 때 자동으로 재부팅하도록 설정할 수 있습니다. ### 설정 방법: EC2 콘솔 접속: AWS EC2 콘솔에 로그인합니다. 인스턴스 선택: 상태 확인을 설정할 Ubuntu 인스턴스를 선택합니다. 작업(Actions) -> 모니터링 및 문제 해결(Monitor and troubleshoot) -> 문제 해결 및 재시작(Troubleshoot and restart) 메뉴로 이동합니다. 자동 복구(Automatic recovery) 설정: 인스턴스 자동 복구(Auto-recovery) 옵션에서 Recover를 선택합니다. 이렇게 설정하면 인스턴스 상태 확인이 실패했을 경우, AWS가 자동으로 인스턴스를 중지(stop)하고 복구(recover)하여 재시작합니다. 이 과정에서 IP 주소, 볼륨 등은 그대로 유지됩니다. ### AWS CloudWatch 알람 활용 보다 정교한 제어를 원한다면 AWS CloudWatch 알람을 사용할 수 있습니다. CloudWatch는 EC2 인스턴스의 상태를 모니터링하고, 특정 지표에 따라 다양한 작업을 수행하도록 설정할 수 있습니다. ### 설정 방법: CloudWatch 콘솔 접속: AWS CloudWatch 콘솔에 로그인합니다. **알람(Alarms) -> 알람 생성(Create alarm)**을 클릭합니다. 지표 선택(Select metric): EC2 -> Per-Instance Metrics에서 StatusCheckFailed_Instance 지표를 선택합니다. ### 조건 설정: 임계값 유형(Threshold type): 정적(Static) 임계값(Threshold): 1 (1분 동안 상태 확인이 실패하면 알람 발생) 기간(Period): 1 Minute 통계(Statistic): Maximum 작업(Actions) 설정: 알람 상태(Alarm state): In alarm 상태일 때 작업 유형(Action type): EC2 Action EC2 작업(EC2 action): 재부팅(Reboot) 알람 이름 지정 및 생성: 알람 이름을 지정하고 알람을 생성합니다. 이렇게 하면 인스턴스 상태 확인이 실패했을 때, CloudWatch가 자동으로 EC2 인스턴스를 재부팅합니다. ## 부팅 시 자동으로 서버 돌아가게 만드는 방법 (systemd 활용) EC2 인스턴스가 재부팅된 후, 웹 서버, 데이터베이스, 또는 사용자 정의 애플리케이션이 자동으로 실행되도록 설정하는 것은 물리 서버와 동일하게 systemd를 사용하는 것이 가장 일반적이고 권장되는 방법입니다. ### systemd 서비스 파일 생성 예시로 Node.js 애플리케이션을 자동으로 실행하는 방법을 설명하겠습니다. 서비스 파일 생성: systemd 서비스 파일을 /etc/systemd/system/ 디렉토리에 .service 확장자를 가진 파일로 생성합니다. ```[.lang-sh] sudo nano /etc/systemd/system/livingnet.service ```/ ### start.sh 파일 작성: ```[.lang-sh] sudo touch /home/ubuntu/livingnet/start.sh sudo vi /home/ubuntu/livingnet/start.sh ```/ start.sh 파일 내용 ```[.lang-sh] #!/bin/bash # PATH에 Node.js 바이너리 경로를 추가합니다. export PATH=/home/ubuntu/.nvm/versions/node/v22.18.0/bin:/usr/bin:$PATH cd /home/ubuntu/livingnet # 포트 3000을 사용하는 프로세스가 없을 때까지 반복 while true; do # 포트 3000을 사용하는 프로세스의 PID 찾기 # ss 명령어는 PID/프로그램 이름을 다른 포맷으로 출력하므로 awk 부분 변경 PID=$(sudo ss -tulnp | grep ":3000" | awk '{print $NF}' | cut -d',' -f2 | cut -d'=' -f2) if [ -n "$PID" ]; then echo "Killing process on port 3000 (PID: $PID)..." sudo kill -9 "$PID" sleep 1 # 종료 후 잠시 대기 else echo "No process found on port 3000." break # 프로세스가 없으면 반복문 종료 fi done # 먼저 'build' 스크립트를 실행합니다. npm run build # 'build'가 성공적으로 완료되면 'start' 스크립트를 실행합니다. # 'start' 스크립트가 실행되면 이 스크립트는 종료되지 않고 계속 유지됩니다. npm run start ```/ nvm (node version manager) 를 쓸 경우, Environment path 가 제대로 잡히지 않는 경우가 많기 때문에 npm 의 절대 경로를 써줘야 함. 내부적으로 node 도 실행하기 때문에 node 도 절대경로로 써줘야 하는데 어찌 할 방법이 없으니 다음과 같이 PATH 를 export 해줘야 함. export PATH=/home/ubuntu/.nvm/versions/node/v22.18.0/bin:/usr/bin:$PATH ### 파일 내용 작성: ```[.lang-sh] sudo nano /etc/systemd/system/livingnet.service ```/ ```[.lang-sh] [Unit] Description=My Node.js Application on AWS After=network.target mysql.service nginx.service [Service] ExecStart=/home/ubuntu/livingnet/start.sh StandardOutput=append:/var/log/livingnet_stdout.log StandardError=append:/var/log/livingnet_stderr.log WorkingDirectory=/home/ubuntu/livingnet Restart=always User=ubuntu Group=ubuntu Environment=NODE_ENV=production [Install] WantedBy=multi-user.target ```/ ```[.lang-html] [Unit] After=network.target mysql.service nginx.service: 네트워크, mysql, nginx 가 활성화된 후에 이 서비스를 시작합니다. AWS EC2 환경에서는 네트워크 인터페이스가 초기화된 후 애플리케이션이 시작되어야 하므로 중요한 설정입니다. [Service] ExecStart: 실행할 명령어의 전체 경로를 지정합니다. Restart=always: 서비스가 어떤 이유로든 종료되면 systemd가 자동으로 재시작합니다. User=ubuntu: AWS Ubuntu 인스턴스의 기본 사용자인 ubuntu로 서비스를 실행하도록 설정합니다. [Install] WantedBy=multi-user.target: 시스템이 멀티유저 모드로 부팅될 때 이 서비스를 시작하도록 설정합니다. ```/ 데몬 리로드: 새로 생성한 서비스 파일을 systemd에 반영합니다. 서비스 활성화 및 시작: 부팅 시 자동 시작되도록 설정하고, 현재 서비스를 시작합니다. ```[.lang-sh] sudo systemctl daemon-reload sudo systemctl enable livingnet.service sudo systemctl restart livingnet.service sudo systemctl status livingnet.service ```/ 명령어로 서비스의 상태를 확인할 수 있습니다.
반응형