개발서버 뿐만 아니라 실제 운영되고 있는 서버에서도 끊겨서, 꽤나 골치아픈 문제였다.
주말에 나는 늦잠을 자는편이라, 막내인 내가 연결을 못하고 계속해서 팀장님이 토요일 새벽마다 재연결을 하시는 그런 상황이.. 너무 싫었고, 틈 날때마다 찾아보았는데, 해결 지점까지 온듯 했다.
일단 네트워크 드라이브 연결을 30분마다 확인하는 스케줄러가 동작하고있었고, 끊긴 경우에는 개발팀으로 알림톡이 발송되었기에 알림톡 로그를 먼저 확인해보았다.
처음에는 이 사실을 알았을땐 당연히 우리 서버 스케줄러중에 4시반에 도는것이 부하가 걸려 이런 일이 생기는 줄 알았으나... 실제로 해당시간대에 동작하는 스케줄러가 없었다.
왜 토요일 특정 시간에만 끊길까...... 에 대해서 계속 생각하고 찾아보다가, 잘 알지도 못하는 AWS FSx 드라이브 설정에 가서 아무거나 눌러보다가 뭔가를 찾게되었다.
이게웬걸, FSx 주 단위 유지 관리 기간이라는 것이 금요일 19:30 UTC(한국시간 토요일 새벽 4시 30분) 이었다... 웬지 확실치는 않지만 누가봐도 이게 문제라는걸 알수가 있을 것이다.
https://docs.aws.amazon.com/fsx/latest/WindowsGuide/administering-file-systems.html#maintenance-windows
AWS 공식문서에 따르면 주 단위 유지 관리기간은 매주 실행되는 것은 아니며, 유지관리 일정이 잡히게되면 설정된 시간에 실행된다고 한다. 이때 네트워크 드라이브 연결은 끊기게 된다고 한다.
더 찾아보았을때 AWS 자체에서 재연결을 할 수 있는 세팅은 없는것같고, 서버에서 직접 재연결을 할 수 있게 하는 배치나 스케줄러를 실행 시키는 것이 최선인것같았다.
아래는 네트워크 드라이브연결 상태 확인 -> 재연결 까지 작업하는 powershell 스크립트 문이다.
우리의 경우 재연결시에 자격증명은 사용하지않아 주석처리 하였고, 대신 DNS 서버를 설정하고 나서 다시 자동으로 변경하는 것 까지 처리하였다.
재연결 후에 호출하는 웹 페이지는 기존에 있었던 알림톡 발송 페이지이다. 해당 페이지에서 다시 네트워크 연결상태를 확인 후에 재연결되었는지, 실패했는지 알림톡을 발송해준다.
# 네트워크 드라이브 문자
$driveLetter = "Z:"
# 네트워크 드라이브 경로
$networkPath = "네트워크드라이브경로"
# 자격 증명
# 자격증명 필요한지 확인 필요
# $username = "your_username"
# $password = "your_password"
# 네트워크 어댑터 이름 가져오기 (이더넷)
$adapterName = Get-NetAdapter | Where-Object {$_.Name -like "Ethernet*"} | Select-Object -ExpandProperty Name
# DNS 서버 IP
$dnsServerIp "DNS 서버 IP"
# 네트워크 드라이브 연결 상태 확인
if (!(Test-Path $driveLetter)) {
Write-Host "네트워크 드라이브가 연결되지 않았습니다. 다시 연결을 시도합니다..."
# 기존 연결 해제 (필요한 경우)
net use $driveLetter /delete
# 수동 DNS 서버 주소 설정
Set-DnsClientServerAddress -InterfaceAlias $adapterName -ServerAddresses $dnsServerIp
# 네트워크 드라이브 재연결
# 자격증명 필요한지 확인 필요
# net use $driveLetter $networkPath /user:$username $password
net use $driveLetter $networkPath
# DNS 서버 주소 자동으로 받도록 설정
Set-DnsClientServerAddress -InterfaceAlias $adapterName -ResetServerAddresses
if (Test-Path $driveLetter) {
Write-Host "네트워크 드라이브가 성공적으로 다시 연결되었습니다."
} else {
Write-Host "네트워크 드라이브를 다시 연결하는 데 실패했습니다."
}
# 웹 페이지 호출
Invoke-WebRequest -Uri "호출 할 웹 페이지" -Method Get
} else {
Write-Host "네트워크 드라이브가 이미 연결되어 있습니다."
}
# Powershell 종료
exit
로컬에서 테스트 완료해서, 서버에 적용하려 했지만...
사정이 생겨서 적용해보진 못하였다.