X

Déployer l’infrastructure de Minecraft | par Lorenzo Coacci


image par auteur | Logos AWS et Terraform

En jouant à Minecraft un dimanche après-midi, une idée aléatoire m’est venue à l’esprit : “Puis-je utiliser Terraform de Minecraft ?” À l’époque, j’apprenais Terraform, et mon obsession pour cela m’a amené à la création de ce projet de week-end. Maintenant, vous vous demandez probablement pourquoi j’essaierais quelque chose comme ça, et voici les raisons :

  • C’est marrant!
  • C’est une façon sympa d’apprendre Docker, docker-compose et Terraform !

Si vous êtes convaincu que c’est assez cool 😎, permettez-moi de vous présenter brièvement les outils que nous utiliserons avant de plonger dans le projet proprement dit.

Voici le repo pour le lecteur impatient : https://github.com/lollococce/terracraft. Suivez les instructions écrites dans le README.md pour commencer à utiliser Terraform du monde Minecraft !

  • Minecraft [Required! Java Edition: Here]: Minecraft est un jeu vidéo incroyablement populaire développé par Mojang Studios qui vous permet de créer, de vivre et d’expérimenter dans un monde virtuel composé de blocs cubiques. Nous utiliserons l’édition Java PC pour ce projet, mais vous devriez (en théorie) pouvoir également la répliquer pour l’édition Bedrock.
  • Docker [Required! Docker Desktop: Here]: Docker est une plate-forme ouverte pour le développement, la livraison et l’exécution d’applications. Docker vous permet de séparer vos applications de votre infrastructure pour fournir rapidement des logiciels [1]. Téléchargez et installez l’application Docker Desktop sur votre PC.
  • docker-composer [Required! Installation guide: Here]: docker-compose est un outil permettant de définir et d’exécuter des applications Docker multi-conteneurs. Avec Compose, vous utilisez un fichier YAML pour configurer les services de votre application. Ensuite, avec une seule commande, vous créez et démarrez tous les services de votre configuration [2]. Suivez le guide d’installation pour l’installer localement depuis votre terminal.
  • Robinet [Am using v1.19]: Spigot est un serveur Minecraft optimisé pour les performances avec des fonctionnalités supplémentaires, telles que des plugins personnalisés. Nous l’utiliserons pour héberger une version modifiée de Minecraft sur notre localhost afin d’interagir avec Terraform via un plugin personnalisé.
  • Terraforme: Terraform est un outil HashiCorp pour provisionner l’infrastructure en tant que code (IaC). Il vous permet de déployer des serveurs, des bases de données, etc., à partir d’un fichier .tf, en convertissant votre code en appels d’API vers un service cloud.
  • AWS: Nous utiliserons AWS pour cet exemple spécifique, mais n’hésitez pas à utiliser le service cloud de votre choix.

Une fois que vous avez installé Docker et docker-compose, vous devriez pouvoir vérifier sur votre terminal s’ils sont disponibles :

$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
$ docker --version
Docker version 20.10.12, build e91ed57

Si une erreur apparaît, vérifiez que votre Docker Engine est en cours d’exécution ; vous pouvez le faire en ouvrant l’application de bureau Docker. Cela démarrera automatiquement le service docker. Vous pouvez réessayer les commandes bash ci-dessus pour confirmer que tout fonctionne.

Si Docker et docker-compose sont correctement configurés, vous pouvez télécharger le code source depuis mon référentiel pour démarrer officiellement le projet.

$ git clone https://github.com/lollococce/terracraft$ cd ./terracraft

À l’intérieur du référentiel, vous trouverez un Dockefile, un docker-compose.yml et un dossier de données avec des plugins et des paramètres de serveur.

En tant qu’image Docker pour notre Dockerfile, nous utilisons une image bien connue : https://github.com/itzg/docker-minecraft-server [3] (cela nous permet de lancer un serveur Spigot facilement). En l’utilisant comme image de base, nous pouvons l’étendre pour installer Git et Terraform sur le serveur.

Voici comment notre Dockerfile étend l’image d’itzg :

#
# Extended from itzg/minecraft-server:latest
#
# Copyright on itzg/minecraft-server:latest
# of itzg (https://github.com/itzg)
#
FROM itzg/minecraft-server:latest
# Install Git
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends git wget unzip gnupg software-properties-common
# Install Terraform
RUN wget --quiet https://releases.hashicorp.com/terraform/1.2.1/terraform_1.2.1_linux_amd64.zip \ && unzip terraform_1.2.1_linux_amd64.zip \ && mv terraform /usr/bin \ && rm terraform_1.2.1_linux_amd64.zip
# Check if working
RUN terraform -help

Maintenant, regardons plutôt le fichier docker-compose.yml ! Nous montons le dossier de données présent dans le référentiel en tant que volume pour le conteneur :

version: "3.8"
services:
minecraft:
# Using . to use the local ./Dockerfile
build: "."
ports:
- "25565:25565"
- "4711:4711"
- "8123:8123"
environment:
# + + + + + [START] WORLD SETTINGS + + + + +
# - - - World Type - - -
# Custom World (Use a custom Seed or a world from a ZIP)
#WORLD: "https://download1460.mediafire.com/5epwuydu5fmg/35a7iustexizbrc/World+of+worlds+3.9.zip"
#SEED: "-1785852800490497919"
#GUI: FALSE
# - - - World Settings - - -
MAX_PLAYERS: 50
MAX_WORLD_SIZE: 10000
ALLOW_NETHER: "TRUE"
ENABLE_COMMAND_BLOCK: "TRUE"
HARDCORE: "FALSE"
SNOOPER_ENABLED: "FALSE"
SPAWN_ANIMALS: "TRUE"
SPAWN_MONSTERS: "TRUE"
SPAWN_NPCS: "TRUE"
SPAWN_PROTECTION: 0
VIEW_DISTANCE: 10
GENERATE_STRUCTURES: "TRUE"
FORCE_GAMEMODE: "FALSE"
DIFFICULTY: "peaceful"
MODE: "survival"
LEVEL_TYPE: "DEFAULT"
# + + + + + [END] WORLD SETTINGS + + + + +

# + + + + + [START] SERVER SETTINGS + + + + +
# - - - Server Type - - -
# Use SPIGOT server type + install Plugins
TYPE: SPIGOT
SPIGET_RESOURCES: 22724,34315,51944
# Server Title
MOTD: "A §l§cSpigot§r §nserver with Terraform"
# Custom Server Icon
#OVERRIDE_ICON: "TRUE"
#ICON: ""

# - - - Settings - - -
# THIS HAS TO BE TRUE!
EULA: "TRUE"
ENABLE_ROLLING_LOGS: "TRUE"
TZ: "Europe/Rome"
# + + + + + [END] SERVER SETTINGS + + + + +

# + + + + + [START] CLOUD CREDS + + + + +
# (Credentials for Could)
# AWS Creds and config
AWS_ACCESS_KEY_ID: "INSERT_HERE_YOUR_KEY"
AWS_SECRET_ACCESS_KEY: "INSER_HERE_YOUR_SECRET"
AWS_DEFAULT_REGION: "YOUR REGION (ex us-east-1)"
# + + + + + [END] CLOUD CREDS + + + + +

volumes:
- ./data:/data
volumes:
data: {}

Comme vous pouvez le voir ci-dessus, nous pouvons modifier les paramètres du monde avec des variables d’environnement et télécharger un monde Minecraft personnalisé à partir d’un fichier Seed ou Zip. Les variables d’informations d’identification cloud seront utilisées par Terraform pour se connecter au service cloud de votre choix. Parce que j’ai choisi AWS pour ce projet, je transmets les variables d’environnement par défaut AWS au conteneur que Terraform recherchera lors du déploiement (n’oubliez pas de créer un utilisateur IAM avec les autorisations appropriées).

Pour exécuter Terraform depuis Minecraft, nous utilisons Bashful, un plugin qui nous permet d’exécuter des commandes bash et de prendre le contrôle du terminal du serveur depuis le chat de Minecraft.

D’ACCORD! Tout est mis en place. Nous pouvons maintenant exécuter ce qui suit :

$ cd ./terracraft
$ docker-compose up

Vous devriez voir quelque chose comme ceci sur votre terminal :

Pour exécuter le conteneur en arrière-plan, vous pouvez décider d’exécuter à la place :

$ docker-compose up -d

Attendez quelques minutes que le conteneur installe les ressources et soit pleinement opérationnel.

Pour vérifier si votre conteneur s’exécute localement, vous pouvez ouvrir votre application de bureau Docker. Il devrait afficher votre conteneur Minecraft comme “RUNNING”, comme indiqué ci-dessous :

Enfin, vous pouvez vous connecter au serveur depuis votre application Minecraft ! Lancez Java Minecraft Edition sur votre ordinateur portable et sélectionnez “Multijoueur”.

Vous devriez voir un bouton “Ajouter un serveur”. Cliquez dessus!

Utilisez ‘localhost’ comme adresse de serveur et mettez le nom que vous préférez comme nom de serveur.

Si vous avez correctement configuré et exécuté votre conteneur Minecraft, vous devriez voir un serveur apparaître dans la liste des serveurs. Cliquez sur l’image pour la rejoindre !

Bravo! Vous êtes enfin sur un serveur Minecraft exécuté sur votre hôte local en tant que conteneur Docker.

Pour commencer à exécuter Terraform, nous devons d’abord vérifier que le plugin que nous avons installé (Bashful) est entièrement fonctionnel. Pour le tester, nous devons attribuer un type spécial d’accès utilisateur appelé op à notre joueur Minecraft. Parce que, par défaut, un utilisateur rejoignant le serveur ne fait pas partie de ce groupe d’utilisateurs, nous devons exécuter la commande ci-dessous sur le terminal.

N’oubliez pas d’utiliser votre ID de conteneur en tant que (vous pouvez le récupérer en utilisant le docker ps commande), et le nom de votre joueur Minecraft en tant que .

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<CONTAINER_ID (e.g. 2cbc269c566f)> minecraft_minecraft "/start" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:4711->4711/tcp, 0.0.0.0:8123->8123/tcp, 0.0.0.0:25565->25565/tcp, 25575/tcp minecraft_minecraft_1
$ docker exec <YOUR_CONTAINER_ID> mc-send-to-console op <YOUR_PLAYER_NAME>

Cela exécute une commande Minecraft sur le terminal du conteneur qui met à niveau l’autorisation de l’utilisateur dans le jeu. Un message indiquant “[Server: Made <YOUR_PLAYER_NAME> a server operator]” devrait apparaître immédiatement après l’exécution de bash, invité dans les journaux de jeu.

Maintenant, lançons notre première commande bash avec Minecraft (c’est pas cool ? !). Presse t pour activer le chat de Minecraft et tapez ce qui suit :

/bashful echo hello world

Vous devriez voir le journal en jaune dans votre chat avec le résultat de la commande !

Essayons avec Terraform !

/bashful terraform --help

La sortie ci-dessous devrait apparaître à l’écran :

Si vous configurez vos informations d’identification AWS dans le fichier docker-compose.yml, vous pouvez utiliser l’exemple que j’ai inclus dans le référentiel pour déployer une instance EC2 sur AWS.

# First Initialize TF:
/bashful terraform -chdir=home/terraform/ec2 init
# Wait until you can read in green "Execution finished successfully"# Verify that you have a functioning connection with your cloud service and what you are planning to deploy:
/bashful terraform -chdir=home/terraform/ec2 plan -out=tfplan
# Apply and deploy the Ec2 instance:
/bashful terraform -chdir=home/terraform/ec2 apply -auto-approve
# wait creation of cloud resources

Enfin, vérifiez votre compte AWS pour voir que l’instance EC2 est en cours d’exécution !

Félicitations !🍾

Vous venez de lancer un serveur EC2 de Minecraft ! (À quel point cela est cool!?)

Pour détruire votre infrastructure, vous pouvez exécuter ce qui suit :

# To Destroy the Infrastructure created
/bashful terraform -chdir=home/terraform/ec2 destroy -auto-approve

N’hésitez pas à jouer avec les blocs de commande dans Minecraft pour rendre le projet encore plus intéressant. Ces blocs peuvent exécuter les commandes ci-dessus s’ils sont déclenchés par un événement Minecraft, comme activer un levier, appuyer sur un bouton ou interagir avec un composant Red Stone. Laissez libre cours à votre imagination.

Rappelez-vous, c’est un outil pour jouer. Les journaux Bash sont désordonnés et difficiles à lire, et il existe des bonnes pratiques lors de la création d’un serveur CI/CD pour une véritable infrastructure Terraform en termes de productivité et de sécurité, mais qui sait ?

Peut-être pourrions-nous repenser la façon dont nous visualisons au moins une partie des outils DevOps dans un monde métaverse.

Merci d’avoir lu! Amusez-vous!

Laurent

  • Utilisez des blocs de commande pour lancer un serveur lorsqu’un bouton Minecraft est enfoncé
  • Utilisez le plugin Bashful pour envoyer des messages à Slack avec un bouton Minecraft
  • Créez un plugin personnalisé juste pour Terraform au lieu d’utiliser Bashful
  • Créer un plugin pour représenter l’infrastructure cloud sous forme de structures/blocs Minecraft (en utilisant le .tfstate)
  1. https://docs.docker.com/get-started/overview/
  2. https://docs.docker.com/compose/
  3. https://github.com/itzg/docker-minecraft-server