概要
Databricks にて Azure IoT Hub に対してファイルをアップロードする方法を共有します。
事前準備
環境構築
- Azure IoT Hub の構築 (本手順は Free tier で実施)
- Databricks (本手順は Serveless ではなく汎用コンピュートで実行)
- Azure Storage
デバイスの作成と接続文字列の取得
Azure IoT Hub のリソース画面にて、デバイス
タブを選択後、+ デバイスの追加
を選択します。
デバイス ID
に任意の値を入力し、保存
を選択してデバイスを作成します。
作成したデバイスを表示して、プライマリ接続文字列
のコピー済み
を選択して値をコピーします。
Azure Storage に対する Azure IoT Hub への権限付与を実施
IoT hub の画面にて、 ID
-> システム割り当て
を選択し、状態
をオン
に設定します。
Azure Storage の画面にて、IoT Hub のマネージド ID に対してストレージ BLOB データ共同作成者
権限を付与します。
IoT Hub の画面にて、ファイルのアップロード
-> Azure Storage コンテナーの選択
を選択します。
ファイルアップロード先のストレージアカウントとコンテナーを選択して、選択
を選択します。
保存
を選択します。
アップロードする方法
アップロードするファイルを確認します。
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('/dbfs/databricks-datasets/flower_photos/daisy/100080576_f52e8ee070_n.jpg')
plt.imshow(img)
plt.axis('off')
必要なライブラリをインストールします。
%pip install azure-iot-device -q
%pip install azure.storage.blob -q
dbutils.library.restartPython()
下記のコードを実行して、ファイルのアップロードを実施します。
device_conn_str = "HostName=iot-hub-test-001.azure-devices.net;DeviceId=qiita_test_01;SharedAccessKey=r2fxXUdn/4w9iNJdhqnIJZ+h0qxxxxx="
source_dir = "/dbfs/databricks-datasets/flower_photos/daisy/100080576_f52e8ee070_n.jpg"
target_dir = f"databricks/test.jpg"
from azure.iot.device import IoTHubDeviceClient
from azure.storage.blob import BlobClient
device = IoTHubDeviceClient.create_from_connection_string(device_conn_str)
device.connect()
info = device.get_storage_info_for_blob(target_dir)
sas = f"https://{info['hostName']}/{info['containerName']}/{info['blobName']}{info['sasToken']}"
blob = BlobClient.from_blob_url(sas)
with open(source_dir, "rb") as fh:
blob.upload_blob(fh, overwrite=True)
device.notify_blob_upload_status(
correlation_id=info["correlationId"],
is_success=True,
status_code=200,
status_description="OK"
)
device.disconnect()
Azure Storge 上にファイルが保存されていることを確認します。