열흘도 더 된 사건이지만 나중에 참고할 일이 생길 것 같아서 남겨둔다.
오전 8시 반 쯤에 운영 중인 대부분의 서버에서 오류가 발견되었다.
문제는 도메인이야, 이 멍청아
Express.js 서버(A)에서 외부 자원(B)을 불러올 수 없다는 오류를 내고 있었다.
도메인에 대한 IP를 조회하지 못하는 문제였다.
일반적인 상황에서라면 500이나 Request Timed Out이 발생하는게 맞을터였다.
이상한 조짐을 느끼고 ping을 시도했다.
출처: https://discourse.pi-hole.net/t/temporary-failure-in-name-resolution-after-4-0-upgrade/13323
최근에 도메인 관련 작업을 수행하지도 않았는데?
AWS Route53에 등록된 정보도 이상이 없었다.
문제 원인을 분리해내기 위해 아래를 수행했다.
1. A의 인스턴스에서 DNS Cache 비우기: 동일 오류 발생
2. 다른 머신(로컬)에서 B로 접속 시도: 성공
3. AWS의 다른 인스턴스에서 B로 접속 시도: 실패: 동일 오류 발생
얼추 AWS에서만 발생하는 문제로 파악이 되고 있었다.
더 정확한 확인을 위해서 수행할 수 있는 작업들이 있었겠지만,
당장 서비스를 올려야 하는 상황이었다.
해결 방안 결정
떠오른 방법은 두 가지가 있었다.
A. 도메인으로 접속하는 코드를 IP로 바꾸자
B. DNS 서버를 추가하자
A의 방법은 간단하지만 코드를 직접 수정하기에 위험하기도 하고, 작업량이 많다고 판단되었다.
그렇다면 B번, 리눅스의 DNS 관련 설정을 바꾸기로 했다.
DNS 서버를 추가하자
AWS EC2 인스턴스를 생성하면 기본적으로 AWS의 DNS 서버가 입력되어 있었다.
AWS DNS 서버에 이상이 발생했음이 예상되었다.
CloudFlare와 Google DNS를 보조로 추가해주자.
1. /etc/resolv.conf 파일에 네임서버를 추가한다.
만약 변경 사항이 덮어 쓰여질 수 있다는 경고가 표시되면 그냥 닫는다.
sudo nano /etc/resolv.conf
바로 하단에 추가해주자.
몇 분 후 원래대로 원상복구가 될 것이다.
에디터가 열리면 아래 두 줄을 추가한다.
nameserver 1.1.1.1
nameserver 8.8.8.8
2. /etc/systemd/resolved.conf 파일에 네임서버를 추가한다.
역시 파일 내용이 표시되지 않으면 그냥 닫는다.
sudo nano /etc/systemd/resolved.conf
이렇게 보이면 된다.
위 이미지와 같이 보이도록 파일을 수정한다.
[Resolve]
DNS=1.1.1.1
FallbackDNS=8.8.8.8
3. 별도로 서버를 재시동하지 않아도 바로 적용이 된다.
ping 명령어로 IP가 조회가 되는지 확인한다.
참고 문서
- [CentOS] temporary failure in name resolution 해결 방법 - http://lwk24.tistory.com/403