Afficher et interroger les métadonnées d'une VM


Chaque machine virtuelle (VM) stocke ses métadonnées dans des répertoires sur un serveur de métadonnées. Votre VM a automatiquement accès à l'API de ce serveur de métadonnées, sans aucune autorisation supplémentaire. Vous pouvez utiliser les méthodes expliquées dans les sections suivantes de ce document pour afficher et interroger les valeurs de métadonnées de VM :

Avant de commencer

  • Pour les VM Windows Server, utilisez PowerShell 3.0 ou version ultérieure. Nous vous recommandons d'utiliser ctrl+v pour coller les blocs de code copiés.
  • Passez en revue les principes de base de la définition, de la classification et de l'organisation des métadonnées de VM pour Compute Engine. Pour en savoir plus, consultez la page À propos des métadonnées de VM.
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    Console

    Lorsque vous utilisez la console Google Cloud pour accéder aux services et aux API Google Cloud, vous n'avez pas besoin de configurer l'authentification.

    gcloud

    1. Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init
    2. Définissez une région et une zone par défaut.

    Python

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init

Rôles requis

Les rôles et autorisations suivants sont nécessaires pour afficher des métadonnées personnalisées depuis l'extérieur de la VM à l'aide de la console Google Cloud, de la Google Cloud CLI ou de REST. Si vous interrogez des métadonnées de manière automatisée à partir de la VM, vous n'avez besoin que des rôles et autorisations nécessaires pour vous connecter à la VM.

Pour obtenir les autorisations nécessaires pour afficher des métadonnées personnalisées extérieures à la VM, demandez à votre administrateur de vous accorder les rôles IAM suivants :

Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Ces rôles prédéfinis contiennent les autorisations requises pour afficher les métadonnées personnalisées depuis l'extérieur de la VM. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Vous devez disposer des autorisations suivantes pour afficher les métadonnées personnalisées depuis l'extérieur de la VM :

  • Pour afficher les métadonnées personnalisées à l'échelle du projet : compute.projects.get sur le projet
  • Pour afficher les métadonnées zonales personnalisées d'un projet : compute.instanceSettings.get sur les paramètres d'instance dans la zone requise par le projet
  • Pour afficher des métadonnées personnalisées pour une instance de VM : compute.instances.get sur la VM
  • Si vos VM utilisent des comptes de service : iam.serviceAccounts.actAs sur les comptes de service ou le projet

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Interroger les métadonnées de manière automatisée

À partir d'une VM, vous pouvez interroger les valeurs de métadonnées par défaut ou personnalisées de manière automatisée à l'aide d'outils tels que curl sous Linux ou Invoke-RestMethod sous Windows.

Composantes d'une requête de métadonnées

Le tableau suivant récapitule les principaux composants d'une requête de métadonnées.

Composants Description
URL racine

Toutes les valeurs de métadonnées sont définies comme des sous-chemins d'accès situés sous l'URL racine suivante :

  • 
    http://metadata.google.internal/computeMetadata/v1
  • 
    http://169.254.169.254/v1
  • 
    http://metadata.goog/v1
En-tête de requête

Cet en-tête indique que la requête a été envoyée avec l'intention de récupérer des valeurs de métadonnées, et non involontairement à partir d'une source non sécurisée. De plus, il permet au serveur de métadonnées de renvoyer les données demandées. Si vous ne fournissez pas cet en-tête, le serveur de métadonnées refuse votre requête.


Metadata-Flavor: Google

Interroger une seule entrée de métadonnées

Utilisez les commandes suivantes pour interroger une seule entrée de métadonnées.

Linux

  1. Connectez-vous à la VM Linux.
  2. À partir de votre VM Linux, utilisez l'outil curl pour envoyer une requête.

    • Pour interroger une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY" -H "Metadata-Flavor: Google"
      
    • Pour interroger une entrée de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY" -H "Metadata-Flavor: Google"
      

    Remplacez METADATA_KEY par la clé de métadonnées de l'instance ou du projet dont vous souhaitez interroger la valeur.

    Par exemple, pour interroger l'image de démarrage de la VM, exécutez la requête suivante :

    user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/image" -H "Metadata-Flavor: Google"
    

    Le résultat ressemble à ce qui suit :

    projects/rhel-cloud/global/images/rhel-8-v20210122

Windows

  1. Connectez-vous à votre VM Windows.
  2. À partir de votre VM Windows, exécutez la commande Invoke-RestMethod pour effectuer une requête.

    • Pour interroger une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY")
      $value
      
    • Pour interroger une entrée de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY")
      $value
      

    Remplacez METADATA_KEY par la clé de métadonnées de l'instance ou du projet dont vous souhaitez interroger la valeur.

    Par exemple, pour interroger l'image de démarrage de la VM, exécutez la requête suivante :

    PS C:\> 
    $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/image")
    $value
    

    Le résultat ressemble à ce qui suit :

    projects/windows-cloud/global/images/windows-server-2019-dc-v20210112

Interroger les listes de répertoires de métadonnées

Utilisez les commandes suivantes pour interroger les listes de répertoires de métadonnées. Les listes de répertoires sont des entrées de métadonnées contenant d'autres clés de métadonnées. Toute entrée de métadonnées se terminant par une barre oblique correspond à une liste de répertoires.

Linux

  1. Connectez-vous à la VM Linux.

  2. Depuis votre VM Linux, exécutez les commandes suivantes :

    • Pour interroger un répertoire de métadonnées d'instance de VM, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/" -H "Metadata-Flavor: Google"
      
    • Pour interroger un répertoire de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/" -H "Metadata-Flavor: Google"
      

    Remplacez METADATA_DIRECTORY_NAME par le nom de l'instance ou du répertoire de métadonnées du projet dont vous souhaitez interroger les listes.

    Par exemple, considérons l'entrée disks/, qui est un répertoire de disques associé à la VM. Pour interroger l'entrée disks/, procédez comme suit :

    1. Exécutez la commande de l'outil curl sur le répertoire de disques.

      user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
      

      Le résultat ressemble à ce qui suit :

      0/
      1/
      2/
      
    2. Si vous souhaitez obtenir plus d'informations sur le répertoire de disque 0/, vous pouvez ensuite interroger l'URL spécifique de ce répertoire :

      user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/" -H "Metadata-Flavor: Google"
      

      Le résultat ressemble à ce qui suit :

      device-name
      index
      mode
      type
      
    3. Pour connaître le type de disque (type) des disques 0/, vous pouvez exécuter la commande suivante :

      user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/type" -H "Metadata-Flavor: Google"
      

      Le résultat ressemble à ce qui suit :

      PERSISTENT
      

Windows

L'entrée disks/ désigne un répertoire de disques associés à la VM. Pour interroger l'entrée de disque, procédez comme suit :

  1. Connectez-vous à votre VM Windows.

  2. Depuis votre VM Windows, exécutez les commandes suivantes :

    • Pour interroger un répertoire de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/")
      $value
      
    • Pour interroger un répertoire de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/")
      $value
      

    Remplacez METADATA_DIRECTORY_NAME par le nom de l'instance ou du répertoire de métadonnées du projet dont vous souhaitez interroger les listes.

    Par exemple, considérons l'entrée disks/, qui est un répertoire de disques associé à la VM. Pour interroger l'entrée disks/, procédez comme suit :

    1. Exécutez la commande Invoke-RestMethod sur le répertoire de disques.

      PS C:\> 
      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/")
      $value
      

      Le résultat ressemble à ce qui suit :

      0/
      1/
      2/
      
    2. Si vous souhaitez en savoir plus sur le répertoire de disque 0/, vous pouvez interroger l'URL spécifique de ce répertoire :

      PS C:\> 
      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/")
      $value
      

      Le résultat ressemble à ce qui suit :

      device-name
      index
      mode
      type
      
    3. Pour connaître le type de disque (type) des disques 0/, vous pouvez exécuter la commande suivante :

      PS C:\> 
      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/type")
      $value
      

      Le résultat ressemble à ce qui suit :

      PERSISTENT
      

Interroger les listes de répertoires de manière récursive

Si vous souhaitez renvoyer tout le contenu sous un répertoire, ajoutez le paramètre recursive=true à votre requête :

Linux

  1. Connectez-vous à la VM Linux.

  2. À partir de votre VM Linux, utilisez l'outil curl pour envoyer une requête.

    • Pour interroger de manière récursive les listes d'un répertoire de métadonnées d'instance de VM, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/?recursive=true" -H "Metadata-Flavor: Google"
      
    • Pour interroger de manière récursive les listes d'un répertoire de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/?recursive=true" -H "Metadata-Flavor: Google"
      

    Remplacez METADATA_DIRECTORY_NAME par le nom de l'instance ou du répertoire de métadonnées du projet dont vous souhaitez interroger les listes de manière récursive.

    Par exemple, la commande suivante interroge de manière récursive les listes de métadonnées de l'instance pour le répertoire disks/.

      user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true" -H "Metadata-Flavor: Google"
      

    Le résultat ressemble à ce qui suit :

      [{"deviceName":"boot","index":0,"mode":"READ_WRITE","type":"PERSISTENT"},
      {"deviceName":"persistent-disk-1","index":1,"mode":"READ_WRITE","type":"PERSISTENT"},
      {"deviceName":"persistent-disk-2","index":2,"mode":"READ_ONLY","type":"PERSISTENT"}]
      

    Par défaut, les contenus récursifs sont renvoyés au format JSON. Si vous souhaitez renvoyer ces contenus au format texte, ajoutez le paramètre de requête alt=text :

      user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true&alt=text" -H "Metadata-Flavor: Google"
      

    Le résultat ressemble à ce qui suit :

      0/device-name boot
      0/index 0
      0/mode READ_WRITE
      0/type PERSISTENT
      1/device-name persistent-disk-1
      1/index 1
      1/mode READ_WRITE
      1/type PERSISTENT
      2/device-name persistent-disk-1
      2/index 2
      2/mode READ_ONLY
      2/type PERSISTENT
      

Windows

  1. Connectez-vous à votre VM Windows.

  2. À partir de votre VM Windows, exécutez la commande Invoke-RestMethod pour effectuer une requête.

    • Pour interroger de manière récursive les listes d'un répertoire de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/?recursive=true")
      $value
      
    • Pour interroger de manière récursive les listes d'un répertoire de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/?recursive=true")
      $value
      

    Remplacez METADATA_DIRECTORY_NAME par le nom de l'instance ou du répertoire de métadonnées du projet dont vous souhaitez interroger les listes de manière récursive.

    Par exemple, la commande suivante interroge de manière récursive les listes de métadonnées de l'instance pour le répertoire disks/.

    PS C:\> 
    $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true")
    $value
    

    Le résultat ressemble à ce qui suit :

    [{"deviceName":"boot","index":0,"mode":"READ_WRITE","type":"PERSISTENT"},
    {"deviceName":"persistent-disk-1","index":1,"mode":"READ_WRITE","type":"PERSISTENT"},
    {"deviceName":"persistent-disk-2","index":2,"mode":"READ_ONLY","type":"PERSISTENT"}]
    

    Par défaut, les contenus récursifs sont renvoyés au format JSON. Si vous souhaitez renvoyer ces contenus au format texte, ajoutez le paramètre de requête alt=text :

    PS C:\> 
    $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true&alt=text")
    $value
    

    Le résultat ressemble à ce qui suit :

    0/device-name boot
    0/index 0
    0/mode READ_WRITE
    0/type PERSISTENT
    1/device-name persistent-disk-1
    1/index 1
    1/mode READ_WRITE
    1/type PERSISTENT
    2/device-name persistent-disk-1
    2/index 2
    2/mode READ_ONLY
    2/type PERSISTENT
    

Mettre en forme le résultat d'une requête

Par défaut, chaque point de terminaison a un format prédéfini pour la réponse. Certains points de terminaison peuvent renvoyer des données au format JSON par défaut, tandis que d'autres peuvent renvoyer des données sous forme de chaîne. Vous pouvez remplacer la spécification de format de données par défaut à l'aide des paramètres de requête alt=json ou alt=text. Ces paramètres renvoient respectivement les données au format de chaîne JSON ou sous forme de représentation en texte brut.

Linux

  1. Connectez-vous à la VM Linux.
  2. À partir de votre VM Linux, utilisez l'outil curl pour envoyer une requête.

    • Pour modifier le format des données de réponse de requête pour une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?alt=DATA_FORMAT" -H "Metadata-Flavor: Google"
      
    • Pour modifier le format des données de réponse de requête pour une entrée de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?alt=DATA_FORMAT" -H "Metadata-Flavor: Google"
      

    Remplacez les éléments suivants :

    • METADATA_KEY : clé de métadonnées d'instance ou de projet dont vous souhaitez interroger la valeur.
    • DATA_FORMAT : format dans lequel vous souhaitez obtenir les données de réponse de la requête, par exemple text ou json.

Exemple

Par exemple, la clé tags renvoie automatiquement les données au format JSON. Spécifiez le paramètre de requête alt=text pour renvoyer les données au format texte.

Requête par défaut

  user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags" -H "Metadata-Flavor: Google"
  

Le résultat ressemble à ce qui suit :

  ["http-server", "db-client", "app-server", "mysql-server"]
  

Requête avec mise en forme

  user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?alt=text" -H "Metadata-Flavor: Google"
  

Le résultat ressemble à ce qui suit :

  http-server
  db-client
  app-server
  mysql-server

Windows

  1. Connectez-vous à votre VM Windows.
  2. À partir de votre VM Windows, exécutez la commande Invoke-RestMethod pour effectuer une requête.

    • Pour modifier le format des données de réponse de requête pour une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?alt=DATA_FORMAT")
      $value
      
    • Pour modifier le format des données de réponse de requête pour une entrée de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
                -Headers @{'Metadata-Flavor' = 'Google'} `
                -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?alt=DATA_FORMAT")
      $value
      

    Remplacez les éléments suivants :

    • METADATA_KEY : clé de métadonnées d'instance ou de projet dont vous souhaitez interroger la valeur.
    • DATA_FORMAT : format dans lequel vous souhaitez obtenir les données de réponse de la requête, par exemple text ou json.

Exemple

Par exemple, la clé tags renvoie automatiquement les données au format JSON. Spécifiez le paramètre de requête alt=text pour renvoyer les données au format texte.

Requête par défaut

  PS C:> 
  $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags")
  $value
  

Le résultat ressemble à ce qui suit :

  ["http-server", "db-client", "app-server", "mysql-server"]
  

Requête avec mise en forme

  PS C:> 
  $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?alt=text")
  $value
  

Le résultat ressemble à ce qui suit :

  http-server
  db-client
  app-server
  mysql-server

Interroger les modifications de métadonnées à l'aide de la fonctionnalité wait-for-change

Étant donné que les valeurs de métadonnées peuvent changer pendant que votre VM est en cours d'exécution, le serveur de métadonnées peut recevoir des notifications en cas de modifications des métadonnées à l'aide de la fonctionnalité wait-for-change. Avec cette option, la requête ne renvoie un résultat que lorsque les métadonnées spécifiées ont été modifiées.

Vous pouvez utiliser cette fonctionnalité sur des métadonnées personnalisées ou définies par le serveur. Par conséquent, si des modifications sont apportées à votre VM ou à votre projet, ou si une mise à jour est effectuée sur une métadonnée personnalisée, vous pouvez réagir au changement de manière automatisée.

Par exemple, vous pouvez effectuer une requête sur la clé tags afin que la requête ne renvoie une réponse que si le contenu des métadonnées de tags a été modifié. Lorsque la requête est renvoyée, la nouvelle valeur de la clé de métadonnées est spécifiée.

La fonctionnalité wait-for-change vous permet également de faire correspondre votre requête et de définir des délais avant expiration.

Lorsque vous utilisez la fonctionnalité wait-for-change, tenez compte des points suivants :

  • Vous ne pouvez exécuter une requête wait-for-change que sur un point de terminaison de métadonnées ou de manière récursive sur le contenu d'un répertoire. Vous ne pouvez pas exécuter de requête wait-for-change sur une liste de répertoires. Si vous tentez de le faire, le serveur de métadonnées fait échouer la requête et renvoie une erreur 400 Requête non valide.

  • Vous ne pouvez pas envoyer une requête wait-for-change pour un jeton de compte de service. Si vous essayez d'envoyer une requête wait-for-change à l'URL du jeton du compte de service, la requête échoue immédiatement et renvoie une erreur 400 Requête non valide.

Pour envoyer une requête wait-for-change, interrogez une clé de métadonnées et ajoutez le paramètre de requête ?wait_for_change=true :

Linux

  1. Connectez-vous à la VM Linux.
  2. À partir de votre VM Linux, utilisez l'outil curl pour envoyer une requête.

    • Pour envoyer une requête wait-for-change pour une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true" -H "Metadata-Flavor: Google"
      
    • Pour envoyer une requête wait-for-change pour une entrée de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY" -H "Metadata-Flavor: Google"
      

    Remplacez METADATA_KEY par la clé de métadonnées de l'instance ou du projet dont vous souhaitez interroger la valeur.

    Après la modification de la clé de métadonnées spécifiée, la requête renvoie la nouvelle valeur.

Exemples

Dans cet exemple, si une requête est transmise à la méthode setInstanceTags method, la requête renvoie une réponse incluant les nouvelles valeurs :

  user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true" -H "Metadata-Flavor: Google"
  

Le résultat ressemble à ce qui suit :

  http-server
  db-client
  

Vous pouvez également envoyer une requête wait-for-change de manière récursive sur le contenu d'un répertoire :

  user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&wait_for_change=true" -H "Metadata-Flavor: Google"
  

Le serveur de métadonnées renvoie le nouveau contenu en cas de modification :

  {"foo":"bar","baz":"bat"}
  

Windows

  1. Connectez-vous à votre VM Windows.
  2. À partir de votre VM Windows, exécutez la commande Invoke-RestMethod pour effectuer une requête.

      PS C:> 
      $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
                -Uri "http://metadata.google.internal/computeMetadata/v1/METADATA_KEY?wait_for_change=true")
      $value
      

    • Pour envoyer une requête wait-for-change pour une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true")
      $value
      
    • Pour envoyer une requête wait-for-change pour une entrée de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true")
      $value
      

    Remplacez METADATA_KEY par la clé de métadonnées de l'instance ou du projet pour laquelle vous souhaitez effectuer une requête wait-for-change.

    Après la modification de la clé de métadonnées spécifiée, la requête renvoie la nouvelle valeur.

Exemples

Après la modification de la clé de métadonnées spécifiée, la requête renvoie la nouvelle valeur. Dans cet exemple, si une requête est transmise à la méthode setInstanceTags method, la requête renvoie une réponse incluant les nouvelles valeurs :

  PS C:> 
  $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true")
  $value
  

Le résultat ressemble à ce qui suit :

  http-server
  db-client
  

Vous pouvez également envoyer une requête wait-for-change de manière récursive sur le contenu d'un répertoire :

  PS C:> 
  $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/attributes?recursive=true&wait_for_change=true")
  $value
  

Le serveur de métadonnées renvoie le nouveau contenu en cas de modification :

  {"foo":"bar","baz":"bat"}
  

Utiliser les ETags

Lorsque vous soumettez une simple requête wait-for-change, le serveur de métadonnées renvoie une réponse si des modifications ont été apportées dans le contenu de ces métadonnées. Cependant, il existe une condition de concurrence inhérente entre une mise à jour des métadonnées et l'envoi d'une requête wait-for-change. Il est donc utile de savoir de manière fiable si les valeurs de métadonnées que vous obtenez sont les plus récentes.

Pour vous aider, vous pouvez utiliser le paramètre de requête last_etag qui permet de comparer la valeur ETag que vous avez fournie avec la valeur ETag enregistrée sur le serveur de métadonnées. Si les valeurs ETag correspondent, la requête wait-for-change est acceptée. Si elles ne correspondent pas, cela indique que le contenu des métadonnées a été modifié depuis votre dernière récupération de la valeur ETag. Le serveur de métadonnées renvoie immédiatement la valeur la plus récente.

VM Linux

Pour obtenir la valeur ETag actuelle d'une clé de métadonnées, procédez comme suit :

  1. Connectez-vous à la VM Linux.
  2. Envoyez une requête à cette clé et imprimez les en-têtes. Pour ce faire, utilisez l'outil curl avec l'option -v :

    • Pour obtenir l'ETag actuel d'une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      curl -v "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY" -H "Metadata-Flavor: Google"
      
    • Pour obtenir l'ETag actuel d'une entrée de métadonnées de projet, exécutez la commande suivante :

      curl -v "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY" -H "Metadata-Flavor: Google"
      

    Remplacez METADATA_KEY par la clé de métadonnées de l'instance ou du projet dont vous souhaitez interroger la valeur.

    Par exemple, la commande suivante obtient la valeur ETag actuelle pour la clé de métadonnées d'instance tags.

      user@myinst:~$ curl -v "http://metadata.google.internal/computeMetadata/v1/instance/tags" -H "Metadata-Flavor: Google"
      

    Le résultat ressemble à ce qui suit :

    * About to connect() to metadata port 80 (#0)
    * Trying 169.254.169.254... connected
    * Connected to metadata (169.254.169.254) port 80 (#0)
    > GET /computeMetadata/v1/instance/tags HTTP/1.1
    > User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
    > Host: metadata
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Content-Type: application/text
    < ETag: 411261ca6c9e654e
    < Date: Wed, 13 Feb 2013 22:43:45 GMT
    < Server: Metadata Server for VM
    < Content-Length: 26
    < X-XSS-Protection: 1; mode=block
    < X-Frame-Options: SAMEORIGIN
    <
    http-server
    db-client
  3. Vous pouvez ensuite utiliser cette valeur ETag avec la commande de l'outil curl dans votre requête wait-for-change :

    • Pour utiliser la valeur ETag pour la requête wait-for-change de métadonnées d'instance, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&last_etag=ETAG" -H "Metadata-Flavor: Google"
      
    • Pour utiliser la valeur ETag pour la requête wait-for-change de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&last_etag=ETAG" -H "Metadata-Flavor: Google"
      

    Remplacez les éléments suivants :

    • METADATA_KEY : clé de métadonnées d'instance ou de projet dont vous souhaitez interroger la valeur.
    • ETAG : valeur ETag de la clé de métadonnées.

    Dans cet exemple, la commande suivante utilise la valeur ETag pour la clé tags et les requêtes pour l'entrée de métadonnées d'instance.

      user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&last_etag=411261ca6c9e654e" -H "Metadata-Flavor: Google"
      

    Le serveur de métadonnées fait correspondre la valeur ETag que vous avez spécifiée. Si cette valeur a été modifiée, la requête renvoie le nouveau contenu de votre clé de métadonnées.

VM Windows

Pour obtenir la valeur ETag actuelle d'une clé de métadonnées, procédez comme suit :

  1. Connectez-vous à votre VM Windows.
  2. Envoyez une requête à cette clé et imprimez les en-têtes. Sous Windows, utilisez la commande Invoke-WebRequest :

    • Pour obtenir l'ETag actuel d'une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-WebRequest -Headers @{'Metadata-Flavor' = 'Google'} `
      -Uri http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY)
      
      $value.Headers.ETag
      
    • Pour obtenir l'ETag actuel d'une entrée de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-WebRequest -Headers @{'Metadata-Flavor' = 'Google'} `
      -Uri http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY)
      
      $value.Headers.ETag
      

    Remplacez METADATA_KEY par la clé de métadonnées de l'instance ou du projet dont vous souhaitez interroger la valeur.

    Par exemple, la commande suivante obtient la valeur ETag actuelle pour la clé de métadonnées d'instance tags.

      PS C:> 
      $value = (Invoke-WebRequest -Headers @{'Metadata-Flavor' = 'Google'} `
      -Uri http://metadata.google.internal/computeMetadata/v1/instance/tags)

    $value.Headers.ETag

    Le résultat ressemble à ce qui suit :

      * About to connect() to metadata port 80 (#0)
      * Trying 169.254.169.254... connected
      * Connected to metadata (169.254.169.254) port 80 (#0)
      > GET /computeMetadata/v1/instance/tags HTTP/1.1
      > User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
      > Host: metadata
      > Accept: /
      >
      < HTTP/1.1 200 OK
      < Content-Type: application/text
      < ETag: 411261ca6c9e654e
      < Date: Wed, 13 Feb 2013 22:43:45 GMT
      < Server: Metadata Server for VM
      < Content-Length: 26
      < X-XSS-Protection: 1; mode=block
      < X-Frame-Options: SAMEORIGIN
      <
      http-server
      db-client

  3. Vous pouvez ensuite utiliser cette valeur ETag dans votre requête wait-for-change :

    • Pour utiliser la valeur ETag pour la requête wait-for-change de métadonnées d'instance, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&last_etag=ETAG")
      $value
      
    • Pour utiliser la valeur ETag pour la requête wait-for-change de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&last_etag=ETAG")
      $value
      

    Remplacez les éléments suivants :

    • METADATA_KEY : clé de métadonnées d'instance ou de projet dont vous souhaitez interroger la valeur.
    • ETAG : valeur ETag de la clé de métadonnées.

    Dans cet exemple, la commande suivante utilise la valeur ETag pour la clé tags et les requêtes pour l'entrée de métadonnées d'instance.

      PS C:> 
      $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
                -Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&last_etag=411261ca6c9e654e")
      $value
      

    Le serveur de métadonnées fait correspondre la valeur ETag que vous avez spécifiée. Si cette valeur a été modifiée, la requête renvoie le nouveau contenu de votre clé de métadonnées.

Python

L'exemple Python suivant montre comment surveiller de manière automatisée les modifications apportées dans le serveur de métadonnées.

Cet exemple définit l'ETag initial sur 0. Le serveur de métadonnées ne renvoie pas de réponse avec 0 comme valeur ETag. Lorsque la valeur 0 est spécifiée comme dernier ETag dans une requête, le serveur de métadonnées répond avec la valeur actuelle et l'ETag. Cela permet d'économiser la quantité de code nécessaire pour obtenir la valeur initiale et l'ETag.

last_etag = "0"

while True:
    r = requests.get(
        url,
        params={"last_etag": last_etag, "wait_for_change": True},
        headers=METADATA_HEADERS,
    )

    # During maintenance the service can return a 503, so these should
    # be retried.
    if r.status_code == 503:
        time.sleep(1)
        continue
    r.raise_for_status()

    last_etag = r.headers["etag"]

Définir les délais avant expiration

Si vous souhaitez que votre requête wait-for-change expire après un certain nombre de secondes, vous pouvez définir le paramètre timeout_sec. Le paramètre timeout_sec permet de limiter le temps d'attente de votre requête au nombre de secondes spécifié. Lorsque la requête atteint cette limite, elle renvoie le contenu actuel de la clé de métadonnées.

Lorsque vous définissez le paramètre timeout_sec, la requête renvoie toujours une réponse après le nombre de secondes spécifié, que la valeur de métadonnées ait été réellement modifiée ou non. Le délai avant expiration ne peut être défini qu'avec un nombre entier.

Linux

  1. Connectez-vous à la VM Linux.
  2. À partir de votre VM Linux, utilisez l'outil curl pour envoyer une requête.

    • Pour exécuter une requête wait-for-change avec une valeur de délai d'inactivité pour une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT" -H "Metadata-Flavor: Google"
      
    • Pour exécuter une requête wait-for-change avec une valeur de délai d'expiration pour une entrée de métadonnées de projet, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT" -H "Metadata-Flavor: Google"
      

    Remplacez les éléments suivants :

    • METADATA_KEY : clé de métadonnées d'instance ou de projet dont vous souhaitez interroger la valeur.
    • TIMEOUT : valeur du délai d'expiration.

Par exemple, la commande suivante exécute une requête wait-for-change qui est définie pour expirer au bout de 360 secondes :

  user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&timeout_sec=360" -H "Metadata-Flavor: Google"
  

Windows

  1. Connectez-vous à votre VM Windows.
  2. À partir de votre VM Windows, exécutez la commande Invoke-RestMethod pour effectuer une requête.

    • Pour exécuter une requête wait-for-change avec une valeur de délai d'inactivité pour une entrée de métadonnées d'instance de VM, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT")
      $value
      
    • Pour exécuter une requête wait-for-change avec une valeur de délai d'expiration pour une entrée de métadonnées de projet, exécutez la commande suivante :

      $value = (Invoke-RestMethod `
              -Headers @{'Metadata-Flavor' = 'Google'} `
              -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT")
      $value
      

    Remplacez les éléments suivants :

    • METADATA_KEY : clé de métadonnées d'instance ou de projet dont vous souhaitez interroger la valeur.
    • TIMEOUT : valeur du délai d'expiration.

Par exemple, la commande suivante exécute une requête wait-for-change qui est définie pour expirer au bout de 360 secondes :

  PS C:> 
  $value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&timeout_sec=360")
  $value
  

Codes d'état

Lorsque vous envoyez une requête wait-for-change, le serveur de métadonnées renvoie des codes d'état HTTP standards pour indiquer le succès ou l'échec de l'opération. En cas d'erreurs, le serveur de métadonnées peut faire échouer la requête à cause des conditions du réseau et peut renvoyer un code d'erreur. Pour faire face à ce type de situation, vous devez concevoir votre application de sorte qu'elle soit tolérante aux pannes et capable de reconnaître et gérer ces erreurs.

Les états possibles renvoyés par le serveur de métadonnées sont les suivants :

État Description
HTTP 200 Success! Une valeur a été modifiée, ou vous avez atteint la valeur timeout_sec spécifiée, et la requête a bien été renvoyée.
Error 400 La requête n'est pas valide. Corrigez la requête, puis réessayez.
Error 404 La valeur de métadonnées que vous avez spécifiée n'existe plus. Le serveur de métadonnées renvoie également cette erreur si vos métadonnées sont supprimées pendant que vous attendez une modification.
Error 503 Une erreur temporaire du serveur ou un événement temporaire de maintenance s'est produit(e). Réessayez d'envoyer la requête.

Limites

  • Toutes les requêtes contenant l'en-tête X-Forwarded-For sont automatiquement rejetées par le serveur de métadonnées. Cet en-tête indique généralement que la requête a été exécutée par un serveur proxy et peut ne pas être une requête effectuée par un utilisateur autorisé. Pour des raisons de sécurité, toutes ces requêtes sont refusées.

  • Lorsque vous exécutez la commande curl pour récupérer les métadonnées du serveur, notez que certains caractères encodés ne sont pas disponibles dans le chemin de la requête. Les caractères encodés ne sont acceptés que dans le chemin de la requête.

    Par exemple, la requête suivante est susceptible de ne pas aboutir :

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/123456789-compute%40developer.gserviceaccount.com/?query_path=https%3A%2F%2Flocalhost%3A8200%2Fexample%2Fquery&another_param=true" -H "Metadata-Flavor: Google"

    Pour que cette requête fonctionne, vous devez remplacer le caractère encodé non disponible dans le chemin de la requête (%40) par la valeur acceptée équivalente (@).

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567898-compute@developer.gserviceaccount.com/?query_path=https%3A%2F%2Flocalhost%3A8200%2Fexample%2Fquery&another_param=true" -H "Metadata-Flavor: Google"

    Le tableau suivant récapitule les caractères encodés qui ne sont pas acceptés dans le chemin d'une requête.

    Caractère encodé Valeur acceptée
    %21
    
    !
    %24
    
    $
    %27
    
    '
    %28
    
    (
    %29
    
    )
    %2A
    
    *
    %2C
    
    ,
    %40
    
    @

Afficher les métadonnées personnalisées de vos VM

Vous pouvez afficher les valeurs de métadonnées personnalisées de vos VM Compute Engine de l'une des manières suivantes :

Afficher les métadonnées à l'échelle du projet

Pour afficher les métadonnées personnalisées qui s'appliquent à toutes les VM de votre projet, utilisez l'une des méthodes suivantes.

Console

  1. Dans Google Cloud Console, accédez à la page Métadonnées.

    Accéder à la page "Métadonnées"

    • Dans l'onglet Métadonnées, vous pouvez examiner la plupart des métadonnées de projet personnalisées, à l'exception des métadonnées de clés SSH.
    • Dans l'onglet Clés SSH, vous pouvez consulter toutes les métadonnées de clés SSH au niveau du projet.

gcloud

Exécutez la commande gcloud compute project-info describe pour interroger les métadonnées à l'échelle du projet :

gcloud compute project-info describe --flatten="commonInstanceMetadata[]"

Le résultat ressemble à ce qui suit :

---
fingerprint: HcSFdS_1_1I=
items:
- key: ssh-keys
  value: USERNAME:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWZ...
kind: compute#metadata

REST

Pour interroger les métadonnées d'un projet, envoyez une requête GET à la méthode project.get.

Remplacez PROJECT_ID par l'ID du projet.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID

Le résultat ressemble à ce qui suit :

"kind": "compute#project",
"id": "XXXXXXX",
"creationTimestamp": "2018-12-10T08:34:33.616-08:00",
"name": "YOUR_PROJECT",
"commonInstanceMetadata": {
  "kind": "compute#metadata",
  "fingerprint": "XXXXXCdg=",
  "items": [
    {
      "key": "enable-guest-attributes",
      "value": "TRUE"
    },
    {
      "key": "enable-os-inventory",
      "value": "true"
    },
    {
      "key": "enable-osconfig",
      "value": "TRUE"
    },
    {
      "key": "enable-oslogin",
      "value": "TRUE"
    },
    {
      "key": "sshKeys",
      "value": "XXXXX"
    }
  ]
}, ...

Afficher les métadonnées zonales du projet

Pour afficher les métadonnées personnalisées qui s'appliquent à toutes les instances de VM dans une zone spécifique d'un projet, utilisez l'une des méthodes suivantes.

gcloud

Pour interroger les métadonnées zonales du projet, exécutez la commande gcloud beta compute project-zonal-metadata describe.

gcloud beta compute project-zonal-metadata describe \
    --zone=ZONE \
    --project=PROJECT_ID

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • ZONE : zone pour laquelle vous souhaitez afficher les métadonnées zonales du projet.

Le résultat ressemble à ce qui suit :

{
  "fingerprint": "VlRIl8dx9vk=",
  "metadata": {
    items: {
      "key-1": "value-1",
      "key-2": "value-2"
    }
  }
}

REST

Pour interroger les métadonnées zonales personnalisées du projet, envoyez une requête GET à la méthode instanceSettings().get.

GET https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instanceSettings

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • ZONE : zone pour laquelle vous souhaitez afficher les métadonnées zonales du projet.

Le résultat ressemble à ce qui suit :

{
  "fingerprint": "VlRIl8dx9vk=",
  "metadata": {
    items: {
      "key-1": "value-1",
      "key-2": "value-2"
    }
  }
}

Afficher les métadonnées d'instance

Pour afficher les métadonnées qui s'appliquent à une seule VM de votre projet, utilisez l'une des méthodes suivantes.

Console

  1. Dans la console Google Cloud, accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  2. Cliquez sur le nom de la VM dont vous souhaitez afficher les métadonnées.

    • Clés SSH de cette VM. Dans la section Sécurité et accès, affichez le champ Clés SSH.

      • La valeur None indique qu'aucune clé SSH n'est stockée dans les métadonnées de l'instance.

      • Les autres valeurs indiquent que des clés SSH sont stockées dans les métadonnées de l'instance.

    • Clés SSH d'un projet. Dans la section Sécurité et accès, affichez le champ Bloquer les clés SSH au niveau du projet.

      • La valeur On indique que la valeur de la clé de métadonnées block-project-ssh-keys est TRUE dans les métadonnées d'instance.

      • La valeur Off indique que la valeur de la clé de métadonnées block-project-ssh-keys est FALSE ou que la clé n'est pas définie.

    • Toutes les autres métadonnées personnalisées. Consultez la section Métadonnées personnalisées. Vous voyez toutes les clés et valeurs des métadonnées personnalisées, autres que les métadonnées de clés SSH.

gcloud

Exécutez la commande gcloud compute instances describe pour interroger les métadonnées d'une instance :

gcloud compute instances describe VM_NAME --flatten="metadata[]"

Remplacez VM_NAME par le nom de la VM pour laquelle vous souhaitez rechercher des métadonnées.

Le résultat ressemble à ce qui suit :

---
fingerprint: MTgTJ5m-Cjs=
items:
- key: enable-oslogin
  value: 'true'
kind: compute#metadata

REST

Pour interroger les métadonnées d'une VM spécifique, envoyez une requête GET à la méthode instances.get.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME

Le résultat ressemble à ce qui suit :

......
"metadata": {
"kind": "compute#metadata",
"fingerprint": "XXXXXXVo=",
"items": [
  {
    "key": "enable-oslogin",
    "value": "true"
  }
]
},....

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet.
  • ZONE : zone où se trouve la VM
  • VM_NAME : nom de la VM.

Étapes suivantes