[PYTHON] L'histoire du lancement d'un serveur Minecraft depuis Discord

introduction

Bonjour. Je suis un étudiant du Yin-Yang. En tant qu'étudiant, mes amis sont uniquement en ligne. Par conséquent, je joue souvent à des jeux en ligne. Cette fois, c'est l'histoire.

En tant qu'étudiant, je vis dans un appartement coopératif, donc même si j'installe un serveur, je ne peux pas ouvrir le port et ne peux pas jouer. Par conséquent, je configure généralement un serveur avec EC2 d'AWS.

Ce serait très pratique si ce serveur pouvait être démarré et arrêté à partir de l'outil de chat vocal Discord.

Ensuite, l'introduction est devenue plus longue, mais s'il vous plaît.

Se préparer à EC2

Aperçu

image.png

--__ instance de discord-bot EC2 t2.micro __ --__ instance t2.large du serveur de jeu EC2 __

Le contour du système ressemble à ceci. Le point ici est

--Deux instances préparées pour la réponse discord et le serveur

Raisons d'avoir deux instances

Parce que je n'ai pas d'argent. Au moins des performances t2.large (8 Go de mémoire) sont nécessaires pour exécuter le serveur minecraft. Cependant, le bot Discord doit être actif tout le temps et le plus cher t2.large ne peut pas toujours être lancé.

Paramètres d'instance

De nombreuses personnes ont expliqué comment démarrer une instance EC2, je vais donc l'omettre.

discord-bot Type d'instance: t2.micro Règle entrante: aucune modification OK (port SSH 22 uniquement) Console: les commandes AWS peuvent être utilisées

Le Discord BOT utilise discord.py. La raison de Python est que je l'aime. ..

game-server Type d'instance: t2.large Règle entrante: port TCP25565 ajouté (pour Minecraft)

la mise en oeuvre

Créer un compte de bot discord

Veuillez vous référer à ici pour le créer. Notez le jeton d'accès.

Créer un discord-bot

Travaillez avec l'instance __discord-bot __. Exécutez ce qui suit dans le terminal connecté par SSH.

python3 -m pip install -U discord.py

Écrivez le code source principal. Cette fois, démarrez le serveur lorsque $ start minecraft est entré, et arrêtez le serveur lorsque $ stop minecraft est entré.



import discord
import subprocess
import paramiko
import time

#Remplacez par le jeton d'accès de votre bot
TOKEN = 'your access token'
# game-Veuillez spécifier l'ID d'instance du serveur
INSTANCEID = 'your instance id'

#Générer les objets nécessaires à la connexion
client = discord.Client()

# ***************************
# ***Fonction de traitement
# ***************************
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:
            #Instance de lancement
            subprocess.call("aws ec2 start-instances --instance-ids {}".format(INSTANCEID), shell=True)
            time.sleep(3)

            #Attendez que l'instance démarre
            subprocess.call("aws ec2 wait instance-running --instance-ids {}".format(INSTANCEID), shell=True)
            time.sleep(3)

            #Obtenez l'adresse IP de l'instance
            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)

            #Créer un client de connexion SSH
            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)
            
            #Démarrez le serveur minecraft avec 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)

            #Envoyez l'adresse IP de connexion à Discord
            send_text = "Vous avez lancé avec succès l'instance et vous êtes connecté au serveur minecraft.\n Après le démarrage du serveur{}Vous pouvez vous connecter avec".format(ip_add.replace("-", "."))

        elif "$stop minecraft" in get_text:
            #Arrêtez le serveur
            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()

            #Arrêter l'instance
            subprocess.call("aws ec2 stop-instances --instance-ids {}".format(INSTANCEID), shell=True)
            send_text = "L'arrêt du serveur est terminé."

        if send_text:
            await discord_event.channel.send(send_text)


discordbot = DiscordBOT(client)

@client.event
async def on_ready():
    print('Vous êtes maintenant connecté')

# on get message
@client.event
async def on_message(message):
    if message.author.bot:
        return

    await discordbot.main(message)

#Lancez Bot et connectez-vous au serveur Discord
client.run(TOKEN)

Exécutez ceci sur EC2 et vous avez terminé.

nohup python3 main.py &

paramètres du serveur de jeu

Vous devez installer java. Veuillez consulter ici.

En outre, enregistrez le script du serveur minecraft (server.jar) dans le répertoire personnel de l'utilisateur racine.

De plus, comme la connexion SSH est établie à l'aide de l'authentification par clé publique, définissez-y les paramètres. Il y a déjà un article ici, je vais donc le présenter.

Comment se connecter entre des instances EC2 sans mot de passe SSH

Paramètres du groupe de sécurité

En l'état, le démarrage à distance par la commande aws n'est pas possible. Vous devez donc mettre chacun dans le même groupe de sécurité pour l'autoriser.

image.png

Sélectionnez Attribuer / Remplacer __ pour ce rôle __IAM

image.png

Après avoir créé un nouveau rôle IAM, ajoutez chaque instance au même rôle IAM et vous êtes prêt à partir.

résultat

daw.png

image.png

Cela a fonctionné en toute sécurité. Je suis heureux.

Recommended Posts

L'histoire du lancement d'un serveur Minecraft depuis Discord
L'histoire du remontage du serveur d'application
L'histoire de l'exportation d'un programme
L'histoire du champ de modèle Django disparaissant de la classe
L'histoire du traitement A du blackjack (python)
Une histoire sur l'exploitation d'une instance GCP à partir de Discord
L'histoire de la création d'un générateur d'icônes mel
Histoire de passer de Pipenv à la poésie
L'histoire de sys.path.append ()
Connexion SSH au serveur cible à partir de Windows en un clic sur un raccourci
Une histoire qui réduit l'effort de fonctionnement / maintenance
Calculer le volume à partir de la structure bidimensionnelle d'un composé
Créez un BOT qui raccourcit l'URL Discord
Points Python du point de vue d'un programmeur en langage C
L'histoire de la création d'un réseau neuronal de génération musicale
Une histoire sur le changement du nom principal de BlueZ
Le problème Zip 4 Gbyte est une histoire du passé
Une histoire qui a analysé la livraison de Nico Nama.
Branchez les commandes sur le serveur Micra à partir du chat textuel Discord
L'histoire du passage de WoSign à Let's Encrypt pour un certificat SSL gratuit
L'histoire de la construction de Zabbix 4.4
L'histoire de la création d'un canal VIP dans le chatwork en interne
Différent du type d'importation de python. Signification de depuis A import B
Trouvé la cause de la communication mystérieuse du serveur Minecraft (Spigot)
L'histoire de la copie de données de S3 vers TeamDrive de Google
Créer un diagramme de corrélation à partir de l'historique des conversations de Twitter
Après tout, l'histoire du retour de Linux à Windows
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
L'histoire de la création d'un bot de boîte à questions avec discord.py
Une histoire sur un débutant de GCP essayant de créer un serveur Micra avec GCE
Script Python qui peut vérifier l'état du serveur à partir du navigateur
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
L'histoire de Python et l'histoire de NaN
Une histoire sur la prédiction des préfectures à partir des noms de villes avec Jubatus
L'histoire de la participation à AtCoder
Une formule qui calcule simplement l'âge à partir de la date de naissance
Existence du point de vue de Python
L'histoire de la création d'un pilote standard pour db avec python.
[Python] Obtenir la date de mise à jour d'un article d'actualité à partir de HTML
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
L'histoire du "trou" dans le fichier
L'histoire de la création d'un module qui ignore le courrier avec python
Meilleur 3 des impressions de la lecture du nouveau manuel de programmation shell
Configurer un serveur SMTP factice avec Python et vérifier le fonctionnement de l'envoi depuis Action Mailer
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
L'histoire d'un capteur de stationnement en 10 minutes avec le kit de démarrage GrovePi +
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
L'histoire d'une personne qui a commencé à viser un data scientist depuis un débutant
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
Parlez de la probabilité d'évasion d'une marche aléatoire sur une grille entière
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
Obtenez le salaire moyen d'un emploi avec des conditions spécifiées sur Indeed.com
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
L'histoire d'essayer de reconnecter le client