Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS Ambassador が本気で Minecraft サーバを運用してみた

issei.hamada
September 05, 2024
440

AWS Ambassador が本気で Minecraft サーバを運用してみた

Minecraft サーバの運用を例として、AWS におけるサーバ運用で活用出来る AWS サービスを解説します。

issei.hamada

September 05, 2024
Tweet

Transcript

  1. Who am I ? Issei Hamada • AWS セキュリティが得意です •

    2023 年より Japan AWS Ambassador として活動中 • JAWS-UG 山梨 運営メンバー • 最近ハマっているAWSサービスは AWS Amplify です Sonybiz Networks Corporation
  2. 本日のテーマ ⚫Minecraft とは? 4 引用元: https://minecraft.fandom.com/ja/wiki/Minecraft?file=Minecraft_horizontal_key_art.png • スウェーデン発の 3D サンドボックスゲーム

    • 1m 大のブロックで構成されたワールドを冒険し、様々な 「モノ」を作成できる • ソロプレイはもちろん、友達とのマルチプレイも可能
  3. 本日のテーマ ⚫本日話さない事 • AWS アカウント発行と day 1 対応 • Minecraft

    サーバ構築の詳細手順 - Qiita にアップロードしてあります https://qiita.com/drummers-high/items/a403bf350faac393a9a6
  4. 構築 ⚫ネットワーク設定 AWS Cloud Virtual private cloud (VPC) Private subnet

    Public subnet Private subnet Public subnet Private subnet Public subnet Public Route Private Route Internet gateway • 基本的な構成の VPC を作成 - AWS コンソールの VPC 作成ウィザードを利用すると、必要な 関連リソースを全て作ってくれる • Public Subnet のIPv4 アドレスの自動割り当てを 有効化しておく - この後のサーバ構築が楽になる為
  5. 構築 ⚫サーバ立ち上げ AWS Cloud Virtual private cloud (VPC) Private subnet

    Public subnet Private subnet Public subnet Private subnet Public Route Private Route Internet gateway • EC2: t3.small - 4 人程度で遊ぶのに十分と言われている • OS: Ubuntu 24.04 - 外部サイトでも使われている事が多く、ナレッジが豊富 • セキュリティグループ: In 0.0.0.0/0: 25565 - Minecraft のデフォルトポート - 界隈で俗に「ポート開放」と呼ばれているものがこの設定 Public subnet
  6. 構築 ⚫サーバ接続設定 Public subnet Public Route Internet gateway 1. Client

    の IP アドレスを調べる 2. Security Group で Client の IP からのみ ポート 22 への接続を許可する 3. ルートテーブルで、Client の IP に対して戻りの ルートを記述する Security group Client Internet 一般的に必要な設定例
  7. 構築 ⚫サーバ接続設定 Public subnet Public Route Internet gateway 1. Client

    の IP アドレスを調べる 2. Security Group で Client の IP からのみ ポート 22 への接続を許可する 3. ルートテーブルで、Client の IP に対して戻りの ルートを記述する Security group Client Internet 一般的に必要な設定例 一般家庭の IP アドレスは定期的に変わる為、 その都度設定変更が必要 正直、めんどくさい……
  8. 構築 ⚫サーバ接続設定 AWS Cloud Virtual private cloud (VPC) Private subnet

    Public subnet Private subnet Public subnet Private subnet Public subnet Public Route Private Route Internet gateway • EC2 Instance Connect Endpoint を作成 • AWS コンソールからサーバに対して、ブラウザ経由で SSH 接続可能になる EC2 Instance Connect Endpoint
  9. EC2 Instance Connect Endpoint を使った SSH 接続イメージ 構築 ⚫サーバ接続設定 Public

    subnet Public Route 1. ブラウザから「接続」を押下すると、AWS が管理する 踏み台サーバが、エンドポイント経由でサーバへ接続 2. ユーザは踏み台サーバを画面転送経由で操作する 3. Security Group は VPC内からの通信を許可する だけでよく、高セキュア ※ あくまで発表者のイメージです Security group Client Public subnet EC2 Instance Connect Endpoint AWS Cloud 踏み台サーバ 画面転送 SSH
  10. EC2 Instance Connect 構築 ⚫(参考) AWS 上のサーバへのリモート接続サービス AWS Systems Manager

    Session Manager Endpoints AWS Systems Manager • 接続に必要な設定は、通常の SSH 接続準拠 • 接続先インスタンスに対して、IAM Role の付与が必要
  11. EC2 Instance Connect 構築 ⚫(参考) AWS 上のサーバへのリモート接続サービス Endpoints • 接続に必要な設定は、通常の

    SSH 接続準拠 • セキュリティ要件的にはどちらもほとんど同じ • Session Manager の場合、IAM Role を付与して から接続可能になるまで10分程度時間がかかる場合 がある • 接続可能になるまでの時間が短い為、こちらを選定
  12. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # パッケージアップデート > apt update # 依存関係インストール

    > apt install openjdk-21-jdk-headless screen –y 依存関係のインストール アプリケーションインストール 自動起動設定
  13. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 ※ 以降、しばらく Minecraft 独自仕様 # ユーザ作成 >

    useradd -m -s /bin/bash mcuser > echo “mcuser:P@ssw0rd” | chpasswd • 外部利用のあるアプリケーションを攻撃された際、root で 実行していると被害が大きくなる危険がある • 必ず権限を絞ったユーザで、アプリケーションを実行する 依存関係のインストール アプリケーションインストール 自動起動設定
  14. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # ディレクトリ作成 > cd /home/mcuser > mkdir

    minecraft > cd minecraft # アプリケーションをダウンロード > wget https://piston- data.mojang.com/v1/objects/xxxxx/server.jar • 「xxxxx」はバージョンによって可変 依存関係のインストール アプリケーションインストール 自動起動設定
  15. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # 初回起動と eula 書き換え > java -Xmx1024M

    -Xms1024M -jar server.jar nogui > echo "eula=true" > eula.txt • 初回起動時、eula がない為、必ず強制終了する仕様に なっている • eula を書き換えれば、一応いつでも遊べる状態になる 依存関係のインストール アプリケーションインストール 自動起動設定
  16. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # アプリケーション実行 > screen -S minecraft -U

    -d -m java -Xmx1024M - Xms1024M -jar server.jar --nogui • Linux の仕様として、ターミナルを切断すると起動したプロセス も一緒に終了する • バックグラウンドで実行できるよう、screen コマンドを使って起 動する 依存関係のインストール アプリケーションインストール 自動起動設定
  17. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # アプリケーション実行 > screen -p 0 -S

    minecraft -X eval 'stuff "stop¥015“’ • Minecraft の仕様として、アプリケーション停止時に「stop」と 入力する必要がある • サーバ停止前に、Screen コマンド経由で「stop」を入力する ※ Minecraft 独自仕様ここまで 依存関係のインストール アプリケーションインストール 自動起動設定
  18. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 • このままだと、Minecraft で遊ぼうとサーバを立ち上げる度に java のコマンドを入力する事になる • Minecraft

    のアプリケーションを daemon 化して、自動 起動・停止するよう設定する 依存関係のインストール アプリケーションインストール 自動起動設定
  19. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # 起動コマンドを shellscript 化 > cat <<EOF

    > start.sh #!/bin/bash screen -S minecraft -U -d -m java -Xmx1024M - Xms1024M -jar server.jar --nogui EOF • 起動時に複数行の処理を実行したい場合に便利 依存関係のインストール アプリケーションインストール 自動起動設定
  20. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # 停止コマンドを shellscript 化 > cat <<EOF

    > stop.sh #!/bin/bash screen -p 0 -S minecraft -X eval 'stuff "stop¥015"' EOF • 起動時に複数行の処理を実行したい場合に便利 依存関係のインストール アプリケーションインストール 自動起動設定
  21. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # shellscript 実行権限付与 > chmod 755 start.sh

    > chmod 755 stop.sh > chown -R mcuser:mcuser ../minecraft/ 依存関係のインストール アプリケーションインストール 自動起動設定
  22. 構築 ⚫サーバ構築 sudo cat <<EOF > /etc/systemd/system/minecraft.service [Unit] Description=Minecraft Server

    After=network.target [Service] ExecStart=/home/mcuser/minecraft/start.sh ExecStop=/home/mcuser/minecraft/stop.sh Restart=always Type=forking WorkingDirectory=/home/mcuser/minecraft/ User=mcuser Group=mcuser [Install] WantedBy=multi-user.target EOF # daemo 化 • サーバ起動時に実行するコマンド • サーバ停止時に実行するコマンド • コマンド実行時のディレクトリ • コマンドを実行するユーザ・グループ
  23. サーバ構築時、一般的にやらなければならない作業 構築 ⚫サーバ構築 # daemon 再読み込み > sudo systemctl daemon-reload

    # 自動起動設定 > sudo systemctl enable minecraft.service # 起動 > sudo systemctl start minecraft.service • ここまでで、Minecraft の自動起動設定は完了 依存関係のインストール アプリケーションインストール 自動起動設定
  24. EC2 のユーザデータ機能 構築 ⚫サーバ構築 • EC2 インスタンス起動時、Shellscript や Powershell を実行してくれる機能

    • サーバセットアップ手順を shellscript として記述する 事で、構築作業を自動化出来る
  25. 運用 ⚫データバックアップ EBS スナップショット • AWS においてメジャーな「EBS スナップショット」にて実装 - EC2

    のディスクのバックアップを取得しておく - 障害発生時はバックアップからディスクを復元し、丸々交換する • バックアップデータの保存先は S3 となっており、データが消える 事はほぼ無い (99.999999999% の耐久性) • データ書き込みが無い状態でスナップショットを取得する事を 推奨 EC2 instance contents Elastic network interface Volume Compute AMI Amazon S3 Snapshot ここだけ取得
  26. 運用 ⚫データバックアップ • DLM 用 SSM Document の書き方 • execute_pre_script()

    {} 内に、前処理を記述 > sudo systemctl stop minecraft.service • execute_post_script() {} 内に、後処理を記述 > sudo systemctl start minecraft.service • 他は全部修正不要 https://docs.aws.amazon.com/ebs/latest/userguide/script-other-use-cases.html
  27. 運用 ⚫インスタンス起動・停止スケジューリング Amazon EventBridge Scheduler • スケジュールベースでの API 実行に特化した EventBridge

    の 1機能 • EventBridge 自体にもスケーリング機能はあるが、以下の点で 大幅に強化されている - サービス連携ではなく、API を直接実行できる - 特定の日付を指定して、単発で API を実行できる - スケジュール実行時、タイムゾーンやサマータイムを考慮してくれる
  28. 運用 ⚫インスタンス起動・停止スケジューリング インスタンス起動 Amazon EventBridge AWS API Minecraft Server cron(0

    18 * * ? *) ec2:runInstances インスタンス停止 Amazon EventBridge AWS API Minecraft Server cron(0 3 * * ? *) ec2:stopInstances systemctl によって start.sh 実行 systemctl によって stop.sh 実行
  29. 運用 ⚫(参考) 本構成と各種 VPS サービスの料金比較 AWS ⚫ t3.small: USD 0.0272

    - $1 = ¥145 として計算 - 24時間 30日動かした場合: 約 ¥2,840 - 9時間 30日動かした場合: 約 ¥1,065 EC2 instance xserver VPS for Games ⚫ 2 GB プラン - 12か月分一括の支払い: ¥855/月 - 1か月毎の支払い: ¥1,150 ConoHa for GAME ⚫ 2 GB プラン - 時間課金での1か月分料金: ¥2,033 - 1か月分の一括支払い: ¥721 ※ 他 AWS リソースの従量を除く
  30. 運用 ⚫(参考) 本構成と各種 VPS サービスの料金比較 AWS ⚫ t3.small: USD 0.0272

    - $1 = ¥145 として計算 - 24時間 30日動かした場合: 約 ¥2,840 - 9時間 30日動かした場合: 約 ¥1,065 EC2 instance xserver VPS for Games ⚫ 2 GB プラン - 12か月分一括の支払い: ¥855/月 - 1か月毎の支払い: ¥1,150 ConoHa for GAME ⚫ 2 GB プラン - 時間課金での1か月分料金: ¥2,033 - 1か月分の一括支払い: ¥721 運用の柔軟性を検討すると、十分アリ ※ 他 AWS リソースの従量を除く
  31. 監視 ⚫CloudWatch Agent を用いた監視を実装する Amazon CloudWatch • Amazon CloudWatch とは、様々な

    AWS サービスの、様々 なメトリクスやログを収集、ダッシュボードの作成、アラームの設定が 行える監視サービス • 今回取得したいプロセスのメトリクスはデフォルトの収集項目に含ま れていないので、CloudWatch Agent のプラグインを利用する Alarm Logs …… etc
  32. 監視 ⚫CloudWatch Agent を用いた監視を実装する CloudWatch Agent 設定 • 設定ウィザードを使うか、Json 形式で指定

    • agent: agent 自体の設定 • logs: 取得するログファイルに関する設定 - file_paht: ログファイルのパス Minecraft の例: /home/mcuser/minecraft/logs/latest.log - Log_group_name: ログの送信先 - Log_stream_name: ログストリームの命名規則
  33. 監視 ⚫CloudWatch Agent を用いた監視を実装する CloudWatch Agent 設定 • metrics: メトリクスの収集に関する設定

    • procstat: プロセス情報を収集する為の項目 - exe: 対象のプロセスを記述 例: /usr/lib/jvm/java-21-openjdk-amd64/bin/java • netstat: TCP コネクションに関する情報を収集する為の項目 - 全てのポートの合計値のみ取得可能 - 今回は tcp_established, tcp_close_wait を収集
  34. 監視 ⚫CloudWatch Agent を用いた監視を実装する CloudWatch Agent 設定 • Disk: ディスクの情報を収集する為の項目

    - マウントポイント毎の使用率を取得可能 - 今回は “/” の使用率を取得 • mem: メモリの情報を収集する為の項目 - CloudWatch のデフォルト設定では、メモリ使用率を見れない
  35. 監視 ⚫CloudWatch Agent を用いた監視を実装する • CloudWatch Alarm の設定 • 取得したメトリクスに対して閾値を設定する事で、特定のアクション

    を実行できる - SNS アクション: 主にメール通知を行う - AWS Lambda アクション: 作成したスクリプトを実行する - Auto Scaling アクション: Auto Scaling に関する処理を行う - EC2 アクション: サーバ再起動・停止・終了を行う - Systems Manager アクション: Systems manager と連携する
  36. 監視 ⚫CloudWatch Agent を用いた監視を実装する • CloudWatch Alarm の設定 • 取得したメトリクスに対して閾値を設定する事で、特定のアクション

    を実行できる - SNS アクション: 主にメール通知を行う - AWS Lambda アクション: 作成したスクリプトを実行する - Auto Scaling アクション: Auto Scaling に関する処理を行う - EC2 アクション: サーバ再起動・停止・終了を行う - Systems Manager アクション: Systems manager と連携する 今回はコレ
  37. 監視 ⚫CloudWatch Agent を用いた監視を実装する • 起動・停止をスケジューリングしている為、監視設定の自動静観機能が必要 監視有効化 Amazon EventBridge AWS

    API cron(15 18 * * ? *) cloudwatch:enableAlarmActions 監視無効化 Amazon EventBridge AWS API cron(45 2 * * ? *) cloudwatch:disableAlarmActions CloudWatch Alarm CloudWatch Alarm
  38. 監視 ⚫CloudWatch Agent を用いた監視を実装する • 各種メトリクスを集約して、カスタムダッシュボードを作成 CPU 使用率とクレジット消費量 から、適切なインスタンスサイズ を分析

    Minecraft プロセスの 稼働状況を確認 アプリログの 「joined the game」 「left the game」 をカウントし、差分を表示 = 接続中のプレイヤー数 プレイヤー数とサーバリソースの相関 関係を分析
  39. 監視 ⚫(参考)Minecraft サーバでよく見かけるアプリログから考えられる運用 ⚫ xxx is joined the game. ⚫

    xxx is left the game. ⚫ Can't keep up! Is the server overloaded. ⚫ xxx has moved wrongly! • プレーヤーがゲームにログイン・ログアウトした際のログ • サーバに高負荷がかかっている事を示すログ - 例: カウントしておいて、一定時間内に特定回数検出したらアラート 発報、サーバ増強対応を行う • プレイヤーのチートと思われる動き方を検知したログ - 例: ログからプレイヤーを特定してコマンドを生成、Run Command で自動的に ban する
  40. 監視 ⚫Next Actions: セキュリティの強化 Amazon GuardDuty Amazon Inspector Amazon Macie

    Amazon Route 53 AWS CloudTrail AWS Config Amazon Detective ポート変更とドメイン登録 AWS API ロギング 構成管理 脅威対策 インシデントレスポンス強化 AMI 更新 Amazon EC2 Image Builder データ保護 脆弱性対策 Network Load Balancer DoS攻撃対策 ・・・・・・
  41. 監視 ⚫Next Actions: セキュリティの強化 Amazon GuardDuty Amazon Inspector Amazon Macie

    Amazon Route 53 AWS CloudTrail AWS Config Amazon Detective ポート変更とドメイン登録 AWS API ロギング 構成管理 脅威対策 インシデントレスポンス強化 AMI 更新 Amazon EC2 Image Builder データ保護 脆弱性対策 Network Load Balancer DoS攻撃対策 ・・・・・・ To be continued……
  42. まとめ、の前に…… ⚫今回 Minecraft で遊ぶ為に実装したもの 構築 運用 監視 • ネットワーク設定 •

    サーバ立ち上げ • サーバ接続設定 • サーバ構築 • バックアップ取得設定 • サーバ起動・設定スケジューリング • CloudWatch Agent 設定 • CloudWatch Alarm 設定 • CloudWatch Dashboard 作成
  43. まとめ、の前に…… ⚫今回 Minecraft で遊ぶ為にやった事 構築 運用 監視 • ネットワーク設定 •

    サーバ立ち上げ • サーバ接続設定 • サーバ構築 • バックアップ取得設定 • サーバ起動・設定スケーリング • CloudWatch Agent 設定 • CloudWatch Alarm 設定 • CloudWatch Dashboard 作成 全部作るの、大変すぎない?
  44. まとめ ⚫Minecraft サーバの構築から監視まで、全て実装してみました 構築 運用 監視 • 論理ネットワークの設定 - セキュアな接続に使えるサービスを

    紹介 • サーバ構築 - 自動起動設定まで全て紹介 - ユーザデータでの設定自動化 • バックアップ取得設定 - アプリケーションの特性を踏まえて、 バックアップ取得設定を自動化 • サーバ起動・設定スケーリング - コスト削減の為に、起動・停止を 自動化 • 稼働状況の可視化の為、様々な 監視設定を投入
  45. まとめ ⚫Minecraft サーバの構築から監視まで、全て実装してみました 構築 運用 監視 • 論理ネットワークの設定 - セキュアな接続に使えるサービスを

    紹介 • サーバ構築 - 自動起動設定まで全て紹介 - ユーザデータでの設定自動化 • バックアップ取得設定 - アプリケーションの特性を踏まえて、 バックアップ取得設定を自動化 • サーバ起動・設定スケーリング - コスト削減の為に、起動・停止を 自動化 • 稼働状況の可視化の為、様々な 監視設定を投入 これらの構築を AWS CloudFormation で 全て自動化