[PYTHON] Comment démarrer automatiquement une VM préemptive GCP

Comment démarrer automatiquement une VM préemptive GCP

GCP dispose d'une VM appelée Preemptible VM qui s'arrête jusqu'à 24 heures au prix d'un prix modique. https://cloud.google.com/compute/docs/instances/preemptible?hl=ja

Les machines virtuelles qui sont arrêtées après avoir reçu la notification de préemption ne démarreront pas automatiquement. Voici une description des outils permettant le démarrage automatique à l'aide de scripts d'arrêt et de Cloud Functions.

Aperçu des outils

--Preemptible VM est un outil pour démarrer car il ne démarre pas automatiquement après l'arrêt.

Comportement de l'outil

  1. Définissez shutdown-script sur la VM. Il est exécuté lorsque la machine virtuelle est arrêtée, vérifie si elle a reçu la notification de préemption, écrit TRUE ou FALSE dans un fichier et la télécharge sur GCS.
  2. Exécutez Cloud Functions déclenchées par une mise à jour de fichier GCS.
  3. La fonction ne démarrera la VM que si la notification de préemption est VRAI. Sequence.png

Etapes de configuration

  1. Téléchargez le code source

    git clone [email protected]:cloud-mainte/auto-boot-preemtible-vm.git
    
    or 
    
    git clone https://gitlab.com/cloud-mainte/auto-boot-preemtible-vm.git
    
  2. Créez un bucket GCS --Créez un compartiment pour placer le script d'arrêt et placer le script d'arrêt.

--Créez un compartiment pour stocker l'état de la réception ou non d'une notification de préemption.

```
$ gsutil mb -l ASIA-NORTHEAST1 gs://<backet name>
```
  1. Définissez shutdown-script sur l'instance cible

    gcloud compute instances add-metadata <instance name> \
        --metadata shutdown-script-url=gs://<backet name>/shutdown-script.sh
    
  2. Définissez le lanceur d'instance dans Cloud Functions

Contrôle de fonctionnement

  1. Essayez d'arrêter l'instance manuellement.

$ gcloud compute instances stop $ gcloud compute instances list $ gsutil cat gs:///preempted_status.out {"preempted_status":"FALSE", "instance_name":"", "zone":"asia-northeast1-a", "project":""} ```

S'il est arrêté manuellement, il sera "" preempted_status ":" FALSE "`.
Vérifiez le journal.

```
$ gcloud logging read "resource.type=\"cloud_function\" AND resource.labels.function_name=\"boot_preemptible_instance\" AND resource.labels.region=\"asia-northeast1\"" --format="table(timestamp, textPayload)" |head -10
TIMESTAMP                       TEXT_PAYLOAD
2020-08-11T04:38:26.982711475Z  Function execution took 1894 ms, finished with status: 'ok'
2020-08-11T04:38:26.979Z        Preempted status is FALSE.
 :
2020-08-11T04:38:25.090798409Z  Function execution started
```
  1. Essayez d'imiter la notification Preempt.
$ cat preempted_status.out
{"preempted_status":"TRUE", "instance_name":"<instance name>", "zone":"asia-northeast1-a", "project":"<project name>"}
$ gsutil cp preempted_status.out gs://<backet name>/
$ gsutil cat gs://<backet name>/preempted_status.out
{"preempted_status":"TRUE", "instance_name":"<instance name>", "zone":"asia-northeast1-a", "project":"<project name>"}

Vérifiez le journal.

$ gcloud logging read "resource.type=\"cloud_function\" AND resource.labels.function_name=\"boot_preemptible_instance\" AND resource.labels.region=\"asia-northeast1\"" --format="table(timestamp, textPayload)" |head -12
TIMESTAMP                       TEXT_PAYLOAD
2020-08-11T05:02:51.640069088Z  Function execution took 15066 ms, finished with status: 'ok'
2020-08-11T05:02:51.637Z        Instance started.
2020-08-11T05:02:51.637Z        Instance starting.. status = RUNNING
2020-08-11T05:02:46.246Z        Instance starting.. status = STAGING
2020-08-11T05:02:40.862Z        Instance starting.. status = TERMINATED
2020-08-11T05:02:39.373Z        Instance status is now TERMINATED
2020-08-11T05:02:38.959Z        Preempted status is TRUE. Boot up the instance.
 :
2020-08-11T05:02:36.577339221Z  Function execution started

L'instance a démarré.

$ gcloud compute instances list
NAME                         ZONE               MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP     EXTERNAL_IP    STATUS
<instance name>  asia-northeast1-a  g1-small       true         XX.XX.XX.XX   XX.XX.XX.XXX  RUNNING

Recommended Posts

Comment démarrer automatiquement une VM préemptive GCP
Comment corriger un bug qui empêche le notebook Jupyter de démarrer automatiquement
Je souhaite envoyer automatiquement un e-mail de création d'entreprise
Comment appeler une fonction
Comment pirater un terminal
Comment démarrer la première projection
Comment exécuter automatiquement la fonction d'exportation de GCP Datastore
Comment faire une traduction japonais-anglais
Comment mettre un lien symbolique
Comment créer un bot slack
Comment créer un package Conda
Comment créer un robot - Avancé
Comment créer une fonction récursive
Comment créer un Dockerfile (basique)
[Blender] Comment créer un plug-in Blender
Comment supprimer un conteneur Docker
Comment créer un robot - Basic
Comment créer un fichier de configuration
Comment démarrer par lots un programme Python créé avec le notebook Jupyter
Comment créer un clone depuis Github
Comment créer un environnement de traduction sphinx
Comment créer un dossier git clone
Qiita (1) Comment écrire un nom de code
Comment dessiner un graphique avec Matplotlib
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
[Colab] Comment copier un vaste ensemble de données
Comment installer un package à l'aide d'un référentiel
[Ubuntu] Comment exécuter un script shell
Comment obtenir stacktrace en python
Comment créer un référentiel à partir d'un média
Comment créer un indicateur personnalisé Backtrader
Comment choisir une palette de couleurs Seaborn
Comment tester sur une page authentifiée par Django
Comment créer un plan de site Pelican
Comment exécuter des scripts Maya Python
Comment télécharger automatiquement des fichiers .gpx sur Strava
Comment calculer la volatilité d'une marque
Comment démarrer Python (Flask) au démarrage d'EC2
Comment lire un fichier CSV avec Python 2/3
Comment déguiser un fichier ZIP en fichier PNG
Comment utiliser la trace GCP avec la télémétrie ouverte
Comment partager un environnement virtuel [About requirements.txt]
Comment envoyer un message à LINE avec curl
Comment coder un drone en utilisant la reconnaissance d'image
Comment ouvrir un navigateur Web à partir de python
Comment effacer un taple dans une liste (Python)
Comment organiser un concours au Coda Lab
Comment dessiner un graphique à 2 axes avec pyplot
Comment incorporer des variables dans des chaînes python
Comment créer un objet fonction à partir d'une chaîne
Comment dessiner un graphique 3D avant l'optimisation
Comment développer une application de panier avec Django
Comment créer un fichier JSON en Python
Comment générer un objet Python à partir de JSON
Comment appeler l'API Cloud à partir de GCP Cloud Functions
Comment implémenter un sélecteur de dégradé dans Houdini
Comment créer un plug-in QGIS (génération de package)
Comment écrire une instruction ShellScript Bash for