Minecraft server on-demand: 필요할때만 켜지는 마인크래프트 서버 구축하기
robin @robin@hackers.pub
계기
제 생각엔 프로그래머들은 대부분 마인크래프트에 모드 65535개를 깔아서 플레이하는걸 좋아하는 것 같은데, 여러분들의 생각은 어떠신가요?
일단 저는 대체로 그런 편인데요, 그래서 마침 모드를 좋아하는 친구들과 같이 서버를 열기로 했어요.
그치만 모드서버는 높은 사양이 필요해요! 매 시간마다 AWS에 0.2$씩을 뜯긴다면 아마 금세 파산하고 말 거에요.
그래서 저는 서버를 필요할 때만 켜서 비용 절감을 도모하고자 했어요.
구조
이 서버 구축은 제 Pulumi 첫 사용이기도 해요. 코드는 https://github.com/robin-maki/minecraft-server 에서 확인하실 수 있어요.
삽질 포인트
접속자 수를 어떻게 구하지?
마인크래프트 서버는 접속자 수 등의 정보를 얻어올 수 있도록 RCON 프로토콜을 지원하는데요, 원래 쓰려고 계획했던 CLI용 RCON 클라이언트는 arm 아키텍처 바이너리를 배포하고 있지 않았어요. 물론 따로 빌드하면 되지만... AMI를 따로 관리하는 건 너무나도 귀찮았기 때문에 빠르게 포기했어요.
사실 그 이유만 있는건 아닌데요, RCON이나 서버에 직접 list를 쳐서 응답 문자열을 파싱하는 방법???????? 은 실제로 접속이 된 사용자만 보여주기 때문에 접속이 오래 걸리는 사용자의 경우에는 접속하다가 갑자기 서버가 꺼져버리는 문제가 일어날 수 있어요.
그래서 이러저러한 방법을 고민하다가 netstat을 사용하면 된다는 걸 깨달았어요. 심지어 마인크래프트는 게임서버 주제에 TCP를 사용하니까 연결이 존재하는지도 확실하게 체크할 수 있고...
으악! 인스턴스 메타데이터 서비스가 안되잖아!
따로 설정하지 않으면 IMDSv2가 되는데 얘는 토큰이 없으면 인증에서 쳐내요. MetadataOptions.HttpTokens=optional
하세요.
볼륨에 연결이 안되는데...
테스트 하다가 알게 된 사실인데, ASG DesiredCapacity=1
이여도 원래 있던 서버의 마운트 해제가 다 안 끝났는데 새 서버가 생겨버려서 마운트에 실패한 적이 있었어요.
describe-volumes
명령으로 먼저 마운트할 볼륨의 상태를 (while 돌면서) 체크한 후 attach하는게 안전해요.
나중에 해볼까 하는 것
서버 파일 EFS로 옮기기
지금 인프라는 특정 AZ에 묶여있는 제한이 있어요. 아무래도 EBS는 같은 AZ에서만 연결할 수 있으니까요. 그래서 원래는 EFS에 서버 파일을 저장하는게 맞지만, 아무래도 성능도 성능이고 비싸니까...
참고) ASG에서 특정 AZ의 서브넷만 선택하면 인스턴스가 그 AZ에만 생기도록 강제할 수 있어요.
도커라이징 해서 ECS에 올리기
지금은 무식하게 userdata에서 의존성(자바등등)을 설치하고 각종 스크립트를 돌리는 방식이에요. 어쩌면 자바의 사소한 버전업이 서버를 망가뜨릴 가능성도 있는 거겠죠...
이제뭐쓰지? 봐주셔서감사합니다!