0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SASを生成してBlobからファイルをダウンロードする(Python)

Last updated at Posted at 2023-02-17

はじめに

Azure Blob StorageをPythonから操作します。
今回はAutoMLでトレーニングされた一番精度の良いモデルの「outputs」フォルダのSAS生成をPythonから行い、SAS URIを使ってローカルファイルにダウンロードしてみます。

無題.png

環境

  • 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トークンを使ってローカルファイルにダウンロードします。

sas.py
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にはストレージアカウント名を入れます。ポータルサイトから確認できます。
無題.png

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」フォルダにダウンロードされたファイルが入っているのを確認できます。

無題.png

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?