どのように3未満の米国のためのAWS上でMinecraftサーバーを実行する


covid - 19のパンデミックの最初の週の間に、2020年4月に私の息子は、彼の学校友人と同じ世界で遊ぶためにMinecraftサーバーを建設するよう頼みます.チェック後some available services (最終的にはそれほど高くはないが、EC 2インスタンスでサーバを構築することを選んだ.この記事では、コストを最適化する方法を説明します😜, 使用に基づきます!

記事で使われる道具


AWS


私は、この大きい雲提供に関して私の知識を増やしたいので、AWSサービスだけに頼りたいです.あなたが知らない1つのサービスが常にあります!この特定の例では、次のサービスを使用します.

  • EC2 (クラウド内の仮想サーバ)

  • Lambda ( Serverless関数)

  • Simple Email Service (メール送受信サービス)
  • 鉱夫


    Minecraft 人気のサンドボックスのビデオゲームです.この場合、私はMinecraft Java版に集中します.なぜなら、サーバー・バージョンはLinuxサーバ上でうまく動作しており、私の息子はDebian上でラップトップを走らせています.

    ソリューションのグローバルアーキテクチャ


    サーバーを操作して最初の月、私は私の息子は、毎日それを使用している時間に2時間、それからサーバーが遊んでいた気づいた.それはEC 2上に構築されていますt2.small 8 GBのディスクで、私は約18 US $の毎月のコストを持っています.たくさんではなく、改善の余地があると思っていました!コストの主な部分はEC 2計算コスト(〜17 US $)であり、私はそれが時間の100 %を使用していないことを知っている.私の息子がそれを使用しているときだけ、世界的な考えはサーバーを始めることです、しかし、私は甘い解決を見つける必要があるように、彼は私のAWSコンソールにアクセスしません!
    以下に様々なブロックを使用します.
  • EC 2インスタンス、Minecraftサーバ
  • SES(単純な電子メールサービス)を使用して電子メールを受信し、ラムダ関数をトリガ
  • サーバを起動するための一つのラムダ関数
  • サーバを停止するための一つのラムダ関数
  • そしてそれです.息子はこんな風に使っています.
  • 特定の、そして、秘密の電子メールアドレスに電子メールを送ってください
  • 8 hの後、ラムダ関数によってインスタンスがシャットダウンした後に😅)
  • 一緒に作りましょう


    EC 2インスタンスのビルド


    これは初期の部分です、新しいEC 2インスタンスを作成しなければなりません.EC 2ダッシュボードからLaunch Instance そして、X 86オプションでアマゾンLinux 2 AMIを選んでください.

    次に、インスタンス型を選択する必要があります.私はあなたにt2.small Minecraft用.作成後に変更することができます.

    クリックNext: Configure Instance Details 設定を続行するにはデフォルトの設定を維持し、ディスクのデフォルトサイズ(8 GB)として十分です.
    タグ画面では、一般的にName ( EC 2インスタンスリストに表示される)costcenter (あとでコスト管理のために使う).

    セキュリティグループでは、EC 2のファイアウォールに相当し、どのポートがあなたのサーバ上でインターネットからアクセスできるかを設定する必要があります.以下の画面でssh portとminecraft port ( 25565 )を追加します.

    次に、キーペアを選択または作成するインスタンスを開始します.これは必須ですし、リモートEC 2インスタンスに接続することができます.私のケースでは、既存のキーペアを使用していますが、新しいキーを作成する場合は、ラップトップ上の秘密キーファイルをダウンロードすることを忘れないでください.

    はい私のキーカロリンという名前です.なぜ?
    SSH経由でインスタンスを接続しなければなりませんguide あなたが助けを必要とするならば.基本的にこの種のコマンドを実行しなければなりません.
    ssh -i my_private_key.pem ec2-user@public-ipv4
    
    The public-ipv4 インスタンスリストで使用可能です.

    まずJavaが必要です.Minecraftの新しいビルド(1.17以降)はJava 17だけで動作しているので、Corretto(Amazon Java Version)を使うことを勧めます.
    sudo rpm --import https://yum.corretto.aws/corretto.key
    sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
    sudo yum install -y java-17-amazon-corretto-devel.x86_64
    java --version
    
    次のようなものが必要です.
    openjdk 17.0.1 2021-10-19 LTS
    OpenJDK Runtime Environment Corretto-17.0.1.12.1 (build 17.0.1+12-LTS)
    OpenJDK 64-Bit Server VM Corretto-17.0.1.12.1 (build 17.0.1+12-LTS, mixed mode, sharing)
    
    このJava問題の研究に感謝します;
    専用のユーザが欲しいです.
    sudo adduser minecraft
    
    Minecraftをインストールするには、Minecraftサーバーページに依存できますhere .
    例えば、バージョン2.0の1.17.1 次のコマンドを実行できます.
    sudo su
    mkdir /opt/minecraft/
    mkdir /opt/minecraft/server/
    cd /opt/minecraft/server
    wget https://launcher.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar
    sudo chown -R minecraft:minecraft /opt/minecraft/
    

    ⚠️ Warning regarding Java version:
    It seems that starting with Minecraft 1.17, it require now a Java JRE 16 (instead of Java JRE 8).
    This site is giving you links to download older Minecraft versions if needed.


    Exception in thread "main" java.lang.UnsupportedClassVersionError: net/minecraft/server/Main has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    
    私は少しのサービスを手動でサーバーを起動を避けるために作成している.私はサーバーを起動するとすぐにminecraftプロセスを開始したい.
    それをするために、私は下にファイルを作成しました/etc/systemd/system/minecraft.service 次のコンテンツを使用します.
    [Unit]
    Description=Minecraft Server
    After=network.target
    
    [Service]
    User=minecraft
    Nice=5
    KillMode=none
    SuccessExitStatus=0 1
    InaccessibleDirectories=/root /sys /srv /media -/lost+found
    NoNewPrivileges=true
    WorkingDirectory=/opt/minecraft/server
    ReadWriteDirectories=/opt/minecraft/server
    ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar server.jar nogui
    ExecStop=/opt/minecraft/tools/mcrcon/mcrcon -H 127.0.0.1 -P 25575 -p strong-password stop
    
    [Install]
    WantedBy=multi-user.target
    
    次に、次の手順に従って新しいサービスをお勧めします.
    chmod 664 /etc/systemd/system/minecraft.service
    systemctl daemon-reload
    
    システムの詳細についてhere .

    Now if you restart the EC2 instance a Minecraft server must be available! You can check ✅ this first step!

    I am not speaking of the fact that the IPv4 is dynamic by default. I recommend to setup an static Elastic IP for this server (here!) in order to get a static IP.


    ビルドスタートシナリオ


    まず、ラムダ関数を作成しましょう.ラムダに入りCreate function 新しいものを作る.名前mc_start を使用するNode.js 14.x 以上のランタイム.
    次に、このタイプのスクリーンを持たなければなりません.

    内容を置き換えるindex.js 以下のファイルを指定します.
    const AWS = require("aws-sdk");
    var ec2 = new AWS.EC2();
    
    exports.handler = async (event) => {
      try {
        var result;
        var params = {
          InstanceIds: [process.env.INSTANCE_ID],
        };
        var data = await ec2.startInstances(params).promise();
        result = "instance started"
    
        const response = {
          statusCode: 200,
          body: result,
        };
        return response;
      } catch (error) {
        console.error(error);
        const response = {
          statusCode: 500,
          body: "error during script",
        };
        return response;
      }
    };
    
    設定で次のように設定します.
  • 環境変数を追加INSTANCE_ID MinecraftサーバのインスタンスIDに対応する値を指定しますi-031fdf9c3bafd7a34 ).
  • ロールパーミッションには以下のようなEC 2インスタンスを起動する権限が含まれていなければなりません.

  • 簡単な電子メールサービスでは、新しいルールを設定する時間ですEmail Receiving セクション

    クリックCreate rule 内部default-rule-set . 電子メール受信機能は、今日3つの領域でのみ利用可能です注意してくださいus-east-1 , us-west-2 and eu-west-1 ソースhere ).
    SESがこの特定のアイデンティティに電子メールを受け取っているならば

    ラムダ関数を呼び出します.

    You must add the domain to the Verified identities to make this work. It's also necessary to publish an MX entry in order to declare SES as the email receiver for a specific domain or subdomain (more info here).


    ビルドストップシナリオ


    今回は8 h後にインスタンスを停止します.これは単純なラムダ関数です.
    まず、ラムダ関数を作成しましょう.ラムダに入りCreate function 新しいものを作る.名前mc_shutdown を使用するNode.js 14.x 以上のランタイム.
    内容を置き換えるindex.js 以下のファイルを指定します.
    const AWS = require("aws-sdk");
    var ec2 = new AWS.EC2();
    
    exports.handler = async (event) => {
      try {
        var result;
        var params = {
          InstanceIds: [process.env.INSTANCE_ID],
        };
        var data = await ec2.describeInstances(params).promise();
        var instance = data.Reservations[0].Instances[0];
    
        if (instance.State.Name !== "stopped") {
          var launch_time = new Date(instance.LaunchTime);
          var today = new Date();
          result = "instance running";
          if ((today - launch_time) / 3600000 > process.env.MAX_HOURS) {
            console.log("stopping the instance...");
            var stop_data = await ec2.stopInstances(params).promise();
            result = "instance stopped";
          }
        } else {
          result = "instance not running";
        }
        const response = {
          statusCode: 200,
          body: result,
        };
        return response;
      } catch (error) {
        console.error(error);
        const response = {
          statusCode: 500,
          body: "error during script",
        };
        return response;
      }
    };
    
    
    設定で次のように設定します.
  • 環境変数を追加INSTANCE_ID MinecraftサーバのインスタンスIDに対応する値を指定しますi-031fdf9c3bafd7a34 ).
  • 環境変数を追加MAX_HOURS 起動後に許可された時間数に対応する値8 8時間).
  • ロールパーミッションには以下のようなEC 2インスタンスを起動する権限が含まれていなければなりません.

  • 我々は、20分ごとにタスクを起動するトリガを追加します

    Hurrayの設定が行われます!

    結論


    このセットアップはここでうまく動作しています、彼が彼が必要なとき、彼がインスタンスを始めるので、私の息子は幸せです.私は、このサービスの多くのコストを削減するので、私は幸せです.最後の3ヶ月間、私はこのサーバーのEC 2計算コストが1😅 (最適化の前に約17 US $)ので、95 %安い!
    現在の設定は、手動では、コンソールで行われ、私はいくつかの時間を1日を変更するには、例えばCDK toolkit .
    また、おそらく、おそらくMeBRATワールドのストレージを管理することは可能です.
    それは非常に楽しいプロジェクトを複数のAWSサービスを使用して構築することでした!ラムダ関数を使用して動的ブートEC 2インスタンスの他の用途を参照してください.コメントで知らせてください!