FSx 네트워크 드라이브 연결 끊김 현상

박한솔·2024년 8월 22일
1

한달에 한번씩 윈도우 서버의 네트워크 드라이브 연결이 끊겼다.

개발서버 뿐만 아니라 실제 운영되고 있는 서버에서도 끊겨서, 꽤나 골치아픈 문제였다.

주말에 나는 늦잠을 자는편이라, 막내인 내가 연결을 못하고 계속해서 팀장님이 토요일 새벽마다 재연결을 하시는 그런 상황이.. 너무 싫었고, 틈 날때마다 찾아보았는데, 해결 지점까지 온듯 했다.

일단 네트워크 드라이브 연결을 30분마다 확인하는 스케줄러가 동작하고있었고, 끊긴 경우에는 개발팀으로 알림톡이 발송되었기에 알림톡 로그를 먼저 확인해보았다.

토요일 새벽 4시 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

로컬에서 테스트 완료해서, 서버에 적용하려 했지만...

사정이 생겨서 적용해보진 못하였다.

0개의 댓글