IoT Edge設(shè)備將發(fā)送HTTPS請(qǐng)求以與IoT中心進(jìn)行通信。如果設(shè)備已連接到使用代理服務(wù)器的網(wǎng)絡(luò),則需要將IoT Edge運(yùn)行時(shí)配置為通過(guò)該服務(wù)器進(jìn)行通信。如果代理服務(wù)器發(fā)出不通過(guò)IoT Edge中心路由的HTTP或HTTPS請(qǐng)求,則可能還會(huì)影響各個(gè)IoT Edge模塊。
本文將引導(dǎo)你完成以下四個(gè)步驟,來(lái)配置并管理代理服務(wù)器后面的IoT Edge設(shè)備:
1.在設(shè)備上安裝IoT Edge運(yùn)行時(shí)
IoT Edge安裝腳本從Internet提取包和文件,因此,設(shè)備需要通過(guò)代理服務(wù)器通信,以發(fā)出這些請(qǐng)求。對(duì)于Windows設(shè)備,安裝腳本還會(huì)提供脫機(jī)安裝選項(xiàng)。
此步驟是首次設(shè)置IoT Edge設(shè)備時(shí)對(duì)其進(jìn)行配置的一次性過(guò)程。更新IoT Edge運(yùn)行時(shí)時(shí),也需要使用相同的連接。
2.在設(shè)備上配置Docker守護(hù)程序和IoT Edge守護(hù)程序
IoT Edge使用設(shè)備上的兩個(gè)守護(hù)程序,這些守護(hù)程序需要通過(guò)代理服務(wù)器發(fā)出Web請(qǐng)求。IoT Edge守護(hù)程序負(fù)責(zé)與IoT中心通信。Moby守護(hù)程序負(fù)責(zé)容器管理,因此將與容器注冊(cè)表通信。
此步驟是首次設(shè)置IoT Edge設(shè)備時(shí)對(duì)其進(jìn)行配置的一次性過(guò)程。
3.在設(shè)備上的config.yaml文件中配置IoT Edge代理屬性
IoT Edge守護(hù)程序最初會(huì)啟動(dòng)edgeAgent模塊。然后,edgeAgent模塊從IoT中心檢索部署清單,并啟動(dòng)其他所有模塊。要使IoT Edge代理能夠與IoT中心建立初始連接,請(qǐng)?jiān)谠O(shè)備本身上手動(dòng)配置edgeAgent模塊環(huán)境變量。建立初始連接后,可以遠(yuǎn)程配置edgeAgent模塊。
此步驟是首次設(shè)置IoT Edge設(shè)備時(shí)對(duì)其進(jìn)行配置的一次性過(guò)程。
4.針對(duì)將來(lái)的所有模塊部署設(shè)置環(huán)境變量,使任何模塊都可以通過(guò)代理進(jìn)行通信
設(shè)置IoT Edge設(shè)備并通過(guò)代理服務(wù)器將其連接到IoT中心后,需要在將來(lái)的所有模塊部署中保持該連接。
此步驟是遠(yuǎn)程執(zhí)行的持續(xù)過(guò)程,目的是在每次更換新模塊或更新部署后,設(shè)備仍可通過(guò)代理服務(wù)器通信。
知道你的代理URL
在開始執(zhí)行本文中的任何步驟之前,需要知道你的代理URL。
代理URL采用以下格式:protocol://proxy_host:proxy_port。
·protocol是HTTP或HTTPS。Docker守護(hù)程序可以根據(jù)容器注冊(cè)表設(shè)置使用任一協(xié)議,但I(xiàn)oT Edge守護(hù)程序和運(yùn)行時(shí)容器應(yīng)始終使用HTTP連接到代理。
·proxy_host是代理服務(wù)器的地址。如果代理服務(wù)器要求進(jìn)行身份驗(yàn)證,則可采用user:password proxy_host格式將憑據(jù)作為proxy_host的一部分提供。
·proxy_port是代理用來(lái)響應(yīng)網(wǎng)絡(luò)流量的網(wǎng)絡(luò)端口。
通過(guò)代理安裝運(yùn)行時(shí)
無(wú)論IoT Edge設(shè)備是在Windows還是Linux上運(yùn)行,都需要通過(guò)代理服務(wù)器訪問(wèn)安裝包。請(qǐng)據(jù)所用的操作系統(tǒng),遵循相應(yīng)的步驟通過(guò)代理服務(wù)器安裝IoT Edge運(yùn)行時(shí)。
Linux設(shè)備
若要在Linux設(shè)備上安裝IoT Edge運(yùn)行時(shí),請(qǐng)將包管理器配置為通過(guò)代理服務(wù)器訪問(wèn)安裝包。例如,設(shè)置apt-get以使用http-proxy。配置包管理器后,請(qǐng)按照安裝Azure IoT Edge運(yùn)行時(shí)中的說(shuō)明照常進(jìn)行操作。
Windows設(shè)備
若要在Windows設(shè)備上安裝IoT Edge運(yùn)行時(shí),需要兩次通過(guò)代理服務(wù)器執(zhí)行操作。第一個(gè)連接用于下載安裝程序腳本文件,第二個(gè)連接用于在安裝過(guò)程中下載必需的組件??梢栽赪indows設(shè)置中配置代理信息,或直接在PowerShell命令中包含代理信息。
以下步驟演示使用-proxy參數(shù)安裝Windows的示例:
1.Invoke-WebRequest命令需要獲得代理信息才能訪問(wèn)安裝程序腳本。然后,Deploy-IoTEdge命令需要獲得代理信息才能下載安裝文件。
PowerShell
.{Invoke-WebRequest-proxy<proxy URL>-useb aka.ms/iotedge-win}|Invoke-Expression;Deploy-IoTEdge-proxy<proxy URL>
2.Initialize-IoTEdge命令不需經(jīng)過(guò)代理服務(wù)器,因此第二步僅需Invoke-WebRequest的代理信息。
PowerShell
.{Invoke-WebRequest-proxy<proxy URL>-useb aka.ms/iotedge-win}|Invoke-Expression;Initialize-IoTEdge
如果擁有不能包含在URL中的復(fù)雜代理服務(wù)器憑據(jù),請(qǐng)使用-InvokeWebRequestParameters中的-ProxyCredential參數(shù)。例如,
PowerShell
$proxyCredential=(Get-Credential).GetNetworkCredential()
.{Invoke-WebRequest-proxy<proxy URL>-ProxyCredential$proxyCredential-useb aka.ms/iotedge-win}|Invoke-Expression;`
Deploy-IoTEdge-InvokeWebRequestParameters {'-Proxy'='<proxy URL>';'-ProxyCredential'=$proxyCredential}
有關(guān)代理參數(shù)的詳細(xì)信息,請(qǐng)參閱Invoke-WebRequest。有關(guān)Windows安裝參數(shù)的詳細(xì)信息,請(qǐng)參閱Windows上IoT Edge的PowerShell腳本。
配置守護(hù)程序
IoT Edge依賴于IoT Edge設(shè)備上運(yùn)行的兩個(gè)守護(hù)程序。Moby守護(hù)程序發(fā)出Web請(qǐng)求,以從容器注冊(cè)表中拉取容器映像。IoT Edge守護(hù)程序發(fā)出Web請(qǐng)求,以與IoT中心進(jìn)行通信。
Moby和IoT Edge守護(hù)程序都需要配置為使用代理服務(wù)器持續(xù)獲得設(shè)備功能。需在最初設(shè)置設(shè)備期間,在IoT Edge設(shè)備上執(zhí)行此步驟。
Moby守護(hù)程序
由于Moby是基于Docker的,因此若要使用環(huán)境變量配置Moby守護(hù)程序,請(qǐng)參閱Docker文檔。大多數(shù)容器注冊(cè)表(包括DockerHub和Azure容器注冊(cè)表)支持HTTPS請(qǐng)求,因此,你應(yīng)當(dāng)設(shè)置的變量為HTTPS_PROXY。如果要從不支持傳輸層安全性(TLS)的注冊(cè)表中拉取映像,則應(yīng)當(dāng)設(shè)置HTTP_PROXY。
選擇適用于IoT Edge設(shè)備操作系統(tǒng)的文章:
·在Linux上配置Docker守護(hù)程序Linux設(shè)備上的Moby守護(hù)程序保留“Docker”這一名稱。
·在Windows上配置Docker守護(hù)程序Windows設(shè)備上的Moby守護(hù)程序名為iotedge-moby。之所以讓這些名稱保持不同,是因?yàn)榭赡軙?huì)在Windows設(shè)備上并行運(yùn)行Docker Desktop和Moby。
IoT Edge守護(hù)程序
IoT Edge守護(hù)程序以類似的方式配置為Moby守護(hù)程序。使用以下步驟根據(jù)所使用的操作系統(tǒng)為服務(wù)設(shè)置環(huán)境變量。
IoT Edge守護(hù)程序始終使用HTTPS將請(qǐng)求發(fā)送到IoT中心。
Linux
在終端中打開編輯器以配置IoT Edge守護(hù)程序。
Bash
sudo systemctl edit iotedge
輸入以下文本,將<proxy URL>替換為代理服務(wù)器地址和端口。然后,保存并退出。
ini
[Service]
Environment="https_proxy=<proxy URL>"
刷新服務(wù)管理器以選取IoT Edge的新配置。
Bash
sudo systemctl daemon-reload
重新啟動(dòng)IoT Edge以使更改生效。
Bash
sudo systemctl restart iotedge
確認(rèn)已創(chuàng)建環(huán)境變量并加載了新配置。
Bash
systemctl show--property=Environment iotedge
Windows
以管理員身份打開PowerShell窗口,運(yùn)行以下命令來(lái)使用新的環(huán)境變量編輯注冊(cè)表。將<proxy url>替換為代理服務(wù)器地址和端口。
PowerShell
reg add HKLMSYSTEMCurrentControlSetServicesiotedge/v Environment/t REG_MULTI_SZ/d https_proxy=<proxy URL>
重新啟動(dòng)IoT Edge以使更改生效。
PowerShell
Restart-Service iotedge
配置IoT Edge代理
IoT Edge代理是在任意IoT Edge設(shè)備上啟動(dòng)的第一個(gè)模塊。該代理基于IoT Edge config.yaml文件中的信息首次啟動(dòng),IoT Edge代理隨后連接到IoT中心以檢索部署清單,其中聲明了應(yīng)在設(shè)備上部署的其他模塊。
需在最初設(shè)置設(shè)備期間,在IoT Edge設(shè)備上執(zhí)行此步驟一次。
1.打開IoT Edge設(shè)備上的config.yaml文件。在Linux系統(tǒng)上,此文件位于/etc/iotedge/config.yaml。在Windows系統(tǒng)上,此文件位于C:ProgramDataiotedgeconfig.yaml。配置文件是受保護(hù)的,因此,你需要管理權(quán)限才能對(duì)其進(jìn)行訪問(wèn)。在Linux系統(tǒng)上,請(qǐng)使用sudo命令,然后在偏好的文本編輯器中打開該文件。在Windows上,請(qǐng)以管理員身份打開記事本之類的文本編輯器,然后打開該文件。
2.在config.yaml文件中,找到“Edge代理模塊規(guī)范”部分。IoT Edge代理定義包括可以在其中添加環(huán)境變量的env參數(shù)。
3.刪除作為env參數(shù)占位符的大括號(hào),并在新行上添加新變量。請(qǐng)記住,YAML中的縮進(jìn)為兩個(gè)空格。
YAML
https_proxy:"<proxy URL>"
4.默認(rèn)情況下,IoT Edge運(yùn)行時(shí)使用AMQP與IoT中心通信。某些代理服務(wù)器會(huì)阻止AMQP端口。如果是這種情況,則還需要將edgeAgent配置為使用基于WebSocket的AMQP。添加第二個(gè)環(huán)境變量。
YAML
UpstreamProtocol:"AmqpWs"
5.將更改保存到config.yaml并關(guān)閉編輯器。重新啟動(dòng)IoT Edge以使更改生效。
·Linux:
Bash
sudo systemctl restart iotedge
·Windows:
PowerShell
Restart-Service iotedge
配置部署清單
將IoT Edge設(shè)備配置為與代理服務(wù)器配合使用后,還需要在將來(lái)的部署清單中聲明HTTPS_PROXY環(huán)境變量。可以使用Azure門戶向?qū)Щ蛘咄ㄟ^(guò)編輯部署清單JSON文件,來(lái)編輯部署清單。
始終配置兩個(gè)運(yùn)行時(shí)模塊(edgeAgent和edgeHub),以通過(guò)代理服務(wù)器進(jìn)行通信,從而維持與IoT中心的連接。如果從edgeAgent模塊中刪除了代理信息,則重新建立連接的唯一方法是根據(jù)前一部分中所述,編輯設(shè)備上的config.yaml文件。
除了edgeAgent和edgeHub模塊外,其他模塊也可能需要代理配置。需要訪問(wèn)IoT中心以外的Azure資源(例如blob存儲(chǔ))的模塊必須已在部署清單文件中指定HTTPS_PROXY變量。
以下過(guò)程在IoT Edge設(shè)備的整個(gè)生命周期中適用。
Azure門戶
使用“設(shè)置模塊”向?qū)镮oT Edge設(shè)備創(chuàng)建部署時(shí),每個(gè)模塊都有一個(gè)可在其中配置代理服務(wù)器連接的“環(huán)境變量”部分。
若要配置IoT Edge代理和IoT Edge中心模塊,請(qǐng)?jiān)谙驅(qū)У牡谝徊街羞x擇“運(yùn)行時(shí)設(shè)置”。
將https_proxy環(huán)境變量添加到IoT Edge代理和IoT Edge中心模塊定義。如果在IoT Edge設(shè)備的config.yaml文件中包括UpstreamProtocol環(huán)境變量,也請(qǐng)將其添加到IoT Edge代理模塊定義。
添加到部署清單的所有其他模塊都遵循相同的模式。
JSON部署清單文件
如果使用Visual Studio Code中的模板或通過(guò)手動(dòng)創(chuàng)建JSON文件來(lái)為IoT Edge設(shè)備創(chuàng)建部署,則可以將環(huán)境變量直接添加到每個(gè)模塊定義。
使用以下JSON格式:
JSON
"env":{
"https_proxy":{
"value":"<proxy URL>"
}
}
如果包括環(huán)境變量,模塊定義應(yīng)類似以下edgeHub示例:
JSON
"edgeHub":{
"type":"docker",
"settings":{
"image":"mcr.microsoft.com/azureiotedge-hub:1.1",
"createOptions":""
},
"env":{
"https_proxy":{
"value":"http://proxy.example.com:3128"
}
},
"status":"running",
"restartPolicy":"always"
}
如果在IoT Edge設(shè)備的confige.yaml文件中包括UpstreamProtocol環(huán)境變量,也請(qǐng)將其添加到IoT Edge代理模塊定義。
JSON
"env":{
"https_proxy":{
"value":"<proxy URL>"
},
"UpstreamProtocol":{
"value":"AmqpWs"
}
}
使用流量檢查代理
如果你嘗試使用的代理對(duì)受TLS保護(hù)的連接執(zhí)行流量檢查,請(qǐng)務(wù)必注意,使用X.509證書的身份驗(yàn)證無(wú)效。IoT Edge建立了一個(gè)TLS通道,該通道使用提供的證書和密鑰進(jìn)行了端到端加密。如果斷開該通道以進(jìn)行流量檢查,則代理無(wú)法使用正確的憑據(jù)重新建立該通道,并且IoT中心和IoT中心設(shè)備預(yù)配服務(wù)會(huì)返回“Unauthorized”錯(cuò)誤。
若要使用執(zhí)行流量檢查的代理,必須使用共享訪問(wèn)簽名身份驗(yàn)證,或者將IoT中心和IoT中心設(shè)備預(yù)配服務(wù)添加到允許列表以避免檢查。