AWSマイクラサーバーをCronとRCONで自動停止させる方法

に公開

はじめに

  • 概要: AWS EC2上で稼働するMinecraftサーバーを、プレイヤーが誰もいなくなったら自動でシャットダウン(EC2停止)させる仕組みを解説します
  • 目的: サーバーが稼働している間だけ料金が発生するEC2の特性を活かし、無駄なランニングコストを減らすにすること
  • 前提: EC2インスタンスが起動しており、Minecraftサーバー(PaperMCなど)が稼働し、SSH接続が可能であること。

第1章: 自動停止の仕組みと必要な準備

1.1 自動停止の全体像

自動停止の処理は、以下の4つの主要コンポーネントが連携して動作します。

コンポーネント 役割
Cron スケジューラ。5分などの間隔でスクリプトを定期実行します。
RCON サーバーコンソールへのリモート接続プロトコル。プレイヤー数の確認に使われます。
シェルスクリプト プレイヤー数をチェックし、0人だった場合にサーバー停止とEC2停止のコマンドを実行するロジック。
AWS CLI EC2インスタンス自身を停止させるためのAWS公式コマンドラインツール。

1.2 必要なツールと権限の設定

  • RCONの有効化: サーバーの server.properties ファイルでRCONを有効にし、ポート (25575 推奨) と強力なパスワードを設定してください。
  • mcrconのインストール: RCONコマンドを実行するためのクライアントツールをEC2にインストールします。
    sudo yum install mcrcon -y
    
  • IAMロールの確認: EC2インスタンス自身に、自身を停止する権限が必要です。EC2にアタッチされたIAMロールに ec2:StopInstances が許可されていることを確認してください。

第2章: RCON接続テストとスクリプトの作成

2.1 RCON接続のテスト

RCON設定が正しく行われているかを確認します。サーバーが稼働中に以下のコマンドを実行してください。

# RCONパスワードには設定したものを入力
mcrcon -H 127.0.0.1 -P 25575 -p <RCONパスワード> "list"

成功例: There are 0 of a max 20 players online: のような応答が返れば成功です。

2.2 自動停止スクリプトの作成

サーバープロセスを安全に停止させ、EC2インスタンスをシャットダウンするためのシェルスクリプトを作成します。

ファイル名: /home/ec2-user/minecraft/check_and_stop.sh

#!/bin/bash

# RCON設定とインスタンスIDを設定(環境に合わせて変更してください)
RCON_PASS="<ここに設定したRCONパスワードを入力>"
INSTANCE_ID="i-xxxxxxxxxxxxxxxxxx" # 停止対象のEC2インスタンスID

# mcrconでプレイヤーリストを取得し、grepでプレイヤー数を示す行を抽出
PLAYER_COUNT=$(/usr/bin/mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASS" "list" | grep -oP 'There are \K\d+')

# プレイヤー数が取得できなかった場合はエラーとみなし、処理を中断
if [ -z "$PLAYER_COUNT" ]; then
    echo "$(date): ERROR: Could not get player count. Aborting."
    exit 1
fi

echo "$(date): Current players: $PLAYER_COUNT"

# プレイヤー数が0人か判定
if [ "$PLAYER_COUNT" -eq 0 ]; then
    
    echo "$(date): Player count is 0. Initiating shutdown..."

    # 1. サーバー内への警告メッセージ
    /usr/bin/mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASS" "say 誰もいないため、30秒後にサーバーを停止します。"

    # 2. サーバープロセスを安全に停止
    # sleep 30 は含めず、即座に停止させることが多いが、今回は簡略化のため警告直後に実行
    /usr/bin/mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASS" "stop"
    
    # 3. EC2インスタンスを停止
    echo "$(date): Stopping EC2 instance $INSTANCE_ID."
    /usr/bin/aws ec2 stop-instances --instance-ids "$INSTANCE_ID" --region ap-northeast-1 

else
    echo "$(date): Players online. Skipping shutdown."
fi

2.3 実行権限の付与

スクリプトに実行権限を付与します。

chmod +x /home/ec2-user/minecraft/check_and_stop.sh

第3章: Cronによる定期実行の設定

最後に、このスクリプトを定期的に実行するように設定します。

3.1 crontabの編集

crontab -e コマンドを実行し、Cronジョブエディタを開きます。

3.2 5分ごとの実行設定

以下の行を追記し、5分ごとにスクリプトを実行するように設定します。実行ログを追跡しやすいようにファイルへ出力します。

*/5 * * * * /home/ec2-user/minecraft/check_and_stop.sh >> /var/log/minecraft_stop.log 2>&1

3.3 動作確認とログ監視

設定完了後、サーバーから全員がログアウトし、5分〜10分経過後にEC2インスタンスが停止することを確認してください。

  • ログの確認: 実行結果やエラーは以下のファイルで確認できます。
    tail -f /var/log/minecraft_stop.log
    

まとめ

CronとRCONを組み合わせることで、無人時の自動停止という高度なコスト管理機能を実現できました。

  • この仕組みにより、EC2サーバーの稼働時間を最小限に抑え、クラウド費用を削減できます。
  • RCONパスワードは非常に機密性の高い情報であるため、スクリプト内での取り扱いに十分注意し、パーミッション設定を厳重に管理してください。

Discussion