Minecraft 서버 전원과 버전 변경
VM 시작과 중지, 관리자 IP, 머신 유형, Minecraft와 Java 버전 변경 절차
첫 배포 뒤 VM 전원은 gcloud로 관리한다. 방화벽, 사양과 JAR처럼 코드에 적힌 값은
저장한 Terraform 계획으로 바꾼다.
두 경로를 구분하면 다음 plan이 운영자의 수동 전원 조작을 되돌리려 하지 않는다.
선수 조건
06편에서 적어도 한 개의 archive가 격리 로드 시험을 통과해야 한다.
아래 명령은 별도 경로가 적힌 경우를 제외하고 Cloud Shell의
${HOME}/minecraft-one-root에서 실행한다.
서버 전원
실행
export MINECRAFT_INSTANCE="$(
terraform output -raw minecraft_instance_name
)"
export MINECRAFT_ZONE="$(
terraform output -raw minecraft_zone
)"
접속자가 없는지 확인하고 VM을 중지한다.
조건부 실행: 서버를 사용하지 않을 때
gcloud compute instances stop "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}"
TERMINATED가 되면 VM의 CPU와 메모리 실행 비용은 멈춘다. 부팅 디스크와 고정
외부 IPv4 비용은 남을 수 있다. Cloud Storage 비용도 계속 확인한다.
다시 사용할 때 시작한다.
실행
gcloud compute instances start "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}"
RUNNING 뒤에도 Minecraft 준비에는 시간이 필요하다. 05편처럼 systemd의 active와
로그의 Done (...)!을 차례로 확인한다. Spot 용량이 없다는 오류가 나면 시작 명령을
짧은 간격으로 반복하지 않는다. 같은 존의 다른 머신 유형을 먼저 검토한다. zone을
바꾸면 VM과 부팅 디스크가 교체될 수 있으므로, 다른 존으로 옮길 때는 검증한 백업에서
새 서버로 복원하는 별도 이전 계획이 필요하다.
변경할 때 지키는 순서
Terraform으로 관리하는 값을 바꿀 때는 같은 순서를 사용한다.
- 06편에서 검증한 백업보다 월드가 많이 바뀌었다면 새 백업을 만든다.
terraform.tfvars또는 예제 스크립트 한 곳만 수정한다.- 이름을 붙인 계획 파일을 만들고
terraform show로 읽는다. - 예상한 리소스만 바뀌면 저장한 계획을 적용한다.
- 재부팅이 필요한 변경은 VM을 중지하고 다시 시작한 뒤
Done (...)!까지 확인한다.
계획에 예상하지 않은 replace나 destroy가 하나라도 있으면 적용하지 않는다.
관리자 공인 IP가 바뀌었을 때
가정용 회선이나 VPN 출구 주소가 바뀌면 SSH 방화벽이 새 주소를 거부한다. Cloud
Shell에서 운영한다면 이 일이 더 자주 생긴다. Cloud Shell의 공인 IP는 새 세션에서
달라질 수 있다. gcloud compute ssh가 시간 초과로 실패하면 현재 공인 IP와
admin_cidr가 같은지 먼저 확인한다.
확인
curl --fail --silent --show-error https://api4.ipify.org
출력이 terraform.tfvars의 admin_cidr와 다르면 admin_cidr만 새 공인 IPv4
/32로 바꾼다.
실행
nano terraform.tfvars
terraform fmt
scripts/preflight.sh
terraform plan -out=admin-ip.tfplan
terraform show admin-ip.tfplan
예상 계획은 SSH 방화벽 규칙의 source_ranges 한 항목 변경이다. VM 재부팅은 필요
없다.
실행
terraform apply admin-ip.tfplan
되돌리려면 이전 IP를 다시 입력하고 새 계획을 만든다. 접속이 막혔다고
0.0.0.0/0으로 넓히지 않는다.
머신 유형을 바꿀 때
플레이어 수와 월드 연산이 늘어 메모리가 부족하다면 terraform.tfvars의
machine_type을 바꾼다.
machine_type = "e2-standard-4"
머신 유형만 바꾸면 scripts/startup.sh의 JVM -Xms와 -Xmx는 기존 값으로 남는다.
메모리를 함께 늘리려면 nano scripts/startup.sh를 열어
ExecStart=/usr/bin/java -Xms2G -Xmx4G ... 줄의 두 값을 새 머신 메모리에 맞게
고친다. e2-standard-4(16GiB)에서 -Xms4G -Xmx8G는 운영체제와 heap 밖 메모리를
남기는 예시이며 실제 값은 부하 중 heap과 VM 전체 메모리를 측정해 정한다.
이 파일은 VM metadata로 전달되므로 수정하면 plan에 metadata 변경이 나타나고,
적용 뒤 VM을 재부팅해야 실제 서비스에 반영된다.
입력값과 startup script 수정을 모두 마친 뒤 새 계획을 만든다.
실행
terraform plan -out=machine-type.tfplan
terraform show machine-type.tfplan
예상 계획은 같은 VM의 machine_type과, startup script도 고쳤다면 metadata의 제자리
변경이다. compute.tf의 allow_stopping_for_update = true 때문에 Provider가 적용 중
VM을 멈출 수 있다. 부팅 디스크 삭제나 VM 교체가 보이면 적용하지 않는다.
조건부 실행: 계획이 예상 범위일 때
terraform apply machine-type.tfplan
변경 뒤 문제가 생기면 이전 machine_type과 JVM 메모리로 되돌려 새 계획을 만든다.
Minecraft 버전을 바꿀 때
새 버전은 월드 형식을 바꿀 수 있다. 먼저 최신 백업을 만들고 06편의 격리 시험을 통과시킨다. 그다음 준비 스크립트로 URL과 해시를 함께 만든다.
실행
scripts/prepare-server-jar.sh "설치할-버전" \
| tee server-jar-values.txt
nano terraform.tfvars
terraform fmt
scripts/preflight.sh
출력된 server_jar_url, server_jar_sha256과 server_java_major를 함께 붙여
넣는다. scripts/startup.sh는 Java 21과 25를 지원한다. URL이나 해시만 바꾸거나 이전 Java
major를 남기면 사전 검사가 적용 전에 중단한다.
실행
terraform plan -out=server-version.tfplan
terraform show server-version.tfplan
예상 계획은 VM metadata 변경이다. 실행 중인 JAR는 metadata 변경만으로 바뀌지 않는다.
조건부 실행: 계획과 백업을 확인한 뒤
terraform apply server-version.tfplan
gcloud compute instances stop "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}"
gcloud compute instances start "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}"
새 로그의 java -version, Done (...)!과 클라이언트 버전을 확인한다. 설치된 Java
major가 입력값과 다르면 startup script가 서비스를 시작하기 전에 실패한다.
다운그레이드할 때는 새 버전으로 연 현재 월드를 구버전 JAR에 먼저 넘기지 않는다. 서버를 중지하고 구버전 JAR의 URL, 해시와 Java major를 준비해 적용한다. 그 버전에서 검증했던 호환 백업을 복원한 뒤 서비스를 시작한다. 다운그레이드 전 현재 월드 archive도 별도 보존해 되돌릴 길을 남긴다.
VM에서 네트워크까지 확인할 순서
확인
gcloud compute instances describe "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}" \
--format="value(status,lastStartTimestamp,lastStopTimestamp)"
gcloud compute ssh "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}" \
--command="sudo systemctl is-active minecraft"
| 관찰한 상태 | 다음 확인 | 먼저 하지 않을 일 |
|---|---|---|
VM TERMINATED | 수동 중지인지 Spot 선점인지 operation과 로그 확인 | 곧바로 자동 시작 반복 |
VM RUNNING, SSH 실패 | 현재 공인 IP와 OS Login IAM | SSH 전체 공개 |
SSH 성공, 서비스 failed | startup script와 Minecraft journal의 첫 오류 | VM 교체 |
서비스 active, Done 없음 | 월드 로드와 메모리 로그 | 게임 방화벽 변경 |
Done 있음, 외부 접속 실패 | listen 포트, 게임 방화벽, 클라이언트 버전 | SSH 규칙 변경 |
| 새 부팅 뒤 월드 없음 | 최근 plan과 부팅 디스크 ID | 빈 월드에서 계속 플레이 |
Minecraft 로그는 최근 오류부터 본다.
확인
gcloud compute ssh "${MINECRAFT_INSTANCE}" \
--zone="${MINECRAFT_ZONE}" \
--command="sudo journalctl \
-u minecraft \
-n 150 \
--no-pager"
VM이 멈춘 이유를 Google Cloud operation에서 찾을 때는 최근 목록을 확인한다.
확인
gcloud compute operations list \
--filter="targetLink~/${MINECRAFT_INSTANCE}$" \
--limit=20
선점 사건과 운영자의 중지를 구분할 수 있어야 자동 시작도 안전하게 제한할 수 있다. 수동 시작으로 충분한 서버에는 자동 복구가 필요하지 않다.
완료 체크
- 사용하지 않을 때 VM을 중지하고 남는 비용 항목을 알고 있다.
- 관리자 IP, 머신 유형과 JAR 변경의 예상 plan을 구분한다.
- 재부팅이 필요한 변경과 되돌릴 값을 기록했다.
- 장애 때 VM, systemd, Minecraft 로그, 네트워크 순서로 확인한다.
선점된 VM만 다시 시작하는 선택 기능은 Spot VM 자동 복구에 있다. 운영을 끝낸 서버에는 마지막 백업과 리소스 삭제가 필요하다.
참고
Comments
아직 댓글이 없습니다. 첫 댓글을 남겨주세요.
검토 대기 중