Tous mes enfants sont de grands fans de Minecraft et récemment mon fils m'a demandé de l'aider à configurer un serveur Minecraft pour pouvoir jouer en ligne avec ses amis. Évidemment, une option aurait été de créer une machine virtuelle et d’installer le serveur Minecraft dessus. Cependant, c'est une option assez coûteuse – à environ 30 £ par mois pour une machine virtuelle qui resterait inactive la plupart du temps.
Maintenant, bien sûr, dans Azure, une machine virtuelle peut être placée dans un état "arrêté de désallocation", pendant lequel vous n'êtes pas facturé pour le calcul. Mais lorsque vous redémarrez la machine virtuelle, vous attendez un certain temps avant de démarrer et vous obtiendrez une adresse IP différente, que mon fils devrait ensuite communiquer à tous ses amis.
Et c’est en fait un excellent cas d’utilisation pour les instances de conteneur Azure. Nous pouvons simplement demander à Azure de créer un conteneur exécutant le serveur Minecraft (en utilisant une image de serveur Minecraft de Docker Hub), de l'utiliser et de l'arrêter lorsque nous aurons terminé. Les conteneurs ACI démarrent et s’arrêtent rapidement, et nous pouvons leur attribuer un nom de domaine convivial qui restera identique à notre prochain démarrage. Et tant que nous mappons le dossier de données sur un partage de fichiers Azure Storage, tout l'état stocké sur le serveur sera conservé tant que notre conteneur ne sera pas en cours d'exécution. Cela réduit nos coûts au minimum.
Dans cet article, je vais vous montrer comment automatiser la création de toute l'infrastructure dont nous avons besoin avec le module Azure Az PowerShell. Normalement, ma préférence serait de faire cela avec la CLI Azure, mais je préfère le faire avec le module PowerShell, pour des raisons que j'expliquerai un peu plus tard.
Sommaire
Commencez avec Az PowerShell
Tout d'abord, si comme moi le module Az PowerShell vous est relativement nouveau, voici les commandes de base dont vous aurez besoin pour vous connecter, sélectionner votre abonnement et explorer vos groupes de ressources:
# connexion à Azure PowerShell
Connect-AzAccount
# voir quels abonnements sont disponibles
Get-AzContext -ListAvailable
# pour voir le nom de l'abonnement actuel
$ azContext = Get-AzContext
$ azContext.Subscription.Name
# sélectionnez l'abonnement que nous voulons utiliser
Set-AzContext -SubscriptionName "Mon abonnement Azure"
# voir quels groupes de ressources nous avons
Get-AzResourceGroup | sélectionnez ResourceGroupName
Maintenant, créons un groupe de ressources pour contenir les ressources que nous allons créer dans cette démo avec New-AzResourceGroup
:
# créer un groupe de ressources
$ resourceGroupName = "MinecraftTest"
$ location = "westeurope"
New-AzResourceGroup -Name $ resourceGroupName -Location $ location
Création d'un compte de stockage et d'un partage de fichiers
Pour garantir la persistance de l'état du serveur, nous devons créer un compte de stockage et un partage de fichiers au sein de ce compte de stockage. J'ai créé une fonction PowerShell appelée SetupStorage
qui utilise New-AzStorageCompte
créer un compte de stockage et New-AzStorageShare
créer un partage de fichiers. Je voulais que cette fonction soit idempotente et n'échoue pas si le compte de stockage et le partage existaient déjà, ce que j'ai fait en utilisant le Obtenir-
méthodes d'abord, avec le -ErrorAction SilentlyContinue
ensemble de drapeaux.
Une fois que nous avons vérifié la présence du compte de stockage et du partage de fichiers, nous devons obtenir la clé du compte de stockage avec Get-AzStorageAccountKey
et transformer cela en PSCredential
objet dont nous aurons besoin pour monter le partage en tant que volume sur notre conteneur.
fonction SetupStorage
param ( [string]$ StorageResourceGroupName,
[string]$ StorageAccountName,
[string]$ ShareName,
[string]$ Lieu)
# vérifier si le compte de stockage existe
$ storageAccount = Get-AzStorageAccount `
-ResourceGroupName $ StorageResourceGroupName `
-Name $ StorageAccountName `
-ErrorAction SilentlyContinue
if ($ storageAccount -eq $ null)
# créer le compte de stockage
$ storageAccount = New-AzStorageAccount `
-ResourceGroupName $ StorageResourceGroupName `
-Name $ StorageAccountName `
-SkuName Standard_LRS `
-Localisation $ Localisation
# vérifier si le partage de fichier existe déjà
$ share = Get-AzStorageShare `
-Name $ ShareName -Context $ storageAccount.Context `
-ErrorAction SilentlyContinue
if ($ share -eq $ null)
# créer le partage
$ share = New-AzStorageShare `
-Name $ ShareName `
-Context $ storageAccount.Context
# obtenir les informations d'identification
$ storageAccountKeys = Get-AzStorageAccountKey `
-ResourceGroupName $ StorageResourceGroupName `
-Name $ StorageAccountName
$ storageAccountKey = $ storageAccountKeys[0].Valeur
$ storageAccountKeySecureString = ConvertTo-SecureString $ storageAccountKey -AsPlainText -Force
$ storageAccountCredentials = New-Object System.Management.Automation.PSCredential ($ storageAccountName, $ storageAccountKeySecureString)
retourne $ storageAccountCredentials
Maintenant nous avons le SetupStorage
Pour ce faire, prenons un nom pour le compte de stockage et le partage de fichiers et récupérons les informations d’identité.
$ storageAccountName = "minecraft20190514" # doit être unique sur azur
$ shareName = "minecraft"
$ storageAccountCredentials = SetupStorage `
-StorageResourceGroupName $ resourceGroupName `
-StorageAccountName $ storageAccountName `
-ShareName $ nomPartage `
-Localisation $ location
Création d'un groupe de conteneurs ACI
Nous sommes maintenant prêts à créer le groupe de conteneurs qui exécutera le serveur Minecraft. Nous devons d’abord choisir un nom pour le groupe de conteneurs et un préfixe de nom DNS unique afin de donner à notre serveur Minecraft un nom DNS convivial. Nous devons également configurer certaines variables d’environnement – l’une pour accepter le CLUF, et l’autre pour définir un utilisateur particulier de Minecraft en tant qu’administrateur de ce serveur (il sera écrit dans le ops.json
fichier dans le partage de fichiers la première fois que ce conteneur démarre).
Nous pouvons créer le groupe de conteneurs avec New-AzContainerGroup
et l'image DOcker que nous utilisons est itzg / minecraft-server
de Docker Hub, une image de serveur Minecraft bien entretenue avec des options pour configurer Bukkit et Spigot (sans prétendre savoir ce qu’ils sont, mais mes enfants me disent qu’ils sont bons!). Je dois m'assurer que le groupe de conteneurs a une adresse IP publique et monter le partage de fichiers sur le /Les données
chemin. Nous devons également ouvrir le port de serveur Minecraft par défaut de 25565.
$ containerGroupName = "minecraft20190514"
$ dnsNameLabel = "test minecraft"
$ environmentVariables = @ EULA = "TRUE"; OPS = "YourMinecraftUserName";
New-AzContainerGroup -ResourceGroupName $ resourceGroupName `
-Name $ containerGroupName `
-Image "itzg / minecraft-server" `
-AzureFileVolumeAccountCredential $ storageAccountCredentials `
-AzureFileVolumeShareName $ shareName `
-AzureFileVolumeMountPath "/ data" `
-IpAddressType Public `
-OsType Linux `
-DnsNameLabel $ dnsNameLabel `
-Port 25565 `
-EnvironmentVariable $ environmentVariables
Et avec cette commande, notre serveur Minecraft sera opérationnel. Il va démarrer très rapidement, et nous pouvons vérifier son statut avec Get-AzContainerGroup
qui nous dira le nom de domaine complet du serveur.
# vérifier l'état
$ conteneurGroup = Get-AzContainerGroup -ResourceGroupName $ resourceGroupName -Name $ containerGroupName
# afficher le nom de domaine (par exemple, minecrafttest.westeurope.azurecontainer.io)
$ containerGroup.Fqdn
Démarrer et arrêter le groupe de conteneurs
J'espérais que le module PowerShell Az disposerait d'une commande simple et agréable pour démarrer et arrêter les groupes de conteneurs comme vous le pouvez avec l'interface de ligne de commande Azure arrêt de conteneur az
et début de conteneur
commandes. Malheureusement, des commandes équivalentes n'ont pas encore été créées pour le module Azure Az PowerShell (veuillez voter pour ma demande de fonctionnalité ici).
Comment pouvons-nous démarrer et arrêter le conteneur sans commandes intégrées? Nous pouvons appeler directement les API Azure REST, telles que cette API, pour arrêter un groupe de conteneurs. Cependant, nous devons fournir un jeton porteur, et cela s'est avéré être un défi à relever. Après quelques expériences, j'ai découvert que le code suivant pouvait me procurer un jeton de support valide que je pourrais utiliser pour appeler l'API Azure REST.
fonction Get-AccessToken ($ tenantId)
$ azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]:: Instance.Profile;
$ profileClient = New-Object Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient ($ azureRmProfile);
$ profileClient.AcquireAccessToken ($ tenantId) .AccessToken;
Avec cela en place, nous pouvons définir un Send-ContainerGroupCommand
fonction pouvant appeler n'importe quel point de départ, d'arrêt et de redémarrage pour les groupes de conteneurs:
function Send-ContainerGroupCommand ($ resourceGroupName, $ conteneurGroupName, $ commande)
$ azContext = Get-AzContext
$ subscriptionId = $ azContext.Subscription.Id
$ commandUri = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.ContainerInstance/containerGroups/$containerGroupName/$command" + "? api-version = 2018-10-01 "
$ accessToken = Get-AccessToken $ azContext.Tenant.TenantId
$ response = Invoke-RestMethod -Method Post -Uri $ commandUri -Headers @ Authorization = "Bearer $ accessToken"
$ réponse
Et créer ensuite nos propres fonctions d'assistance pour arrêter et démarrer les groupes de conteneurs devient facile:
fonction Stop-ContainerGroup ($ resourceGroupName, $ conteneurGroupName)
Send-ContainerGroupCommand $ resourceGroupName $ conteneurGroupName "stop"
fonction Start-ContainerGroup ($ resourceGroupName, $ conteneurGroupName)
Send-ContainerGroupCommand $ resourceGroupName $ conteneurGroupName "start"
fonction Restart-ContainerGroup ($ resourceGroupName, $ conteneurGroupName)
Send-ContainerGroupCommand $ resourceGroupName $ conteneurGroupName "redémarrer"
Alors maintenant, je peux arrêter le serveur Minecraft que nous venons de créer avec cette commande:
Stop-ContainerGroup $ resourceGroupName $ conteneurGroupName
La grande chose à ce sujet est que nous ne payons plus rien pour notre groupe de conteneurs – ils sont libres tant qu’ils sont arrêtés. Le seul coût est associé au contenu du partage de fichiers. Et lorsque nous redémarrons le groupe de conteneurs, il reviendra avec le même nom de domaine. C'est formidable de permettre à mes enfants de partager l'adresse du serveur avec leurs amis, ce qui peut rester constant. En fait, j'ai été en mesure de mapper un domaine personnalisé avec un enregistrement DNS CNAME sur le nom de domaine du groupe de conteneurs afin de rendre l'adresse du serveur encore plus facile à partager.
Résumé et quelle est la prochaine?
Dans cet article, nous avons vu comment automatiser entièrement la création d'un serveur Minecraft s'exécutant dans des instances de conteneur Azure, ainsi qu'un partage de fichiers capable de conserver les données du serveur. Mais évidemment, chaque fois que mes enfants veulent démarrer le serveur, ils ont besoin de ma connexion à Azure PowerShell et de l'exécution de la commande de démarrage. Et je dois aussi penser à arrêter le serveur à la fin de la session de jeu, sinon je vais me retrouver avec une facture inattendue.
Ce qui serait formidable ensuite, c’est d’automatiser le processus afin que je puisse donner à mes enfants un moyen de démarrer le serveur eux-mêmes, sans avoir besoin d’accéder à mon abonnement Azure, mais aussi un moyen de le fermer automatiquement une certaine durée écoulée.
Maintenant que Azure Functions v2 prend en charge les fonctions PowerShell et s’intègre directement au module Az, c’est un choix évident pour l’automatisation. J'espère donc continuer avec un autre article montrant bientôt comment créer une application PowerShell Azure Functions pour automatiser le démarrage et l'arrêt du conteneur Minecraft.
Commentaires
Laisser un commentaire