[PYTHON] Une histoire sur l'exploitation d'une instance GCP à partir de Discord

introduction

Cet article est la suite de Une histoire sur un débutant GCP construisant un serveur Micra avec GCE. Si vous ne l'avez pas vu la dernière fois, j'apprécierais que vous puissiez le voir à partir de là.

Au fait, depuis que j'ai construit un serveur Micra avec GCP la dernière fois, Cette fois, j'aimerais pouvoir l'exploiter à partir de la discorde.

Y a-t-il un mérite à exploiter l'instance à partir de la discorde? Je pense, Demandez à quelqu'un qui joue Micra avec vous de rejoindre la chaîne Discord Puisqu'il peut être démarré et arrêté au nom de l'administrateur, la charge de travail de l'administrateur peut être réduite.

Cible

--Création d'un serveur pour bot --Créer un compte de service pour le contrôle d'instance --Créer Discord Bot

procédure

1. Création d'un serveur pour bot

Le serveur utilisé pour le bot cette fois est Google Compute Engine (GCE). GCE dispose de ressources Always Free qui sont totalement gratuites et cette fois, nous les utiliserons. Comme il est toujours gratuit, vous ne serez pas facturé même s'il est toujours en cours d'exécution, et cette fois, il n'y a aucune utilisation autre que le bot, donc cette ressource est suffisante pour le fonctionnement.

Pour plus d'informations sur Always Free de GCE, veuillez consulter le document officiel ci-dessous.

Version gratuite de Google Cloud

L'instance a été créée avec de tels paramètres. Les paramètres détaillés seront omis cette fois.

article Contenu
Nom de l'instance botserver
Région us-west1
zone us-west1-a
Type de machine f1-micro(vCPUx1,Mémoire 0.6GB)
Disque de démarrage CentOS 7
adresse IP Créer une adresse IP statique

2. Créez un compte de service pour le contrôle d'instance

Vous pouvez créer un compte de service dans GCP avec uniquement certaines autorisations pour accéder aux projets et aux ressources. Pour plus d'informations sur les comptes de service, veuillez consulter la documentation officielle ci-dessous.

À propos des comptes de service

Cette fois, donnez à ce compte de service l'autorisation de démarrer et d'arrêter l'instance (serveur Micra). Tout d'abord, créez un "rôle" à partir de "IAM et gestion".

Sélectionnez IAM & Administration-> Rôles-> Créer un rôle et configurez comme suit:

article Contenu
Titre Nom du titre arbitraire
Autorité compute.instances.get
compute.instances.start
compute.instances.stop

** [Description de l'autorité] **

article La description
compute.instances.get Autorisation de se connecter à une instance Compute Engine
compute.instances.start Autorisation de lancer une instance Compute Engine
compute.instances.stop Autorisation d'arrêter une instance Compute Engine

À ce stade, la création du «rôle» est terminée. Créez ensuite un "compte de service" à partir de "IAM et administration".

Sélectionnez "IAM et administration" -> "Compte de service" -> "Créer un compte de service" et définissez comme suit.

article Contenu
Nom du compte de service Tout nom de compte de service
ID de compte de service Tout identifiant de compte de service@{ProjectID}.iam.gserviceaccount.com
Description du compte de service Écrivez une description pour votre propre compréhension
Sélection de rôle Le "rôle" créé précédemment
Créer une clé Type JSON
*Cliquez sur Créer pour télécharger le fichier json.

Veuillez ne pas perdre le fichier json que vous avez téléchargé lors de la création de la clé, car vous en aurez besoin plus tard.

3. Création d'un robot Discord

3.1 Créer un compte bot

Tout d'abord, créez un compte développeur pour votre bot sur le Discord Developer Portal.

Je me suis référé aux articles suivants pour divers paramètres depuis la création du compte développeur.

Guide d'initialisation du compte Discord Bot pour les développeurs

3.2 Paramètres du serveur bot

Connectez-vous à l'instance créée en 1. et définissez divers paramètres.

Tout d'abord, installez les packages requis.


#CentOS7 n'a pas installé python3 par défaut, donc installez python3.
$ yum install python3

# discord.Installer py
$ python3 -m pip install -U discord.py

Ensuite, authentifiez le compte de service que vous avez créé précédemment.


#Téléchargez le fichier de clé (fichier json) téléchargé lors de la création du compte de service sur le serveur de bot et authentifiez-vous avec la commande suivante.
$ gcloud auth activate-service-account --key-file "./<projectName>-xxxxxx.json"

#Vérifiez si le compte de service est actif.*OK si votre compte est actif
$ gcloud auth list

#Exemple d'exécution ci-dessous
---------------------------------------------------------------
ACTIVE  ACCOUNT
*       <Nom du compte de service>@<Nom du projet>.iam.gserviceaccount.com
---------------------------------------------------------------

Créer un programme de bot

mineserver-op.py



#Discord installé.Charger py
import discord
import os
import time

#Jeton d'accès pour votre bot
TOKEN = '<Jeton d'accès>'

client = discord.Client()

#Traitement qui fonctionne au démarrage
@client.event
async def on_ready():
    #Une notification de connexion sera affichée dans le terminal après le démarrage
    print('Yaho! Je me suis connecté!')
    print('/Vous pouvez vérifier la commande avec de l'aide')

#Traitement qui fonctionne lors de la réception d'un message
@client.event
async def on_message(message):
    #Ne pas traiter si l'expéditeur du message est Bot
    if message.author.bot:
        return
#Démarrez le serveur
    if message.content == '/start':
        await message.channel.send('Server starting up...')
        await message.channel.send('* N'exécutez pas d'autres commandes tant que «démarrage» n'est pas affiché. *')
        os.system('gcloud --account=<Nom du compte de service>@<Nom du projet>.iam.gserviceaccount.com compute instances start <Nom de l'instance> --project <Nom du projet> --zone <Nom de zone>')
        await message.channel.send('up .minecraft_server starting...')
        time.sleep(60)
        await message.channel.send('start up')
#Arrêtez le serveur
    if message.content == '/stop':
        await message.channel.send('Server is stopping')
        await message.channel.send('* N'exécutez pas d'autres commandes tant que "down" n'est pas affiché. *')
        os.system('gcloud --account=<Nom du compte de service>@<Nom du projet>.iam.gserviceaccount.com compute instances stop <Nom de l'instance> --project <Nom du projet> --zone <Nom de zone>')
        await message.channel.send('down')

#Voir aide
    if message.content == '/help':
        await message.channel.send('/start :Démarrez le serveur')
        await message.channel.send('/stop :Arrêtez le serveur') 

client.run(TOKEN)

Exécution du programme bot créé

#Assurez-vous de conserver le journal d'exécution et d'exécuter
$ nohup python3 mineserver-op.py > ./out.log &

À ce stade, vous pouvez faire fonctionner l'instance à partir de discord. Vérifions si vous pouvez réellement utiliser l'instance en tapant une commande de discord.

Résumé

Cette fois, nous n'avons implémenté que les fonctions minimales de démarrage et d'arrêt de l'instance, Il est possible de mettre en œuvre diverses fonctions en donnant l'autorité souhaitée au compte de service.

En aparté, j'ai joué un peu Micra dans ce test de fonctionnement. Depuis que je jouais, il y a eu beaucoup de nouveaux éléments et je voulais refaire Micra (rires).

Recommended Posts

Une histoire sur l'exploitation d'une instance GCP à partir de Discord
L'histoire du lancement d'un serveur Minecraft depuis Discord
Une histoire qui reflète l'activité Discord dans Slack Status
Une histoire sur la création d'un système d'exploitation compatible UNIX / Linux à partir de zéro
Une histoire sur un débutant de GCP essayant de créer un serveur Micra avec GCE
Une histoire rafraîchissante sur Slice en Python
Une histoire de mauvaise humeur sur Slice en Python
L'histoire de l'utilisation de la réduction de Python
Une histoire sur le passage d'un service Web développé personnellement d'un serveur de location à GCP (Google Cloud Platform)
Une histoire sur l'apprentissage automatique avec Kyasuket
Une histoire sur la création d'une chaîne anonyme avec Slack à partir de zéro connaissance
Une histoire sur Python pop and append
Une histoire d'essayer d'installer uwsgi sur une instance EC2 et d'échouer
Échapper à l'environnement virtuel de Python ~ Une histoire sur le fait d'être piégé dans un environnement virtuel que j'ai créé ~
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Une histoire accro aux variables globales et à la portée de Go
L'histoire de vouloir afficher des annonces liées à des articles sur Jubatus
Une histoire sur l'implémentation d'un écran de connexion avec django
Une histoire sur l'exécution de Python sur PHP sur Heroku
Une histoire sur la modification de Python et l'ajout de fonctions
Histoire de l'analyse de données par apprentissage automatique
Histoire de l'utilisation du jeton logiciel de Resona avec 1Password
Une histoire de prédiction du taux de change avec Deep Learning
L'histoire de la migration de l'intégralité du disque Linux via SSH
L'histoire de la création d'une partition de type Hanon avec Python
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Histoire autour de la maternelle, de l'école maternelle, du jardin d'enfants
Une histoire sur la difficulté à traiter en boucle 3 millions de données d'identification
L'histoire de la gestion de theano avec TSUBAME 2.0
Une histoire sur le changement du nom principal de BlueZ
Une histoire sur un débutant Linux passant LPIC101 en une semaine
Une histoire sur un débutant Linux mettant Linux sur une tablette Windows
Une histoire de trébucher sur PATH après l'installation d'anaconda