Tutoriel : Provisionner pour la géolatence

Ce tutoriel explique comment provisionner de façon sécurisée plusieurs appareils simulés dotés de clés symétriques sur un groupe de hubs IoT à l’aide d’une stratégie d’allocation. Le service IoT Hub Device Provisioning (DPS) prend en charge divers scénarios d’allocation par le biais de ses stratégies d’allocation intégrées et de sa prise en charge des stratégies d’allocation personnalisées.

Le provisionnement pour la géolocalisation/géolatence est un scénario d’allocation courant. Quand un appareil change d’emplacement, il doit être provisionné dans le hub IoT le plus proche de son emplacement afin d’améliorer la latence du réseau. Dans ce scénario, un groupe de hubs IoT couvrant plusieurs régions sont sélectionnés pour les inscriptions. La stratégie d’allocation Latence la plus faible intégrée est sélectionnée pour ces inscriptions. Avec cette stratégie, le service Device Provisioning évalue la latence des appareils et détermine quel hub IoT dans le groupe de hubs IoT est le plus proche.

Ce tutoriel utilise un exemple d’appareil simulé du SDK Azure IoT pour C afin de montrer comment provisionner des appareils entre plusieurs régions. Dans ce tutoriel, vous allez effectuer les étapes suivantes :

  • Utiliser Azure CLI pour créer deux hubs IoT régionaux (USA Ouest 2 et USA Est)
  • Créer une inscription qui provisionne des appareils en fonction de la géolocalisation (latence la plus faible)
  • Utiliser Azure CLI pour créer deux machines virtuelles Linux régionales jouant le rôle d’appareils dans les mêmes régions (USA Ouest 2 et USA Est)
  • Configurer l’environnement de développement nécessaire au SDK Azure IoT pour C sur les deux machines virtuelles Linux
  • Simuler les appareils et vérifier qu’ils sont provisionnés dans le hub IoT dans la région la plus proche

Important

Certaines régions peuvent, de temps en temps, imposer des restrictions sur la création de machines virtuelles. Au moment de la rédaction de ce guide, les régions westus2 et eastus permettaient la création de machines virtuelles. Si vous ne parvenez pas à créer dans l’une de ces régions, vous pouvez essayer une autre région. Pour en savoir plus sur le choix des régions géographiques Azure lors de la création de machines virtuelles, consultez Régions pour machines virtuelles dans Azure.

Prérequis

Créer deux hubs IoT régionaux

Dans cette section, vous allez créer un groupe de ressources Azure et deux nouvelles ressources régionales IoT Hub. Un hub IoT est destiné à la région USA Ouest 2 et l’autre à la région USA Est.

Important

Il est recommandé d’utiliser le même groupe de ressources pour toutes les ressources créées dans ce tutoriel. Cela facilitera la suppression des ressources quand vous aurez terminé.

  1. Dans Azure Cloud Shell, créez un groupe de ressources avec la commande az group create suivante :

    az group create --name contoso-us-resource-group --location eastus
    
  2. Créez un hub IoT à l’emplacement eastus, puis ajoutez-le au groupe de ressources que vous avez créé à l’aide de la commande az iot hub create suivante (remplacez {unique-hub-name} par votre propre nom unique) :

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
    

    Cette commande peut prendre plusieurs minutes.

  3. Maintenant, créez un hub IoT à l’emplacement westus2, puis ajoutez-le au groupe de ressources que vous avez créé à l’aide de la commande az iot hub create suivante (remplacez {unique-hub-name} par votre propre nom unique) :

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
    

    Cette commande peut prendre plusieurs minutes.

Créer une inscription pour la géolatence

Dans cette section, vous allez créer un groupe d’inscriptions pour vos appareils.

Par souci de simplicité, ce tutoriel utilise l’attestation de clé symétrique avec l’inscription. Pour sécuriser votre solution, utilisez plutôt l’attestation de certificat X.509 avec une chaîne d’approbation.

  1. Connectez-vous au portail Azure et accédez à votre instance du service Device Provisioning.

  2. Sélectionnez Gérer les inscriptions dans la section Paramètres du menu de navigation.

  3. Sélectionnez Ajouter un groupe d’inscriptions.

  4. Sous l’onglet Inscription + approvisionnement de la page Ajouter un groupe d’inscriptions, fournissez les informations suivantes pour configurer les détails du groupe d’inscription :

    Champ Description
    Attestation Sélectionnez Clé symétrique comme Mécanisme d’attestation.
    Paramètres de clé symétrique Cochez la case Générer automatiquement des clés symétriques.
    Nom du groupe Nommez votre groupe contoso-us-devices ou indiquez votre propre nom de groupe. Le nom du groupe d’inscription est une chaîne insensible à la casse (jusqu’à 128 caractères) de caractères alphanumériques et des caractères spéciaux : '-', '.', '_', ':'. Le dernier caractère doit être alphanumérique ou être un tiret ('-').
  5. Sélectionnez Suivant : IoT Hubs.

  6. Procédez comme suit pour ajouter vos deux hubs IoT au groupe d’inscriptions :

    1. Sous l’onglet Hubs IoT de la page Ajouter un groupe d’inscriptions, sélectionnez Ajouter un lien au hub IoT dans la section Hubs IoT cibles.

    2. Dans la page Ajouter un lien au hub IoT, sélectionnez le hub IoT que vous avez créé dans la région eastus et attribuez-lui l’accès iothubowner.

    3. Sélectionnez Enregistrer.

    4. Sélectionnez à nouveau Ajouter un lien au hub IoT, puis suivez les mêmes étapes pour ajouter le hub IoT que vous avez créé dans la région westus2.

    5. Dans le menu déroulant Hubs IoT cibles, sélectionnez les deux hubs IoT.

  7. Pour la Stratégie d’allocation, sélectionnez Latence la plus faible.

  8. Sélectionnez Revoir + créer.

  9. Dans l’onglet Examiner et créer, vérifiez toutes vos valeurs, puis sélectionnez Créer.

  10. Une fois votre groupe d’inscriptions créé, sélectionnez son nom contoso-us-devices dans la liste des groupes d’inscription.

  11. Copiez la clé primaire. Cette clé primaire servira ultérieurement à générer des clés uniques pour les deux appareils simulés.

Créer des machines virtuelles Linux régionales

Dans cette section, vous allez créer deux machines virtuelles Linux régionales, l’une dans USA Ouest 2 et l’autre dans USA Est 2. Ces machines virtuelles exécutent un exemple de simulation d’appareil de chaque région pour illustrer l’approvisionnement d’appareils dans les deux régions.

Pour faciliter la suppression des ressources à la fin de l’article, ajoutez ces machines virtuelles au même groupe de ressources où vous avez créé les hubs IoT, à savoir contoso-us-resource-group.

  1. Dans Azure Cloud Shell, exécutez la commande ci-dessous pour créer une machine virtuelle dans la région USA Est, après avoir modifié les paramètres de la commande de la façon suivante :

    --name : entrez un nom unique pour la machine virtuelle de la région USA Est.

    --admin-username : utilisez votre propre nom d’utilisateur administrateur.

    --admin-password : utilisez votre propre mot de passe d’administrateur.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceEast \
    --location eastus \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Cette commande prend plusieurs minutes.

  2. Une fois la commande exécutée, copiez la valeur publicIpAddress de la machine virtuelle de la région USA Est.

  3. Dans Azure Cloud Shell, exécutez la commande ci-dessous pour créer une machine virtuelle dans la région USA Ouest 2, après avoir modifié les paramètres de la commande de la façon suivante :

    --name : entrez un nom unique pour la machine virtuelle de la région USA Ouest 2.

    --admin-username : utilisez votre propre nom d’utilisateur administrateur.

    --admin-password : utilisez votre propre mot de passe d’administrateur.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceWest2 \
    --location westus2 \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Cette commande prend plusieurs minutes.

  4. Une fois la commande exécutée, copiez la valeur publicIpAddress de la machine virtuelle de la région USA Ouest 2.

  5. Ouvrez deux interpréteurs en ligne de commande.

  6. Connectez-vous à l’une des machines virtuelles régionales dans chaque interpréteur à l’aide de SSH.

    Dans SSH, entrez votre nom d’utilisateur administrateur ainsi que l’adresse IP publique que vous avez copiée comme paramètres dans SSH. Entrez le mot de passe d’administrateur lorsque vous y êtes invité.

    ssh contosoadmin@1.2.3.4
    
    contosoadmin@ContosoSimDeviceEast:~$
    
    ssh contosoadmin@5.6.7.8
    
    contosoadmin@ContosoSimDeviceWest:~$
    

Préparer l’environnement de développement nécessaire au SDK Azure IoT pour C

Dans cette section, vous allez cloner le SDK Azure IoT pour C sur chaque machine virtuelle. Le SDK contient un exemple qui simule le provisionnement d’appareils dans chaque région.

Pour chaque machine virtuelle :

  1. Installez CMake, g++ , gcc et Git à l’aide des commandes suivantes :

    sudo apt-get update
    sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
    
  2. Recherchez et copiez le nom d’étiquette de la version la plus récente du SDK.

  3. Cloner l’appareil SDK Azure IoT pour C sur les deux machines virtuelles. Utilisez l’étiquette obtenue à l’étape précédente comme valeur pour le paramètre -b, par exemple : lts_01_2023.

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    Attendez-vous à ce que cette opération prenne plusieurs minutes.

  4. Créez un dossier cmake dans le référentiel et accédez à ce dossier.

    mkdir ~/azure-iot-sdk-c/cmake
    cd ~/azure-iot-sdk-c/cmake
    
  5. Exécutez la commande suivante qui génère une version du SDK propre à votre plateforme cliente de développement :

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    
  6. Une fois la génération terminée, les dernières lignes de sortie doivent ressembler à la sortie suivante :

    -- IoT Client SDK Version = 1.7.0
    -- Provisioning SDK Version = 1.7.0
    -- Looking for include file stdint.h
    -- Looking for include file stdint.h - found
    -- Looking for include file stdbool.h
    -- Looking for include file stdbool.h - found
    -- target architecture: x86_64
    -- Performing Test CXX_FLAG_CXX11
    -- Performing Test CXX_FLAG_CXX11 - Success
    -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so
    -- target architecture: x86_64
    -- iothub architecture: x86_64
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/contosoadmin/azure-iot-sdk-c/azure-iot-sdk-c
    

Dériver les clés d’appareil uniques

Quand vous utilisez l’attestation de clé symétrique avec des inscriptions de groupe, vous ne vous servez pas directement des clés du groupe d’inscriptions. Au lieu de cela, vous dérivez une clé unique à partir de la clé de groupe d’inscriptions pour chaque appareil.

Dans cette partie du tutoriel, vous allez générer une clé d’appareil à partir de la clé principale de groupe pour calculer un HMAC-SHA256 de l’ID d’inscription unique de l’appareil. Le résultat est ensuite converti au format Base64.

Important

N’incluez pas votre clé principale de groupe dans le code de l’appareil.

Pour les deux appareils eastus et westus2 :

  1. Générez votre clé unique à l’aide d’openssl. Vous allez utiliser le script d’interpréteur de commandes Bash suivant (remplacez {primary-key} par la clé primaire du groupe d’inscriptions que vous avez copiée précédemment et remplacez {contoso-simdevice} par votre propre ID d’inscription unique pour chaque appareil. L’ID d’inscription est une chaîne insensible à la casse (jusqu’à 128 caractères) de caractères alphanumériques et des caractères spéciaux : '-', '.', '_', ':'. Le dernier caractère doit être alphanumérique ou être un tiret ('-').

    KEY={primary-key}
    REG_ID={contoso-simdevice}
    
    keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
    echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
    
  2. Le script va générer la clé suivante :

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    
  3. Maintenant, chaque appareil a sa propre clé d’appareil dérivée et un ID d’inscription unique pour effectuer l’attestation de clé symétrique avec le groupe d’inscriptions lors du processus de provisionnement.

Simuler les appareils de chaque région

Dans cette section, vous allez mettre à jour un exemple de provisionnement du SDK Azure IoT pour C sur les deux machines virtuelles régionales.

L’exemple de code simule une séquence de démarrage d’un appareil qui envoie la demande de provisionnement à votre instance du service Device Provisioning. La séquence de démarrage entraîne la reconnaissance de l’appareil et son attribution au hub IoT le plus proche en fonction de la latence.

  1. Dans le portail Azure, sélectionnez l’onglet Vue d’ensemble de votre service Device Provisioning et notez la valeur Étendue de l’ID.

    Extraction des informations de point de terminaison du service Device Provisioning à partir du panneau du Portail

  2. Sur les deux machines virtuelles à modifier, ouvrez ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c.

    vi ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c
    
  3. Sur les deux machines virtuelles, recherchez la constante id_scope et remplacez la valeur par la valeur Étendue de l’ID que vous avez copiée précédemment.

    static const char* id_scope = "0ne00002193";
    
  4. Sur les deux machines virtuelles, recherchez la définition de la fonction main() dans le même fichier. Assurez-vous que la variable hsm_type est définie sur SECURE_DEVICE_TYPE_SYMMETRIC_KEY, comme dans l’exemple ci-dessous, pour correspondre à la méthode d’attestation du groupe d’inscription.

    Enregistrez vos modifications dans les fichiers sur les deux machines virtuelles.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  5. Sur les deux machines virtuelles, recherchez l’appel à prov_dev_set_symmetric_key_info() dans prov_dev_client_sample.c, qui est placé en commentaire.

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    Décommentez l’appel de fonction et remplacez les valeurs des espaces réservés (y compris les crochets) par les ID d’inscription uniques et les clés d’appareil dérivées pour chaque appareil issues de la section précédente. Les clés présentés ci-dessous sont des exemples. Utilisez les clés que vous avez générées précédemment.

    USA Est :

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
    

    USA Ouest :

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
    
  6. Sur les deux machines virtuelles, enregistrez le fichier.

  7. Sur les deux machines virtuelles, accédez au dossier d’exemple ci-dessous et générez l’exemple.

    cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/
    cmake --build . --target prov_dev_client_sample --config Debug
    
  8. Une fois l’exemple généré, exécutez prov_dev_client_sample.exe sur les deux machines virtuelles pour simuler un appareil de chaque région. Notez que chaque appareil est alloué au hub IoT le plus proche de la région de l’appareil simulé.

    Exécutez la simulation :

    ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
    

    Exemple de sortie de la machine virtuelle USA Est :

    contosoadmin@ContosoSimDeviceEast:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-east-hub.azure-devices.net, deviceId: contoso-simdevice-east
    Press enter key to exit:
    
    

    Exemple de sortie de la machine virtuelle USA Ouest :

    contosoadmin@ContosoSimDeviceWest:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-west-hub.azure-devices.net, deviceId: contoso-simdevice-west
    Press enter key to exit:
    

Nettoyer les ressources

Si vous envisagez de continuer à utiliser les ressources créées dans ce tutoriel, vous pouvez les conserver. Sinon, effectuez les étapes suivantes pour supprimer toutes les ressources qui ont été créées dans le cadre de ce tutoriel, et ainsi éviter des frais inutiles.

Les étapes décrites partent du principe que vous avez créé toutes les ressources utilisées dans ce tutoriel dans le même groupe de ressources nommé contoso-us-resource-group, comme nous vous l’avions demandé.

Important

La suppression d’un groupe de ressources est irréversible. Le groupe de ressources et toutes les ressources qu’il contient sont supprimés définitivement. Veillez à ne pas supprimer accidentellement les mauvaises ressources ou le mauvais groupe de ressources. Si vous avez créé l’IoT Hub à l’intérieur d’un groupe de ressources existant qui concerne des ressources que vous souhaitez conserver, supprimer uniquement la ressource de l’ IoT Hub au lieu de supprimer le groupe de ressources.

Pour supprimer le groupe de ressources par nom :

  1. Connectez-vous au portail Azure.

  2. Sélectionnez Groupes de ressources.

  3. Dans la zone de texte Filtrer par nom..., tapez le nom du groupe de ressources contenant vos ressources (ici, contoso-us-resource-group).

  4. À droite de votre groupe de ressources dans la liste des résultats, cliquez sur ..., puis sur Supprimer le groupe de ressources.

  5. Il vous sera demandé de confirmer la suppression du groupe de ressources. Saisissez à nouveau le nom de votre groupe de ressources pour confirmer, puis sélectionnez Supprimer. Après quelques instants, le groupe de ressources et toutes les ressources qu’il contient sont supprimés.

Étapes suivantes

Pour plus d’informations sur les stratégies d’allocation personnalisées, consultez :