はじめに
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へログインします。
インストールしていない方はこちらをご覧ください。
az login
次に下記コードを実行してコンテナーを作成します。
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」としました。
container_name = "sas-test-tkawano"
Azure Portalで確認したところ、コンテナーが作成されていました。
続いて作成したコンテナーにBLOBをアップロードしてみます。
BLOBにファイルをアップロード
ローカルにある"train.csv"というファイルをアップロードしてみます。
Blobclient
クラスのget_blob_client()
で作成済みのコンテナーを指定できます。
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をダウンロードします。
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つずつ取り出していけば、フォルダのダウンロードができるようです。
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/」の中にあったので次のように書きます。
outputs_path = "ExperimentRun/dcid.careful_ant_rbvh6tjqm5_3/outputs/"
あとはoutputs_path
から始まる名前のBLOBのリストをlist_blobs()
で取り出し、1つずつファイルをローカルへダウンロードします。
ChatGPTから教えてもらったコードをほぼそのまま実行しただけですが、フォルダごとダウンロードできてました!!
以上がパスワードレスのやり方でPythonからコンテナー作成やBLOBをアップロード・ダウンロードする方法でした。続いて接続文字列を用いてBlob操作を行います。
接続文字列を使ったやり方
-
文字列の構成
コマンドプロンプトで以下のに接続文字列をコピペして実行し、環境変数を追加します。
setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"
追加したら一度コマンドプロンプトを再起動します。
それでは接続文字列を使って今度はBLOBリストを作成しましょう。
リストはBlobServiceClient
クラスのlist_blobs()
から得られます。
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のみ返ってきました。
train.csv
公式ではパスワードレスのやり方が推奨されていますが、接続文字列を使っても同じようにBlob Storageへアクセスできました。
次の記事ではSASを生成し、SAS URIを使ってBLOBをダウンロードしてみます。