教學課程:針對地理延遲佈建
本教學課程說明如何使用配置原則,將多個模擬對稱金鑰裝置安全地佈建到 IoT 中樞群組。 IoT 中樞裝置佈建服務 (DPS) 透過其內建配置原則和對自訂配置原則的支援,來支援各種配置案例。
針對地理位置/地理延遲佈建是常見的配置案例。 當裝置在位置之間移動時,可透過將裝置佈建至最接近每個位置的 IoT 中樞以改善網路延遲。 在此案例中,會選取一群跨越多個區域的 IoT 中樞進行註冊。 系統會針對這些註冊選取內建的最低延遲配置原則。 此原則會促使裝置佈建服務評估裝置延遲,然後從一群 IoT 中樞中判斷出最接近的 IoT 中樞。
本教學課程會使用來自 Azure IoT C SDK 的模擬裝置範例,示範如何跨區域佈建裝置。 您將會在本教學課程中執行下列步驟:
- 使用 Azure CLI 建立兩個區域 IoT 中樞 (美國西部 2 與美國東部)
- 建立根據地理位置佈建裝置的註冊 (最低延遲)
- 使用 Azure CLI 建立兩個區域 Linux VM 作為相同區域 (美國西部 2 與美國東部) 中的裝置
- 在兩個 Linux VM 上設定適用於 Azure IoT C SDK 的開發環境
- 模擬裝置,並驗證其是否已佈建至最接近區域中的 IoT 中樞。
重要
某些區域可能會不時在建立虛擬機器時強加限制。 在撰寫本指南時,westus2 和 eastus 區域允許建立 VM。 如果無法在其中一個區域中建立,您可以嘗試不同的區域。 若要深入了解在建立 VM 時選擇 Azure 地理區域,請參閱 Azure 中虛擬機器的區域
必要條件
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
建立兩個區域 IoT 中樞
在本節中,您將會建立一個 Azure 資源群組,以及兩個新的區域 IoT 中樞資源。 一個 IoT 中樞將用於美國西部 2 區域,而另一個將用於美國東部區域。
重要
建議您針對本教學課程中建立的所有資源使用相同的資源群組。 這將會使您在完成之後更容易進行清除。
在 Azure Cloud Shell 中,使用下列 az group create 命令建立資源群組:
az group create --name contoso-us-resource-group --location eastus
在 eastus 位置中建立 IoT 中樞,並將其新增至您使用下列 az iot hub create 命令建立的資源群組 (將
{unique-hub-name}
取代為您自己的唯一名稱):az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
此命令可能會需要花費幾分鐘才能完成。
現在,於 westus2 位置中建立 IoT 中樞,並將其新增至您使用下列 az iot hub create 命令建立的資源群組 (將
{unique-hub-name}
取代為您自己的唯一名稱):az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
此命令可能會需要花費幾分鐘才能完成。
為地理延遲建立註冊
在本節中,您將會為裝置建立新的註冊群組。
為了簡單起見,本教學課程會使用對稱金鑰證明搭配註冊。 如需更安全的解決方案,請考慮使用 X.509 憑證證明與信任鏈結。
登入 Azure 入口網站,並瀏覽至您的裝置佈建服務執行個體。
從導覽功能表的 [設定] 區段選取 [管理註冊]。
選取 [新增註冊群組]。
在 [新增註冊群組] 頁面的 [註冊 + 佈建] 索引標籤上,提供下列資訊以設定註冊群組詳細資料:
欄位 描述 證明 選取 [對稱金鑰] 作為 [證明機制]。 對稱金鑰設定 核取 [自動產生對稱金鑰] 方塊。 群組名稱 將群組命名為 contoso-us-devices,或提供您自己的群組名稱。 註冊群組名稱是不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元: '-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或虛線 ('-'
)。選取 [下一步: IoT 中樞]。
請使用下列步驟,將您的兩個 IoT 中樞新增至註冊群組:
在 [新增註冊群組] 頁面的 [IoT 中樞] 索引標籤上,選取 [目標 IoT 中樞] 區段中的 [將連結新增至 IoT 中樞]。
在 [將連結新增至 IoT 中樞] 頁面上,選取您在 eastus 區域中建立的 IoT 中樞,並將 iothubowner 存取權指派給該中樞。
選取 [儲存]。
再次選取 [將連結新增至 IoT 中樞],並遵循相同的步驟,來新增您在 westus2 區域中建立的 IoT 中樞。
在 [目標 IoT 中樞] 下拉功能表中,選取這兩個 IoT 中樞。
針對 [配置原則],選取 [最低延遲]。
選取 [檢閱 + 建立]。
在 [檢閱 + 建立] 索引標籤上,驗證您的所有值,然後選取 [建立]。
一旦建立了註冊群組,請從註冊群組清單中選取其名稱 contoso-us-devices。
複製 [主索引鍵]。 此金鑰稍後將用來針對兩個模擬裝置產生唯一裝置金鑰。
建立區域 Linux VM
在本節中,您會建立兩部區域 Linux 虛擬機器 (VM),一部在美國西部 2,一部在美國東部 2。 這些 VM 會從每一區域執行裝置模擬範例,以示範針對來自這兩個區域的裝置進行裝置佈建。
為了方便清除,將這些 VM 新增至相同的資源群組 (contoso-us-resource-group),其中包含已建立的 IoT 中樞。
在 Azure Cloud Shell 中,於命令中進行下列參數變更之後,執行下列命令來建立美國東部區域 VM:
--name:輸入您美國東部區域裝置 VM 的唯一名稱。
--admin-username:使用您自己的系統管理員使用者名稱。
--admin-password:使用您自己的系統管理員密碼。
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
此命令將需要數分鐘才能完成。
一旦命令完成,請為您的美國東部區域 VM 複製 publicIpAddress 值。
在 Azure Cloud Shell 中,於命令中進行下列參數變更之後,執行命令來建立美國西部 2 區域 VM:
--name:為您的美國西部 2 區域裝置 VM 輸入唯一名稱。
--admin-username:使用您自己的系統管理員使用者名稱。
--admin-password:使用您自己的系統管理員密碼。
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
此命令將需要數分鐘才能完成。
一旦命令完成,請為您的美國西部 2 區域 VM 複製 publicIpAddress 值。
開啟兩個命令列殼層。
使用 SSH 連線至每個殼層中的其中一個區域 VM。
將您的管理員使用者名稱與您複製的公用 IP 位址,以參數方式傳遞至 SSH。 在系統提示時輸入系統管理員密碼。
ssh contosoadmin@1.2.3.4 contosoadmin@ContosoSimDeviceEast:~$
ssh contosoadmin@5.6.7.8 contosoadmin@ContosoSimDeviceWest:~$
準備 Azure IoT C SDK 開發環境
在本節中,您將會在每個 VM 上複製 Azure IoT C SDK。 SDK 包含一個從每個區域模擬裝置佈建的範例。
針對每個 VM:
使用下列命令安裝 CMake、g++、gcc 和 Git:
sudo apt-get update sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
尋找並複製最新版本 SDK 的標籤名稱。
在這兩個 VM 上,複製適用於 C 的 Azure IoT 裝置 SDK。 使用您在上一個步驟中找到的標籤作為
-b
參數的值,例如: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
預期此作業需要幾分鐘的時間才能完成。
在存放庫內部建立新的 cmake 資料夾,然後變更至該資料夾。
mkdir ~/azure-iot-sdk-c/cmake cd ~/azure-iot-sdk-c/cmake
請執行下列命令,其會建置開發用戶端平台特有的 SDK 版本:
cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON ..
建置成功後,最後幾行輸出會類似於下列輸出:
-- 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
衍生唯一的裝置金鑰
搭配群組註冊使用對稱金鑰證明時,您不會直接使用註冊群組金鑰。 相反地,您會從每個裝置的註冊群組金鑰中衍生唯一金鑰。
在教學課程的這個部分中,您將從群組主要金鑰中產生裝置金鑰,以計算裝置唯一登錄識別碼的 HMAC-SHA256。 然後結果會轉換成 Base64 格式。
重要
請勿在裝置程式碼中包含群組主要金鑰。
針對 eastus 和 westus2 裝置:
使用 openssl 來產生您的唯一金鑰。 您將使用下列 Bash 殼層指令碼 (將
{primary-key}
取代為您稍早複製的註冊群組主要金鑰,並針對每個裝置將{contoso-simdevice}
取代為您自己的唯一註冊識別碼。 登錄識別碼 (registration ID) 是一個不區分大小寫的字串 (長度最多為 128 個字元),該字串可包含英數字元加上特殊字元:'-'
、'.'
、'_'
、':'
。 最後一個字元必須是英數字元或破折號 ('-'
)。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
該指令碼會輸出類似下列金鑰的結果:
p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
現在,每個裝置都有自己的衍生裝置金鑰和唯一的註冊識別碼,以在佈建過程中搭配註冊群組執行對稱金鑰證明。
從每個區域模擬裝置
在本節中,您將會針對兩個區域 VM 更新 Azure IoT C SDK 中的佈建範例。
此範例程式碼會模擬將佈建要求傳送至裝置佈建服務執行個體的裝置開機順序。 此開機順序會導致裝置進行辨識,並根據延遲指派給最接近的 IoT 中樞。
在 Azure 入口網站中,為您的裝置佈建服務選取 [概觀] 索引標籤,並記下 [識別碼範圍] 值。
在兩個 VMS 上,開啟 ~/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
在兩個 VM 上,找出
id_scope
常數,並將其值取代為您先前複製的 [識別碼範圍] 值。static const char* id_scope = "0ne00002193";
在兩個 VM 上,於相同的檔案中找出
main()
函式的定義。 確定hsm_type
變數如下所示設定為SECURE_DEVICE_TYPE_SYMMETRIC_KEY
,以符合註冊群組證明方法。將變更儲存到兩部 VM 中的檔案。
SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; //hsm_type = SECURE_DEVICE_TYPE_X509; hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
在兩個 VM 上,尋找 prov_dev_client_sample.c 中對
prov_dev_set_symmetric_key_info()
的呼叫,其會註解化。// Set the symmetric key if using they auth type //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
取消註解函式呼叫,並將預留位置值 (包括角括號) 取代為每個裝置的唯一註冊識別碼和衍生裝置金鑰,這是您在上節衍生的。 以下顯示的金鑰是範例。 請使用您之前產生的金鑰。
美國東部:
// Set the symmetric key if using they auth type prov_dev_set_symmetric_key_info("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
美國西部:
// Set the symmetric key if using they auth type prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
在兩個 VM 上,儲存檔案。
在兩部 VM 上,瀏覽至如下所示的範例資料夾,然後建立範例。
cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/ cmake --build . --target prov_dev_client_sample --config Debug
一旦成功建立,請在兩個 VM 上執行 prov_dev_client_sample.exe,以從每個區域模擬裝置。 請注意,每個裝置都會配置給最接近模擬裝置所在區域的 IoT 中樞。
執行模擬:
~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
從美國東部 VM 輸出的範例:
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:
從美國西部 VM 輸出的範例:
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:
清除資源
如果您打算繼續使用在本教學課程中建立的資源,可以將其保留。 否則,請使用下列步驟來刪除本教學課程建立的所有資源,以避免不必要的費用。
以下步驟假設您依照指示在名為 contoso-us-resource-group 的相同資源群組中建立了本教學課程中的所有資源。
重要
刪除資源群組是無法回復的動作。 資源群組和其中包含的所有資源都將永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有的資源群組內建立了 IoT 中樞,而該群組中包含您想要保留的資源,則您只需刪除 IoT 中樞本身即可,而不要刪除資源群組。
依名稱刪除資源群組:
登入 Azure 入口網站。
選取 [資源群組]。
在 [依名稱篩選] 文字方塊中,輸入您的資源所屬的資源群組名稱 contoso-us-resource-group。
在結果清單中的資源群組右側,按一下 ...,然後按一下 [刪除資源群組]。
系統將會要求您確認是否刪除資源。 再次輸入您的資源群組名稱以進行確認,然後選取 [刪除]。 片刻過後,系統便會刪除該資源群組及其所有內含的資源。
下一步
若要深入了解自訂配置原則,請參閱