在 IoT Edge 使用 Azure Blob 儲存體,以便在邊緣儲存資料
適用於: IoT Edge 1.5 IoT Edge 1.4
重要
支援 IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 版本。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge。
IoT Edge 上的 Azure Blob 儲存體提供邊緣的區塊 Blob 和附加 Blob 儲存體解決方案。 IoT Edge 裝置上的 Blob 儲存體模組的運作方式與 Azure Blob 服務類似,只是儲存於本機 IoT Edge 裝置。 您可以使用平常使用的相同 Azure 儲存體 SDK 方法或 Blob API 呼叫來存取您的 Blob。 本文會說明在 IoT Edge 裝置上執行 Blob 服務的 IoT Edge 容器 Azure Blob 儲存體的相關概念。
此課程模組在以下案例中非常實用:
- 資料必須儲存在本機,直到可進行處理或傳輸至雲端為止。 此資料可以是影片、影像、財務資料、醫院資料或任何其他非結構化資料。
- 當裝置位於連線能力有限的位置時。
- 當您需要在本機有效率地處理資料來取得資料的低延遲存取權,以便您可以盡快回應緊急狀況時。
- 當您需要降低頻寬成本,並避免將數 TB 的資料傳輸至雲端時。 您可以在本機處理資料,並只將已處理的資料傳送至雲端。
本課程模組隨附 deviceToCloudUpload 和 deviceAutoDelete 功能。
deviceToCloudUpload 功能是可設定的功能。 此函式會自動將資料從本機 Blob 儲存體上傳至 Azure,並提供間歇性網際網路連線支援。 這可讓您:
- 開啟/關閉 deviceToCloudUpload 功能。
- 選擇將資料複製到 Azure 的順序,例如 NewestFirst 或 OldestFirst。
- 指定您要上傳資料的目的地 Azure 儲存體帳戶。
- 指定您要上傳至 Azure 的容器。 此課程模組可讓您同時指定來源和目標容器名稱。
- 選擇在上傳至雲端儲存空間完成之後,能夠立即刪除 Blob
- 執行完整 Blob 上傳 (使用
Put Blob
作業),並封鎖層級上傳 (使用Put Block
、Put Block List
和Append Block
作業)。
當 Blob 包含區塊時,此課程模組會使用區塊層級上傳。 以下是一些常見的案例:
- 您的應用程式會更新先前上傳區塊 Blob 的某些區塊,或將新區塊附加至附加 Blob。 此課程模組只會上傳更新的區塊,而不是整個 Blob。
- 模組正在上傳 Blob 且網際網路連線會消失,再次恢復連線時,只會上傳其餘區塊,而不是上傳整個 Blob。
如果 Blob 上傳期間發生非預期的流程終止 (例如停電),一旦模組重新上線,就會再次上傳應上傳的所有區塊。
deviceAutoDelete 是可設定的功能。 當指定的持續時間 (以分鐘測量) 到期時,此函式會自動從本機儲存體中刪除 Blob。 這可讓您:
- 開啟/關閉 deviceAutoDelete 功能。
- 指定以分鐘為單位的時間 (deleteAfterMinutes),之後會自動刪除 Blob。
- 選擇在 deleteAfterMinutes 值到期的情況下,能夠在 Blob 上傳時保留 Blob。
必要條件
Azure IoT Edge 裝置:
您可以遵循 Linux 或 Windows 裝置快速入門中的步驟,使用您的開發電腦或虛擬機器作為 IoT Edge 裝置。
如需支援的作業系統和結構的清單,請參閱 Azure IoT Edge 支援的系統。 IoT Edge 模組上的 Azure Blob 儲存體支援下列結構:
- Windows AMD64
- Linux AMD64
- Linux ARM32
- Linux ARM64
雲端資源:
Azure 中的標準層 IoT 中樞。
deviceToCloudUpload 和 deviceAutoDelete 屬性
使用模組所需的屬性來設定 deviceToCloudUploadProperties 和 deviceAutoDeleteProperties。 您可以在部署期間設定所需的屬性,或稍後編輯模組對應項 (而不需要重新部署) 來變更所需的屬性。 建議您檢查 reported configuration
和 configurationValidation
的「模組對應項」以確保數值有正確傳播。
deviceToCloudUploadProperties
此設定的名稱為 deviceToCloudUploadProperties
。 如果您使用 IoT Edge 模擬器,請將這些屬性的值設定為相關的環境變數 (您可以在說明章節中找到)。
屬性 | 可能的值 | 說明 |
---|---|---|
uploadOn | True、False | 預設會設定為 false 。 如果您要開啟此功能,請將此欄位設定為 true 。 環境變數: deviceToCloudUploadProperties__uploadOn={false,true} |
uploadOrder | NewestFirst、OldestFirst | 可讓您選擇將資料複製到 Azure 的順序。 預設會設定為 OldestFirst 。 順序取決於 Blob 上次修改的時間。 環境變數: deviceToCloudUploadProperties__uploadOrder={NewestFirst,OldestFirst} |
cloudStorageConnectionString | "DefaultEndpointsProtocol=https;AccountName=<your Azure Storage Account Name>;AccountKey=<your Azure Storage Account Key>;EndpointSuffix=<your end point suffix>" 是一個連接字串,可讓您指定要上傳資料的目的地儲存體帳戶。 指定 Azure Storage Account Name 、Azure Storage Account Key 、End point suffix 。 新增已上傳資料之 Azure 的適當 EndpointSuffix,其會因全域 Azure、Government Azure 和 Microsoft Azure Stack 而有所不同。 您可以選擇在這裡指定 Azure 儲存體 SAS 連接字串。 但是,您在此屬性到期時,必須更新此屬性。 SAS 權限可能包括建立容器存取權,以及建立、寫入和新增 Blob 存取權。 環境變數: deviceToCloudUploadProperties__cloudStorageConnectionString=<connection string> |
|
storageContainersForUpload | "<source container name1>": {"target": "<target container name>"} ,"<source container name1>": {"target": "%h-%d-%m-%c"} , "<source container name1>": {"target": "%d-%c"} |
可讓您指定需要上傳至 Azure 的容器名稱。 此課程模組可讓您同時指定來源和目標容器名稱。 如果您未指定目標容器名稱,則系統會自動將容器名稱指派為 <IoTHubName>-<IotEdgeDeviceID>-<ModuleName>-<SourceContainerName> 。 您可以建立目標容器名稱的範本字串,請查看可能的值資料行。 * %h -> IoT 中樞名稱 (3-50 個字元)。 * %d -> IoT Edge 裝置識別碼 (1 到 129 個字元)。 * %m -> 模組名稱 (1 到 64 個字元)。 * %c -> 來源容器名稱 (3 到 63 個字元)。 容器名稱的大小上限為 63 個字元。 如果容器的大小超過 63 個字元,系統會自動將名稱指派給目標容器名稱。 在此情況下,名稱會在每個區段 (IoTHubName, IotEdgeDeviceID, ModuleName, SourceContainerName) 中修剪為 15 個字元。 環境變數: deviceToCloudUploadProperties__storageContainersForUpload__<sourceName>__target=<targetName> |
deleteAfterUpload | True、False | 預設會設定為 false 。 當其設定為 true 時,資料會在上傳至雲端儲存空間完成時自動刪除。 注意:如果您使用附加 Blob,此設定將會在成功上傳後從本機儲存體刪除附加 Blob,而未來任何針對這些 Blob 的附加區塊作業都會失敗。 請小心使用此設定。 如果您的應用程式不常執行附加作業或不支援連續附加作業,請勿啟用此設定 環境變數: deviceToCloudUploadProperties__deleteAfterUpload={false,true} 。 |
deviceAutoDeleteProperties
此設定的名稱為 deviceAutoDeleteProperties
。 如果您使用 IoT Edge 模擬器,請將這些屬性的值設定為相關的環境變數 (您可以在說明章節中找到)。
屬性 | 可能的值 | 說明 |
---|---|---|
deleteOn | True、False | 預設會設定為 false 。 如果您要開啟此功能,請將此欄位設定為 true 。 環境變數: deviceAutoDeleteProperties__deleteOn={false,true} |
deleteAfterMinutes | <minutes> |
指定時間 (以分鐘計)。 當此值過期時,模組會自動從本機儲存體刪除您的 Blob。 目前允許的最大分鐘數為 35791。 環境變數: deviceAutoDeleteProperties__ deleteAfterMinutes=<minutes> |
retainWhileUploading | True、False | 根據預設,它會設定為 true ,並在 deleteAfterMinutes 到期時在上傳至雲端儲存空間時保留 Blob。 您可以將它設定為 false ,並在 deleteAfterMinutes 到期後立即刪除資料。 註:若要讓此屬性能夠運作,應將 uploadOn 設定為 true。 注意:如果您使用附加 Blob,此設定會在數值到期時從本機儲存體刪除附加 Blob,而未來任何針對這些 Blob 的附加區塊作業都會失敗。 確保到期值夠大,足以實現應用程式所執行之附加作業的預期頻率。 環境變數: deviceAutoDeleteProperties__retainWhileUploading={false,true} |
使用 SMB 共用作為本機儲存體
當您在 Windows 主機上部署此模組的 Windows 容器時,您可用 SMB 共用作為本機儲存體路徑。
請確定 SMB 共用和 IoT 裝置位於相互信任的網域中。
您可以執行 New-SmbGlobalMapping
PowerShell 命令,以在執行 Windows 的 IoT 裝置上進行 SMB 共用的本機對應。
設定步驟:
$creds = Get-Credential
New-SmbGlobalMapping -RemotePath <remote SMB path> -Credential $creds -LocalPath <Any available drive letter>
例如:
$creds = Get-Credential
New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
此命令將使用認證來向遠端 SMB 伺服器進行驗證。 然後,將遠端共用路徑對應至 G: 磁碟機代號 (可以是任何其他可用的磁碟機代號)。 IoT 裝置現在具有對應至 G: 磁碟機上路徑的資料磁碟區。
確保 IoT 裝置中的使用者可以讀取/寫入遠端 SMB 共用。
針對您的部署,<storage mount>
的值可以是 G:/ContainerData:C:/BlobRoot。
將目錄存取權授與 Linux 上的容器使用者
如果您在 Linux 容器的建立選項中使用 磁碟區掛接作為儲存體,則您不需要執行任何額外的步驟,但如果您使用的是繫結掛接,則您需要執行這些步驟才能正確執行服務。
請依據最低權限原則,將使用者的存取權限制在執行工作所需的最低權限,本課程模組中包含一位使用者 (名稱:absie、ID:11000) 和一個使用者群組 (名稱:absie、ID:11000)。 如果容器是以根目錄啟動 (預設使用者是根),則我們的服務會以低權限 absie 使用者身分啟動。
此行為會使得服務必須要有主機路徑繫結上的權限設定才能正常運作,否則服務將會當機並發生拒絕存取錯誤。 容器使用者 (範例:absie 11000) 必須要能存取目錄繫結中使用的路徑。 您可以在主機上執行下列命令,以將目錄存取權授與容器使用者:
sudo chown -R 11000:11000 <blob-dir>
sudo chmod -R 700 <blob-dir>
例如:
sudo chown -R 11000:11000 /srv/containerdata
sudo chmod -R 700 /srv/containerdata
如果您需要以 absie 以外的使用者身分執行服務,您可以在部署資訊清單的 "User" 屬性下的 createOptions 中指定自訂使用者識別碼。 在這種情況下,使用預設或根群組識別碼 0
。
"createOptions": {
"User": "<custom user ID>:0"
}
現在,將目錄存取權授與容器使用者
sudo chown -R <user ID>:<group ID> <blob-dir>
sudo chmod -R 700 <blob-dir>
設定記錄檔
默認輸出記錄層級為 『Info』。 若要變更輸出記錄層級,請在部署指令清單中設定 LogLevel
此模組的環境變數。 LogLevel
接受下列值:
- 重大
- 錯誤
- 警告
- 資訊
- 偵錯
如需為模組設定記錄檔的資訊,請參閱以下生產最佳做法。
連線至您的 Blob 儲存體模組
您可以使用帳戶名稱和您為模組設定的帳戶金鑰來存取 IoT Edge 裝置上的 Blob 儲存體。
指定 IoT Edge 裝置作為您提出的任何儲存體要求所用的 Blob 端點。 您可以使用 IoT Edge 裝置資訊和您設定的帳戶名稱,建立明確儲存體端點的連接字串。
- 針對部署在相同裝置 (「IoT Edge 模組上的 Azure Blob 儲存體」執行所在) 上的模組,Blob 端點是:
http://<module name>:11002/<account name>
。 - 對於在不同裝置上執行的模組或應用程式,您必須為網路選擇正確的端點。 根據您的網路設定,選擇端點格式,讓來自外部模組或應用程式的資料流量可以連線到 IoT Edge 模組上執行 Azure Blob 儲存體的裝置。 此案例的 Blob 端點是下列其中一個:
http://<device IP >:11002/<account name>
http://<IoT Edge device hostname>:11002/<account name>
http://<fully qualified domain name>:11002/<account name>
重要
當您呼叫模組時,Azure IoT Edge 會區分大小寫,且儲存體 SDK 也會預設為小寫。 將名稱變更為小寫有助於確保您的 IoT Edge 模組上 Azure Blob 儲存體 的連線不會中斷。
Azure Blob 儲存體快速入門範例
Azure Blob 儲存體文件集包含多種語言的快速入門範例程式碼。 您可以變更 Blob 端點,使其指向您本地的 Blob 儲存體模組,以便在 IoT Edge 上執行這些範例以測試 Azure Blob 儲存體。
下列快速入門範例使用 IoT Edge 支援的語言,因此您可以連同 Blob 儲存體模組將這些語言部署為 IoT Edge 模組:
- .NET
- v1.4.0 和更早版本的 Iot Edge 模組上的 Azure Blob 儲存體與 WindowsAzure.Storage 9.3.3 SDK 相容,而且 v1.4.1 也支援 Azure.Storage.Blobs 12.8.0 SDK。
- Python
- Python SDK V2.1 之前的版本有已知問題,即模組不會傳回 Blob 的建立時間。 由於這個問題,清單 Blob 之類的方法無法運作。 因應措施是將 Blob 用戶端上的 API 版本明確地設為 '2017-04-17'。 範例:
block_blob_service._X_MS_VERSION = '2017-04-17'
- 附加 Blob 範例
- Python SDK V2.1 之前的版本有已知問題,即模組不會傳回 Blob 的建立時間。 由於這個問題,清單 Blob 之類的方法無法運作。 因應措施是將 Blob 用戶端上的 API 版本明確地設為 '2017-04-17'。 範例:
- Node.js
- JS/HTML
- Ruby
- Go
- PHP
使用 Azure 儲存體總管連線至本機存放區
您可以使用 Azure 儲存體總管連線到本機存放區帳戶。
下載並安裝 Azure 儲存體總管
最新版的 Azure 記憶體總管會使用 Blob 儲存體模組不支援的較新儲存體 API 版本。 啟動 Azure Storage Explorer。 選取 [編輯] 功能表。 確認已選取 [目標 Azure Stack Hub API]。 如果不是,請選取 [目標 Azure Stack Hub]。 重新啟動 [Azure 儲存體總管] 以讓變更生效。 不需要進行此設定,即可與您的 IoT Edge 環境相容。
使用連接字串連線至 Azure 儲存體
提供連接字串:
DefaultEndpointsProtocol=http;BlobEndpoint=http://<host device name>:11002/<your local account name>;AccountName=<your local account name>;AccountKey=<your local account key>;
完成連線的步驟。
在本機存放區帳戶內建立容器
開始將檔案上傳為區塊 Blob 或附加 Blob。
注意
此模組不支援分頁 Blob。
您也可以選擇在 [儲存體總管] 中連線 Azure 儲存體帳戶。 此設定可讓您提供本機存放區帳戶和 Azure 儲存體帳戶的單一檢視
支援的儲存體作業
IoT Edge 上的 Blob 儲存體模組會使用 Azure 儲存體 SDK,而且與區塊 Blob 端點的 Azure 儲存體 API 2017-04-17 版本一致。
由於 Azure Blob 儲存體並不支援 IoT Edge 上的所有 Azure Blob 儲存體作業,因此本節會列出每個作業的狀態。
客戶
支援:
- 列出容器
不支援:
- 取得和設定 Blob 服務屬性
- 預檢 Blob 要求
- 取得 Blob 服務統計資料
- 取得帳戶資訊
容器
支援:
- 建立和刪除容器
- 取得容器屬性和中繼資料
- 列出 Blob
- 取得和設定容器 ACL
- 設定容器中繼資料
不支援:
- 租用容器
Blob
支援:
- 放置、取得和刪除 Blob
- 取得和設定 Blob 屬性
- 取得和設定 Blob 中繼資料
不支援:
- 租用 Blob
- 拍攝 Blob 的快照
- 複製和中止複製 Blob
- 取消刪除 Blob
- 設定 Blob 層
區塊 Blob
支援:
- 放置區塊
- 放置和取得封鎖清單
不支援:
- 從 URL 放置區塊
附加 Blob
支援:
- 附加區塊
不支援:
- 從 URL 附加區塊
IoT Edge 上的事件方格整合
警告
IoT Edge 上的事件方格整合處於預覽狀態
此 IoT Edge 模組上的 Azure Blob 儲存體現在提供與 IoT Edge 事件方格的整合。 如需此整合的詳細資訊,請參閱部署模組、發佈事件及驗證事件傳遞的教學課程。
版本資訊
以下是本課程模組的 Docker Hub 版本資訊。 您可以在特定版本的版本資訊中找到與錯誤 (bug) 修正程式和補救相關的詳細資訊。
下一步
了解如何在 IoT Edge 上部署 Azure Blob 儲存體
在 IoT Edge 上的 Azure Blob 記憶體發行備註 頁面上,隨時掌握最新的更新和公告。