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.
--__ 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
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é.
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)
Veuillez vous référer à ici pour le créer. Notez le jeton d'accès.
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 &
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
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.
Sélectionnez Attribuer / Remplacer __ pour ce rôle __IAM
Après avoir créé un nouveau rôle IAM, ajoutez chaque instance au même rôle IAM et vous êtes prêt à partir.
Cela a fonctionné en toute sécurité. Je suis heureux.
Recommended Posts