Hallo. Ich bin ein Yin-Yang-Student. Als Student sind meine Freunde nur online. Deshalb spiele ich oft Online-Spiele. Diesmal ist die Geschichte.
Als Student lebe ich in einer Genossenschaftswohnung. Selbst wenn ich einen Server einrichte, kann ich den Port nicht öffnen und nicht spielen. Daher richte ich normalerweise einen Server mit EC2 von AWS ein.
Es wäre sehr praktisch, wenn dieser Server über das Voice-Chat-Tool Discord gestartet und gestoppt werden könnte.
Dann ist die Einführung länger geworden, aber bitte.
--__ discord-bot EC2 t2.micro Instanz __ --__ Spieleserver EC2 t2.large Instanz __
Der Umriss des Systems sieht so aus. Der Punkt hier ist
Weil ich kein Geld habe. Zum Ausführen des Minecraft-Servers ist mindestens t2.large Leistung (8 GB Speicher) erforderlich. Der Bot von Discord muss jedoch ständig aktiv sein, und das teurere t2.large kann nicht immer gestartet werden.
Viele Leute haben erklärt, wie man eine EC2-Instanz startet, deshalb werde ich sie weglassen.
discord-bot Instanztyp: t2.micro Eingehende Regel: Keine Bearbeitung OK (nur SSH 22-Port) Konsole: AWS-Befehle können verwendet werden
Der Discord BOT verwendet discord.py. Der Grund für Python ist, dass es mir gefällt. ..
game-server Instanztyp: t2.large Eingehende Regel: TCP25565-Port hinzugefügt (für Minecraft)
Informationen zum Erstellen finden Sie unter hier. Notieren Sie sich das Zugriffstoken.
Arbeiten Sie mit der __discord-bot-Instanz __. Führen Sie die folgenden Schritte in dem über SSH verbundenen Terminal aus.
python3 -m pip install -U discord.py
Schreiben Sie den Hauptquellcode. Starten Sie diesmal den Server, wenn "$ start minecraft" eingegeben wird, und stoppen Sie den Server, wenn "$ stop minecraft" eingegeben wird.
import discord
import subprocess
import paramiko
import time
#Ersetzen Sie durch den Zugriffstoken Ihres Bots
TOKEN = 'your access token'
# game-Bitte geben Sie die Instanz-ID des Servers an
INSTANCEID = 'your instance id'
#Generieren Sie die für die Verbindung benötigten Objekte
client = discord.Client()
# ***************************
# ***Verarbeitungsfunktion
# ***************************
class DiscordBOT:
def __init__(self, client):
self.SSHClient = None
async def main(self, discord_event):
get_text = discord_event.content
send_text = ""
if "$start minecraft" in get_text:
#Instanz starten
subprocess.call("aws ec2 start-instances --instance-ids {}".format(INSTANCEID), shell=True)
time.sleep(3)
#Warten Sie, bis die Instanz gestartet wird
subprocess.call("aws ec2 wait instance-running --instance-ids {}".format(INSTANCEID), shell=True)
time.sleep(3)
#Rufen Sie die IP-Adresse der Instanz ab
proc = subprocess.run(["aws ec2 describe-instances --instance-ids {} --query 'Reservations[*].Instances[*].PublicIpAddress' --output text".format(INSTANCEID)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
ip_add = proc.stdout.decode("utf-8")
ip_add = ip_add.replace(".", "-").replace("\n", "")
self.server_ip = ip_add
time.sleep(3)
#Erstellen Sie einen SSH-Verbindungsclient
self.SSHClient = paramiko.SSHClient()
self.SSHClient.set_missing_host_key_policy(paramiko.WarningPolicy())
self.SSHClient.connect('ec2-{}.compute-1.amazonaws.com'.format(ip_add), username='root', password='')
time.sleep(2)
#Starten Sie den Minecraft-Server mit SSH
stdin, stdout, stderr = self.SSHClient.exec_command("java -Xmx4096M -Xms4096M -jar server.jar nogui")
for x in stdout:
print(x)
for x in stderr:
print(x)
time.sleep(2)
#Senden Sie die IP-Adresse für die Verbindung an discord
send_text = "Sie haben die Instanz erfolgreich gestartet und eine Verbindung zum Minecraft-Server hergestellt.\n Nach dem Starten des Servers{}Sie können sich mit verbinden".format(ip_add.replace("-", "."))
elif "$stop minecraft" in get_text:
#Stoppen Sie den Server
self.SSHClient.connect('ec2-{}.compute-1.amazonaws.com'.format(ip_add), username='root', password='')
time.sleep(2)
stdin, stdout, stderr = self.SSHClient.exec_command("stop")
self.SSHClient.close()
#Instanz stoppen
subprocess.call("aws ec2 stop-instances --instance-ids {}".format(INSTANCEID), shell=True)
send_text = "Der Serverstopp ist abgeschlossen."
if send_text:
await discord_event.channel.send(send_text)
discordbot = DiscordBOT(client)
@client.event
async def on_ready():
print('Sie sind jetzt angemeldet')
# on get message
@client.event
async def on_message(message):
if message.author.bot:
return
await discordbot.main(message)
#Starten Sie Bot und stellen Sie eine Verbindung zum Discord-Server her
client.run(TOKEN)
Führen Sie dies auf EC2 aus und Sie sind fertig.
nohup python3 main.py &
Sie müssen Java installieren. Weitere Informationen finden Sie unter hier.
Speichern Sie außerdem das Minecraft-Serverskript (server.jar) im Home-Verzeichnis des Root-Benutzers.
Da die SSH-Verbindung über die Authentifizierung mit öffentlichem Schlüssel hergestellt wird, nehmen Sie die Einstellungen dort vor. Es gibt hier bereits einen Artikel, daher werde ich ihn vorstellen.
So melden Sie sich zwischen EC2-Instanzen ohne SSH-Kennwort an
Ein Fernstart mit dem Befehl aws ist derzeit nicht möglich. Sie müssen also jede in dieselbe Sicherheitsgruppe einordnen, um dies zuzulassen.
Wählen Sie Zuweisen / Ersetzen __ für diese __IAM-Rolle
Fügen Sie nach dem Erstellen einer neuen IAM-Rolle jede Instanz derselben IAM-Rolle hinzu, und Sie können loslegen.
Es hat sicher funktioniert. Ich bin glücklich.