AWS EC2 시스템 장애과 복구

2월 2일 어제는 나에게 무척이나 힘든 날이었다.

이미지 출처:http://matrix.wikia.com/wiki/Reload
출처:http://matrix.wikia.com/wiki/Reload

회사 PC

회사의 PC가 망가져서 PC 교체와 함께 OS 및 소프트웨어 설치등을 해야 했다. 작업용으로 사용하던 SSD는 괜찮았는데 백업용으로 사용하던 HDD가 인식되지 않는 문제가 발생했다. 2010년부터 백업했던 것들이 들어 있어서 꽤나 큰 충격을 받았다.

AWS EC2

그리고 New Relic으로 부터 AWS에서 사용중인 EC2서버 메모리 사용량이 90%가 초과했다는 알림 메일을 새벽에 받았었는데, 그 이후 알림이 해제되었다는 메일도 왔었다. 퇴근길에 혹시나 해서 AWS 콘솔로 확인해보니 EC2 서버는 문제가 없어 보였지만, AWS 콘솔에는 메모리와 관련된 모니터링이 없는 것이 마음에 걸렸다.

집에 돌아와 EC2 서버에 접속해보려고 했더니 반응이 없다. 국내가 아닌 일본에 있다보니 ISP 업체에서 연결을 제대로 못해주나 싶었으나 그것도 아니었다.

인스턴스 재부팅을 시도했는데 반응이 없어 인스턴스를 중지시키고 콘솔 로그를 확인했는데 아래와 같이 문제가 있었다.

[1982949.054580] Out of memory: Kill process 14993 (foo) score 47 or sacrifice child
[1982949.057875] Killed process 14993 (foo) total-vm:327252kB, anon-rss:47792kB, file-rss:124kB
[2051399.726500] end_request: I/O error, dev xvda, sector 12893328
[2051399.729576] end_request: I/O error, dev xvda, sector 12893392
...
[2051399.766446] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000007

인스턴스를 다시 시작했으나 상태는 초기화중이고 한참 후에야 상태 확인(Status Check)이 1개 실패한 것으로 나타났다. EC2의 상태 확인은 시스템 상태 확인과 인스턴스 상태 확인으로 구성되어 있다. 이 중에 인스턴스 상태 확인이 실패되었다. 관련 도움말을 보니 여러가지 항목에서 오류가 발생할 수 있는데 나의 경우는 메모리와 블럭 디바이스 오류가 의심되었다. 물론 New Relic의 알림을 보면 주 원인은 메모리일 것이다.

메모리 오류

메모리를 많이 사용하는 경우 AWS에서 제시하는 방법은 메모리가 좀 더 있는 인스턴스로 바꾸는 것인데 Free Tier를 사용하는 나에게 해결책은 되지 못했다.

블럭 디바이스 오류

설명서에 따라 볼륨을 떼고 스냅샷을 만들고 다시 붙여보았지만 역시 문제해결이 되지 않았다. 별도의 EC2 인스턴스를 만들고 해당 볼륨을 붙였지만 부팅이 안되었다.

복원

일단 해결 방법이 쉽지 않다고 판단하여 새로운 볼륨에 서버 설정들을 다시 하고 복원을 하였다.

그나마 복원이 쉬웠던 것은 AWS 사용할 때 백업해 놓았던 것이 있었고 DB의 경우 RDS로 분리했기때문이다. 만약 RDS로 분리하지 않았다면 데이터는 손실이 발생했을 것이다.

참고

Elastic IP Address

Amazon EC2에서 실행중인 인스턴스를 중지했다가 다시 시작을 했을 때, 그동안 사용했던 공인 IP 주소가 변경되는 것을 확인했다.
만약 웹서비스와 같이 지속적으로 사용해야하는 경우라면 Elastic IP 주소 (EIP)를 사용해야 한다.

인스턴스에 연결하는 Elastic IP 주소 (EIP) 한 개는 무료로 사용할 수 있다.

EIP를 만들고 인스턴스에 할당을 하면 공인 IP 주소가 다시 만들어지고 공인 DNS가 만들어진다. 만들어지는 공인 DNS 명의 형식은 다음과 같다.

ec2-{IP주소}.{지역존}.compute.amazoneaws.com

예를 들면 ec2-111-112-113-114.ap-northeast-1.compute.amazonaws.com 이다

Amazon RDS Free Tier

Amazon EC2 인스턴스를 만들어 보고 이번에는 Amazon RDS를 만들어 보았다.
AWS Free Tier에 포함되어 있기 때문에 써보는데 부담이 없다.

RDS 인스턴스

EC2 인스턴스와 마찬가지로 RDS 인스턴스는 db.t2.micro 를 사용할 수 있다.

  • CPU : 1개
  • 메모리 : 1GB
  • 네트워크 : 낮음 ~ 중간

스토리지는 일반 목적 (SSD)으로 5GB 할당했다. 생성이 완료되면 DB 접속  주소(EndPoint) 가 만들어 지는데 형식은 다음과 같다.

{지정한 DB이름}.{내부값} .{지역존}.rds.amazonaws.com

예를 들면 sampledb.abcd123xzz.ap-northeast-1.rds.amazonaws.com 이다.

보안 설정만 하면 PC에서 직접 DB 클라이언트 프로그램으로 접속이 가능하다.

EC2 인스턴스에 만들었던 MySQL DB를 백업 받아서 RDS 인스턴스에 복원하였다.

참고