EC2 서버로 배포한 서비스가 갑자기 연결이 안된다. 배포 주소로 들어가면 연결을 거부했다는 메세지만 계속 출력되는 것이다. 며칠 전만 해도 잘 작동하는 걸 직접 확인했는데 너무 당황스러웠다. 일단 인스턴스에 문제가 생겼는지 확인하기 위해서 다음의 사항들을 확인해보았다:
확인 결과 인스턴스는 문제 없이 구동 중이었다. 오류의 이유도 모른 채 ‘EC2 연결 오류’로 구글링만 하염 없이 해도 대부분은 인스턴스 문제에 관한 팁이어서 별 도움이 되지 않았다. 그러다 번뜩 떠오른 것이 AWS 웹사이트에서 확인 가능한 인스턴스 콘솔 스크린샷이었다. 인스턴스 콘솔 스크린샷을 보니 그제야 오류의 원인을 파악할 수 있었다:
메모리가 부족해서 서비스를 강제로 종료한 것이었다. AWS 공식 홈페이지에 따르면 out of memory 발생 시 Linux Out Of Memory(OOM) 매니저가 호출되고, 이 매니저가 프로세스들을 강제 종료시킨다고 한다. 나는 다행히 해당 인스턴스에서 swiftER 서비스만 구동 중이었기에 서비스가 강제 종료되는 선에서 끝났지만 여러 서비스를 배포/구동 중이었다면 연쇄적으로 피해가 발생할 수도 있는 상황이었다. EC2 인스턴스는 기본적으로 스왑 공간을 할당받지 않아서 직접 스왑 파일을 생성해야 한다. 공식 홈페이지에서 설명하는 스왑 파일 생성 방법은 다음과 같다:
1. dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성합니다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=32
2. 스왑 파일의 읽기 및 쓰기 권한을 업데이트합니다.
$ sudo chmod 600 /swapfile
3. Linux 스왑 영역을 설정합니다.
$ sudo mkswap /swapfile
4. 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 합니다.
$ sudo swapon /swapfile
5. 프로시저가 성공적인지 확인합니다.
$ sudo swapon -s
6. /etc/fstab 파일을 편집하여 부팅 시 스왑 파일을 시작합니다. 먼저, 편집기에서 파일을 엽니다.
$ sudo vi /etc/fstab
파일 끝에 다음 줄을 새로 추가하고 파일을 저장한 다음 종료합니다.
위의 방식대로 하니 서비스가 다시 정상적으로 구동하기 시작했다.
1) https://repost.aws/knowledge-center/ec2-linux-prevent-over-utilization
이런 유용한 정보를 나눠주셔서 감사합니다.