Migrer vers le point de terminaison du serveur de métadonnées v1

Présentation de la migration

Pour migrer vers la version 1.0, procédez comme suit :

  1. Identifiez les instances de VM qui utilisent les points de terminaison du serveur de métadonnées obsolètes.

    Si vous disposez de clusters Google Kubernetes Engine, vous devez identifier les nœuds GKE qui utilisent le point de terminaison obsolète.

  2. Sur les instances de VM ou les nœuds identifiés, trouvez les processus qui utilisent les points de terminaison du serveur de métadonnées obsolètes.

    • Si le processus appartient à une application que vous n'avez pas développée, mettez-la à jour afin qu'elle utilise un point de terminaison du serveur de métadonnées v1. Pour obtenir la liste des applications connues nécessitant une mise à jour, consultez la section Applications nécessitant une mise à jour.
    • Si le processus appartient à une application que vous avez développée et que votre code appelle l'un des anciens points de terminaison, procédez comme suit :
      1. Passez en revue les différences entre les points de terminaison du serveur de métadonnées obsolètes et ceux du serveur de métadonnées v1.
      2. Mettez à jour les requêtes afin d'utiliser le point de terminaison du serveur de métadonnées v1.
    • Si le processus appartient à une application que vous avez développée, mais que votre code n'envoie aucune requête aux anciens points de terminaison, les requêtes peuvent être effectuées par des SDK ou d'autres dépendances. Pour résoudre ce problème, mettez à jour l'ensemble des SDK et des dépendances utilisés par l'application. Pour afficher les versions des bibliothèques Google nécessitant une mise à jour, consultez la page Versions des bibliothèques compatibles.
  3. (Facultatif) Désactivez les versions 0.1 et 1beta1 des points de terminaison du serveur de métadonnées.

    Identifier les instances de VM

    Pour identifier les instances de VM qui utilisent les points de terminaison v0.1 et v1beta1, vous pouvez envoyer des requêtes à deux nouveaux points de terminaison.

    Le résultat de cette requête indique le nombre de fois qu'une instance de VM donnée a accédé aux points de terminaison obsolètes. Remarque : Chaque fois qu'une instance de VM est arrêtée, le compteur est réinitialisé.

    Pour déterminer si une instance de VM a accédé aux points de terminaison v0.1 et v1beta1, exécutez les commandes suivantes :

    curl -H "Metadata-Flavor: Google" computeMetadata/v1/instance/legacy-metadata-access/0.1
    curl -H "Metadata-Flavor: Google" computeMetadata/v1/instance/legacy-metadata-access/v1beta1
    

    Identifier les nœuds GKE

    Pour identifier les nœuds de vos clusters Google Kubernetes Engine qui utilisent les points de terminaison v0.1 et v1beta1, reportez-vous à la section Identifier les charges de travail à l'aide des anciens points de terminaison du serveur de métadonnées.

    Identifier les processus

    Après avoir identifié les instances de VM qui envoient des requêtes aux points de terminaison du serveur de métadonnées obsolètes, vous pouvez rechercher les processus sur ces instances de VM qui effectuent ces requêtes.

    Pour identifier ces processus, utilisez des outils de journalisation ou de surveillance, tels que ngrep ou auditd.

    ngrep

    Vous pouvez utiliser ngrep (réseau grep) pour collecter des paquets et filtrer leur contenu. Pour récupérer des informations issues des paquets concernant les processus qui envoient des requêtes aux points de terminaison obsolètes, exécutez la commande suivante sur votre instance de VM :

    sudo ngrep -l -q "v1beta1|0\.1/meta-data" tcp \
    and dst host 169.254.169.254 or metadata.google.internal \
    and dst port 80
    

    Si des requêtes sont envoyées aux points de terminaison obsolètes, le résultat se présente comme suit :

    T 10.128.0.4:41312 -> 169.254.169.254:80 [AP]
    GET /computeMetadata/v1beta1/instance/id HTTP/1.1..Host: metadata.goog..User-Agent: curl/7.52.1..Accept: */*....
    

    Le résultat contient les informations suivantes :

    • L'URL racine : /computeMetadata/v1beta1/instance/id.
    • L'user-agent ayant servi à effectuer la requête. Dans cet exemple, il s'agit de curl/7.52.1.
    • L'adresse IP (adresse IP source) et le port associés à l'instance de VM à l'origine de la requête. Dans cet exemple, l'adresse IP est 10.128.0.4 et le port est 41312.
    • Si le processus est toujours actif, vous pouvez consulter les informations sur le port pour trouver l'ID du processus.

    Consultez les informations sur le port

    La procédure suivante permet d'identifier les processus à l'aide de requêtes HTTP GET suspendues non résolues. Cette procédure permet de trouver les processus qui communiquent à la fois avec les points de terminaison de métadonnées fonctionnels et obsolètes.

    Pour répertorier les sockets dotés de connexions ouvertes au serveur de métadonnées, exécutez la commande suivante sur votre instance de VM :

    sudo lsof -n -P +c 0 -i @169.254.169.254

    Le résultat se présente comme suit :

    COMMAND         PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
    google_network_ 798 root    7u  IPv4 1674967626      0t0  TCP 10.128.0.4:44876->169.254.169.254:80 (ESTABLISHED)
    google_accounts 805 root    5u  IPv4 1674980506      0t0  TCP 10.128.0.4:44878->169.254.169.254:80 (ESTABLISHED)
    google_clock_sk 809 root    5u  IPv4 1674982496      0t0  TCP 10.128.0.4:44880->169.254.169.254:80 (ESTABLISHED)
    google_clock_sk 809 root    6u  IPv4 1674914460      0t0  TCP 10.128.0.4:44874->169.254.169.254:80 (CLOSE_WAIT)
    

    La colonne NAME indique l'adresse IP source, l'adresse IP de destination et les ports. Si ces éléments ne suffisent pas à identifier un processus, vous pouvez exécuter la commande ps pour afficher plus d'informations.

    ps 798 805 809

    Le résultat se présente comme suit :

    PID TTY      STAT   TIME COMMAND
    798 ?        Ss     9:07 /usr/bin/python /usr/bin/google_network_daemon
    805 ?        Ss    14:19 /usr/bin/python /usr/bin/google_accounts_daemon
    809 ?        Ss     4:33 /usr/bin/python /usr/bin/google_clock_skew_daemon
    

    auditd (Linux uniquement)

    Auditd est un daemon capable d'écrire des journaux d'audit sur le disque suivant un ensemble de règles. En configurant une règle pour l'appel du système connect, vous pouvez identifier le processus qui crée chaque connexion vers les points de terminaison obsolètes du serveur de métadonnées.

    1. Pour configurer une règle permettant d'effectuer un audit des appels du système connect, exécutez la commande suivante sur votre instance de VM :

      sudo auditctl -a exit,always -F arch=b64 -S connect -k CONNECT
    2. Pour rechercher des connexions vers les points de terminaison obsolètes, exécutez la commande suivante sur votre instance de VM :

      sudo ausearch -m SOCKADDR -k CONNECT --interpret | grep -C 3 'computeMetadata/v1beta1\|0\.1/meta-data'

      Le résultat devrait se présenter comme suit :

      type=PROCTITLE msg=audit(09/26/2019 22:20:21.498:847) : proctitle=curl metadata.goog/computeMetadata/v1beta1/instance/id
      type=SOCKADDR msg=audit(09/26/2019 22:20:21.498:847) : saddr={ fam=inet laddr=169.254.169.254 lport=80 }
      type=SYSCALL msg=audit(09/26/2019 22:20:21.498:847) : arch=x86_64 syscall=connect success=no exit=EINPROGRESS(Operation now in progress) a0=0x3 a1=0x7fffd965bd50 a2=0x10 a3=0x14856d3402026e items=0 ppid=27641 pid=28977 auid=alice uid=alice gid=alice euid=alice suid=alice fsuid=alice egid=alice sgid=alice fsgid=alice tty=pts9 ses=2828 comm=curl exe=/usr/bin/curl key=CONNECT
      

      Le résultat contient les informations suivantes :

      • Le titre du processus : proctitle.
      • L'URL de la requête : curl metadata.goog/computeMetadata/v1beta1/instance/id.
      • L'emplacement de l'exécutable : exe=/usr/bin/curl.
      • L'utilisateur : uid=alice.

      Une fois les processus identifiés, vous pouvez supprimer la règle. Pour supprimer la règle, exécutez la commande suivante :

      sudo auditctl -d exit,always -F arch=b64 -S connect -k CONNECT

    Différences entre les points de terminaison du serveur de métadonnées v1beta1 et v1.0

    Le serveur de métadonnées v1 a un fonctionnement légèrement différent de celui du serveur v1beta1 précédent. Le nouveau serveur de métadonnées exige que toutes les requêtes contiennent l'en-tête Metadata-Flavor: Google. Ce dernier indique que la requête a été effectuée afin de récupérer les valeurs de métadonnées.

    Mettez à jour vos requêtes de manière à inclure ce nouvel en-tête. Par exemple, voici à quoi ressemble désormais une requête envoyée à l'attribut disks/ :

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

    Différences entre les points de terminaison du serveur de métadonnées v0.1 et v1.0

    En règle générale, les points de terminaison du serveur de métadonnées v0.1 et v1 présentent les différences suivantes :

    • La racine ayant permis d'interroger le point de terminaison du serveur de métadonnées est passée de http://metadata.google.internal/0.1/meta-data/ à http://metadata.google.internal/computeMetadata/v1/.
    • Les requêtes du serveur de métadonnées v1 doivent inclure l'en-tête Metadata-Flavor: Google. Par exemple, voici à quoi ressemble désormais une requête envoyée à l'attribut disks/ :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
    • Les métadonnées personnalisées peuvent être interrogées à la fois au niveau du projet et au niveau de l'instance.

      Dans le serveur de métadonnées v0.1, pour la propriété attributes/, les valeurs de métadonnées de l'instance et du projet se trouvent dans le même répertoire. Si un attribut possède à la fois des valeurs de métadonnées d'instance et de projet, la valeur de métadonnées de l'instance pour une clé donnée est renvoyée.

      Pour les requêtes effectuées sur le serveur de métadonnées v1, l'URL doit spécifier si des métadonnées d'instance ou de projet sont demandées. Par exemple, pour interroger l'attribut sshKeys, exécutez au moins l'une des actions suivantes :

      Pour l'attribut sshKeys défini sur le projet, exécutez la commande suivante :

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

      Pour l'attribut sshKeys défini sur cette instance, exécutez la commande suivante :

      curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/sshKeys" -H "Metadata-Flavor: Google"
    • Certaines entrées de métadonnées dans la version 0.1 renvoient des objets JSON. Dans le serveur de métadonnées v1, ces entrées de métadonnées sont organisées par répertoires. Cette organisation des entrées vous permet d'interroger des entrées d'index et des valeurs spécifiques pour ces champs précédemment imbriqués. Pour en savoir plus sur l'interrogation des listes de répertoires ou sur l'accès à des objets JSON dans le serveur de métadonnées v1, consultez la section Attributs en tant que listes de répertoires.

    Pour un mappage plus détaillé des points de terminaison des serveurs de métadonnées v0.1 à v1, consultez les tableaux ci-dessous.

    Attributs des instances

    Les entrées de métadonnées suivantes sont transférées dans le répertoire instance/ :

    Racine v0.1 - http://metadata.google.internal/0.1/meta-data/
    Racine v1 - http://metadata.google.internal/computeMetadata/v1
    Entrée de métadonnées Version URI (en fonction de la racine) Exemple de résultat :
    Description v0.1 description My instance description
    v1 instance/description
    Nom d'hôte v0.1 hostname my-instance.c.my-project.internal
    v1 instance/hostname
    Image v0.1 image projects/eip-images/global/images/debian-9-drawfork-v20180109
    v1 instance/image
    Type de machine v0.1 machine-type projects/12345/machineTypes/n1-standard-1
    v1 instance/machine-type
    Tags des instances v0.1 tags ["cheese", "lettuce"]
    v1 instance/tags
    Zone v0.1 zone projects/12345/zones/us-central1-c
    v1 instance/zone

    Attributs du projet

    Les entrées de métadonnées suivantes sont transférées dans le répertoire project/ :

    Racine v0.1 - http://metadata.google.internal/0.1/meta-data/
    Racine v1 - http://metadata.google.internal/computeMetadata/v1
    Entrée de métadonnées Version URI (en fonction de la racine) Exemple de résultat :
    ID du projet v0.1 project-id my-project
    v1 project/project-id
    ID numérique du projet v0.1 numeric-project-id 12345
    v1 project/numeric-project-id

    Attributs transférés

    Les entrées de métadonnées suivantes sont transférées vers un nouveau point de terminaison :

    Racine v0.1 - http://metadata.google.internal/0.1/meta-data/
    Racine v1 - http://metadata.google.internal/computeMetadata/v1
    Entrée de métadonnées Version URI (en fonction de la racine) Exemple de résultat :
    Domaine v0.1 domain c.my-project.internal
    v1 instance/hostname my-instance.c.my-project.internal

    Attributs renommés

    Les entrées de métadonnées suivantes sont renommées :

    Racine v0.1 - http://metadata.google.internal/0.1/meta-data/
    Racine v1 - http://metadata.google.internal/computeMetadata/v1
    Entrée de métadonnées Version URI (en fonction de la racine) Exemple de résultat :
    ID d'instance v0.1 instance-id 123456789
    v1 instance/id 123456789

    Attributs en tant que listes de répertoires

    Les entrées de métadonnées suivantes ont renvoyé des objets JSON dans la version 0.1 et sont organisées dans des répertoires dans la version v1.

    Pour ces entrées de métadonnées, vous pouvez utiliser l'une des méthodes suivantes pour accéder aux points de terminaison :

    Racine v0.1 - http://metadata.google.internal/0.1/meta-data/
    Racine v1 - http://metadata.google.internal/computeMetadata/v1
    Entrée de métadonnées Version URI (en fonction de la racine) Exemple de résultat :
    Disques v0.1 disks
    
    {"disks":[{
    "deviceName":"persistent-disk-0",
    "index":0,
    "mode":"READ_WRITE",
    "type":"PERSISTENT"}]}
    v1 instance/attached-disks/?recursive=true
    
    [{"deviceName": "persistent-disk-0",
    "index":0,
    "mode":"READ_WRITE",
    "type":"PERSISTENT"}]
    Interfaces réseau v0.1 network
    
    {"networkInterface":
    [{"accessConfiguration":
    [{"externalIp":"35.194.6.47",
    "type":"ONE_TO_ONE_NAT"}],
    "ip":"10.128.0.4",
    "mac":"42:01:0a:80:00:04","mtu":1460,
    "network":"projects/12345/networks/default"}]}
    v1 instance/network-interfaces/?recursive=true
    
    [{"accessConfigs":
    [{"externalIp":"35.194.6.47",
    "type":"ONE_TO_ONE_NAT"}],
    "dnsServers":["169.254.169.254"],
    "forwardedIps":[],
    "gateway":"10.128.0.1",
    "ip":"10.128.0.4",
    "ipAliases [],
    "mac":"42:01:0a:80:00:04","mtu":1460,
    "network":"projects/12345/networks/default",
    "subnetmask":"255.255.240.0","targetInstanceIps":[]}]
    Informations de compte de service (tous les comptes de service) v0.1 service-accounts
    
    {"serviceAccounts":
    [{"scopes":["https://www.googleapis.com/auth/devstorage.read_only"],
    "serviceAccount":"12345-compute@developer.gserviceaccount.com"}]}
    v1 instance/service-accounts/?recursive=true
    
    {"123451-compute@developer.gserviceaccount.com":
    {"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]},
    "default":{"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]}}
    Informations de compte de service (compte de service unique) v0.1 service-accounts/<email|default>
    
    {"scopes":["https://www.googleapis.com/auth/devstorage.read_only"],
    "serviceAccount":"123451-compute@developer.gserviceaccount.com"}
    
    v1 instance/service-accounts/<email|default>/?recursive=true
    
    {"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]}
    

    Interroger des jetons d'accès OAuth 2.0

    Les entrées de métadonnées suivantes renvoient des jetons d'accès OAuth2.

    Racine v0.1 - http://metadata.google.internal/0.1/meta-data/
    Racine v1 - http://metadata.google.internal/computeMetadata/v1
    Entrée de métadonnées Version URI (en fonction de la racine) Exemple de résultat :
    Jeton OAuth 2.0 v0.1 (Méthode 1)

    auth-token?service_account=<email|default>&scope=scopeA,scopeB

    ou

    auth_token?service_account=<email|default>&scope=scopeA,scopeB

    
    {"expires":1568854217,
    "oauth2_access_token":"ya29.c.KmyIB0i4tH1xLzKGrqeeK6TGWEW3b18Lcq...."}
    
    v0.1 (Méthode 2) service-accounts/<email|default>/acquire
    
    {"accessToken":"ya29.c.KmyIB0i4tH1xLNzKGrqeeK6TGWEW3b18Lcq.....",
    "expiresAt":1568854217,"expiresIn":2022}
    v1 instance/service-accounts/<email|default>/token
    
    {"access_token":"ya29.c.KmyIB0i4tH1xLNzKGrqeeK6TGWEW3b18Lcq....",
    "expires_in":2022,"token_type":"Bearer"}

    Applications nécessitant une mise à jour

    Pour utiliser le point de terminaison du serveur de métadonnées v1, mettez à jour les applications suivantes vers la version minimale compatible ou une version supérieure.

    Application Version minimale compatible
    Facter (développé par Puppet) 3.14.5
    Agent Stackdriver Monitoring 5.5.2-375

    Versions des bibliothèques compatibles

    Certaines bibliothèques Google ne sont pas concernées par la migration vers le point de terminaison du serveur de métadonnées v1. Toutefois, si vous utilisez l'une des bibliothèques répertoriées dans le tableau suivant, veillez à effectuer une mise à jour vers la version minimale compatible ou une version supérieure.

    Langue Bibliothèque Google Version minimale compatible
    Java com.google.api-client 1.18.0-rc
    Node.js google-cloud/debug-agent 3.0.0
    Node.js google-cloud/profiler 0.2.0
    Node.js google-cloud/trace-agent 2.11.0
    Node.js gcp-metadata 0.5.0
    Node.js gcs-resumable-upload 0.13.0
    Node.js googleapis 27.0.0
    Node.js google-auth-library 1.3.0
    Node.js google-cloud/bigquery 2.0.0
    Node.js google-cloud/bigquery-data-transfer 0.4.0
    Node.js google-cloud/bigtable 0.15.0
    Node.js google-cloud/cloud-container 0.3.0
    Node.js google-cloud/compute 0.11.0
    Node.js google-cloud/datastore 2.0.0
    Node.js dialogflow 0.6.0
    Node.js google-cloud/dlp 0.8.0
    Node.js google-cloud/dns 0.8.0
    Node.js google-cloud/error-reporting 0.5.0
    Node.js google-cloud/firestore 0.16.1
    Node.js google-cloud/language 2.0.0
    Node.js google-cloud/logging-bunyan 0.9.0
    Node.js google-cloud/logging 2.0.0
    Node.js google-cloud/logging-winston 0.10.0
    Node.js google-cloud/monitoring 0.6.0
    Node.js google-cloud/os-login 0.3.0
    Node.js google-cloud/pubsub 0.20.0
    Node.js google-cloud/redis 0.2.0
    Node.js google-cloud/resource 0.9.0
    Node.js google-cloud/spanner 2.0.0
    Node.js google-cloud/speech 2.0.0
    Node.js google-cloud/storage 2.0.0
    Node.js google-cloud/tasks 0.2.0
    Node.js google-cloud/text-to-speech 0.3.0
    Node.js google-cloud/translate 2.0.0
    Node.js google-cloud/vision 0.21.0
    Node.js google-cloud/profiler 0.2.0
    Node.js google-cloud/trace-agent 2.11.0
    Node.js google-gax 0.17.0
    Node.js gce-images 1.0.0
    Node.js gcp-metadata 0.5.0
    Node.js gcs-resumable-upload 0.13.0
    Node.js googleapis 27.0.0
    Node.js google-auth-library 1.3.0
    Node.js google-cloud/bigquery 2.0.0
    Node.js google-cloud/bigquery-data-transfer 0.4.0
    Node.js google-cloud/bigtable 0.15.0
    Node.js google-cloud/cloud-container 0.3.0
    Node.js google-cloud/common 0.18.0
    Node.js google-cloud/common-grpc 0.7.0
    Node.js google-cloud/compute 0.11.0
    Node.js google-cloud/datastore 2.0.0
    Node.js dialogflow 0.6.0
    Node.js google-cloud/dlp 0.8.0
    Node.js google-cloud/dns 0.8.0
    Node.js google-cloud/error-reporting 0.5.0
    Node.js google-cloud/firestore 0.16.1
    Node.js google-cloud/language 2.0.0
    Node.js google-cloud/logging 2.0.0
    Node.js google-cloud/logging-bunyan 0.9.0
    Node.js google-cloud/logging-winston 0.10.0
    Node.js google-cloud/monitoring 0.6.0
    Node.js google-cloud/os-login 0.3.0
    Node.js googleapis/nodejs-pubsub 0.20.0
    Node.js google-cloud/redis 0.2.0
    Node.js google-cloud/resource 0.9.0
    Node.js google-cloud/spanner 2.0.0
    Node.js google-cloud/speech 2.0.0
    Node.js google-cloud/storage 2.0.0
    Node.js google-cloud/tasks 0.2.0
    Node.js google-cloud/text-to-speech 0.3.0
    Node.js google-cloud/translate 2.0.0
    Node.js google-cloud/video-intelligence 1.3.0
    Node.js google-cloud/vision 0.21.0
    PHP google-cloud/video-intelligence 1.3.3
    Python oauth2client 2.0.0
    Python google-api-python-client 1.6.0
    Python googleapis/google-cloud-python 0.10.0
    Python google-cloud-happybase 0.20.0
    Ruby gcloud 0.11.1
    Ruby google-api-client 0.8.6
Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation Compute Engine