はじめに
AzureのBlobを公式のクイックスタートを参考にPythonからアップロード・ダウンロードしてみます。またAutoMLでトレーニングしたベストモデルに出力されたoutputs
フォルダなどをローカルにダウンロードしてみます。
開発環境
- OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
- Visual Studio Code 1.73.1
- Python 3.8
パスワードレスでBlobのアクセスを行ってみる
Blobへのアクセスは、パスワードレスの方法と接続文字列を使った2種類のやり方があります。
まずはパスワードレスのやり方でやってみます。
ロール割り当て
ストレージアカウントを開き、「アクセス制御」>「追加」>「ロール割り当ての追加」をクリックします。
目的のロールに絞ります。今回は「ストレージBLOB共同作成者」を選びました。
そして、メンバーの選択を行います。
これで「レビューと割り当て」を選んで完了です。
これでいよいよPythonからBlobを操作してみます。
まずはコンテナー作成から行います。
コンテナー作成
Azureの認証をDefaultAzureCredential
を用いて行います。
そのために、まずはAzure CLIへログインします。
インストールしていない方はこちらをご覧ください。
1 2 |
az login |
次に下記コードを実行してコンテナーを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
create_container.py import os, uuid from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient try: print("Azure Blob Storage Python quickstart sample") account_url = "https://<ストレージアカウント>.blob.core.windows.net" default_credential = DefaultAzureCredential() blob_service_client = BlobServiceClient(account_url, credential=default_credential) #コンテナー作成 container_name = "<コンテナー名>" containe_client = blob_service_client.create_container(container_name) blob_client.upload_blob(data) except Exception as ex: print("Exception:") print(ex) |
account_url
の<ストレージアカウント>は赤線部分の文字列をコピペします。
container_name
には、作成するコンテナーの名前を入れます。今回は「sas-test-tkawano」としました。
1 2 |
container_name = "sas-test-tkawano" |
Azure Portalで確認したところ、コンテナーが作成されていました。
続いて作成したコンテナーにBLOBをアップロードしてみます。
BLOBにファイルをアップロード
ローカルにある”train.csv”というファイルをアップロードしてみます。
Blobclient
クラスのget_blob_client()
で作成済みのコンテナーを指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
upload_blob.py import os, uuid from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient try: account_url = "https://<ストレージアカウント名>.blob.core.windows.net" default_credential = DefaultAzureCredential() blob_service_client = BlobServiceClient(account_url, credential=default_credential) container_name = "<コンテナー名>" #アップロードするファイルが格納されたパス・ファイル名 local_path="./" local_file_name = "train.csv" blob_client = blob_service_client.get_blob_client(container=container_name, blob=local_file_name) #アップロード with open(file=upload_file_path, mode="rb") as data: blob_client.upload_blob(data) except Exception as ex: print("Exception:") print(ex) |
local_path
には格納するファイルが入っているパス名を入力し、local_file_name
にはアップロードするファイル名を入れます。
実行してコンテナーを見ると「train.csv」がアップロードされていました。
今度はアップロードしたBlobをローカルへダウンロードしてみます。
ダウンロード
ローカルのパスを指定し、そこへBLOBをダウンロードします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
download.py import os, uuid from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient try: account_url = "https://<ストレージアカウント名>.blob.core.windows.net" default_credential = DefaultAzureCredential() blob_service_client = BlobServiceClient(account_url, credential=default_credential) #コンテナー container_name = "<コンテナー名>" #ファイル local_path="./" local_file_name="train.csv" container_client=blob_service_client.get_container_client(container_name) #ダウンロード download_file_path = os.path.join(local_path,str.replace(local_file_name, ".csv","DOWNLOAD.csv")) print("\nDownloading blob to \n\t") with open(file=download_file_path, mode="wb") as download_file: download_file.write(container_client.download_blob(local_file_name).readall()) except Exception as ex: print("Exception:") print(ex) |
実行すると、ローカルにtrainDOWNLOAD.csv
ができました。
さて、ファイルのアップロード・ダウンロードはできたので、今度はフォルダのダウンロードを行います。
フォルダのダウンロード
前回AutoMLで作成した一番精度の良いモデルのoutputs
フォルダの中身をダウンロードしてみます。フォルダのダウンロードについては流行りのChat GPTにやり方を教えてもらいました^^
フォルダの中にあるファイルをfor文で1つずつ取り出していけば、フォルダのダウンロードができるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
folder.py import os, uuid from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient try: account_url = "https://<ストレージアカウント名>.blob.core.windows.net" default_credential = DefaultAzureCredential() blob_service_client = BlobServiceClient(account_url, credential=default_credential) container_name = "<コンテナー名>" container_client = blob_service_client.get_container_client(container=container_name) outputs_path = "<BLOB名>" blob_list = container_client.list_blobs(name_starts_with=outputs_path) outputs_folder = "<ダウンロード先のフォルダのパス>" if not os.path.exists(outputs_folder): os.makedirs(outputs_folder) for blob in blob_list: blob_client = container_client.get_blob_client(blob.name) file_path=os.path.join(outputs_folder,(blob.name.split("/")[-1])) with open(file_path, mode="wb") as download_file: download_file.write(container_client.download_blob(blob.name).readall()) except Exception as ex: print("Exception:") print(ex) |
outputs_path
にはダウンロードするフォルダがあるパスを入れます。
今回の「outputs」フォルダは「ExperimentRun/dcid.careful_ant_rbvh6tjqm5_3/」の中にあったので次のように書きます。
1 2 |
outputs_path = "ExperimentRun/dcid.careful_ant_rbvh6tjqm5_3/outputs/" |
あとはoutputs_path
から始まる名前のBLOBのリストをlist_blobs()
で取り出し、1つずつファイルをローカルへダウンロードします。
ChatGPTから教えてもらったコードをほぼそのまま実行しただけですが、フォルダごとダウンロードできてました!!
以上がパスワードレスのやり方でPythonからコンテナー作成やBLOBをアップロード・ダウンロードする方法でした。続いて接続文字列を用いてBlob操作を行います。
接続文字列を使ったやり方
-
文字列の構成
コマンドプロンプトで以下のに接続文字列をコピペして実行し、環境変数を追加します。
1 2 |
setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>" |
追加したら一度コマンドプロンプトを再起動します。
それでは接続文字列を使って今度はBLOBリストを作成しましょう。
リストはBlobServiceClient
クラスのlist_blobs()
から得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
list.py import os, uuid from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient try: connect_str = os.getenv("AZURE_STORAGE_CONNECTION_STRING") blob_service_client = BlobServiceClient.from_connection_string(connect_str) container_name = "<コンテナー名>" container_client = blob_service_client.get_container_client(container_name) blob_list=container_client.list_blobs() for blob in blob_list: print("\t"+blob.name) except Exception as ex: print('Exception:') print(ex) |
実行後、train.csvのみ返ってきました。
1 2 |
train.csv |
公式ではパスワードレスのやり方が推奨されていますが、接続文字列を使っても同じようにBlob Storageへアクセスできました。
次の記事ではSASを生成し、SAS URIを使ってBLOBをダウンロードしてみます。