はじめに
Azure Blob StorageをPythonから操作します。
今回はAutoMLでトレーニングされた一番精度の良いモデルの「outputs」フォルダのSAS生成をPythonから行い、SAS URIを使ってローカルファイルにダウンロードしてみます。
環境
- OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
- Visual Studio Code 1.73.1
- Python 3.8
BLOBのSAS生成
それではPythonからSAS生成をします。
以下のコードでは、コンテナーにある特定のフォルダのSASを生成し、このSASトークンを使ってローカルファイルにダウンロードします。
import os
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobSasPermissions, generate_blob_sas
import datetime
import requests
try:
account_url = "https://<ストレージアカウント>.blob.core.windows.net"
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(account_url, credential=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:
sas_token=generate_blob_sas(
blob_service_client.account_name,
account_key="<アカウントキー>",
container_name=container_name,
blob_name=blob.name,
permission=BlobSasPermissions(read=True),
expiry=datetime.datetime.utcnow() + datetime.timedelta(hours=1)
)
sas_url=f"{account_url}/{container_name}/{blob.name}?{sas_token}"
response = requests.get(sas_url)
print(sas_url)
if response.status_code==200:
file_path=os.path.join(outputs_folder,(blob.name.split("/")[-1]))
with open(file_path, mode="wb") as download_file:
download_file.write(response.content)
else:
print("Failed to download the file")
except Exception as ex:
print("Exception:")
print(ex)
account_url
にはストレージアカウント名を入れます。ポータルサイトから確認できます。
container_name
にはSAS生成をするBLOBが入っているコンテナー名を入れます。
今回SAS生成する「outputs」フォルダは「azureml」というコンテナーにあるので、次のように入力します。
container_name = "azureml"
続いてoutputs_path
には「outputs」フォルダが入っているパスを入力します。
outputs_path = "ExperimentRun/dcid.sleepy_spider_ryfkltxvgt_2/outputs/"
outputs_folder
はダウンロード先のローカルのフォルダの名前を入れます。
今回はoutputs
という名前のフォルダにすべてダウンロードするようにします。
outputs_folder = "outputs"
後の流れとしては、generate_blob_sas()
でSASトークンを作成し、その後ストレージリソースURIとSASトークンを「?」でつなげてSAS URIを作ればダウンロードできます。
expiry
には1時間の有効期限をつけています。
実行後、ローカルの「outputs」フォルダにダウンロードされたファイルが入っているのを確認できます。