Pythonで Azure Blob Storage からファイルをダウンロードしてみました

## 概要

Azure Blob Storage にあるファイルをローカルにダウンロードするPythonプログラムです。

### 実行環境

macOS Monterey 12.3.1
python 3.8.12
azure cli 2.41.0

### BLOB情報

ストレージアカウントの接続文字列の取得

```
$ az storage account show-connection-string --name [StorageAccountName] --resource-group [ResourceGroupName] -o table
ConnectionString
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=[StorageAccountName];AccountKey=[StorageAccountKey1]
```

今回の対象とするBLOBの取得

```
# BLOBのリスト
$ az storage blob list --account-name [StorageAccountName] --container-name partnercenter -o table
Name                                                                                           Blob Type    Blob Tier    Length    Content Type              Last Modified              Snapshot
---------------------------------------------------------------------------------------------  -----------  -----------  --------  ------------------------  -------------------------  ----------
billing-data                                                                                   BlockBlob    Hot                                              2022-10-24T16:06:44+00:00
billing-data/TestExport                                                                        BlockBlob    Hot                                              2022-10-24T16:06:44+00:00
billing-data/TestExport/20220901-20220915                                                      BlockBlob    Hot                                              2022-10-24T16:06:44+00:00
billing-data/TestExport/20220901-20220915/TestExport_6f92daf0-5c57-441d-a386-401ecd240d4c.csv  BlockBlob    Hot          820610    application/octet-stream  2022-10-24T16:06:47+00:00
billing-data/TestExport/20220901-20220915/TestExport_eb4fcbd4-7f59-4eb1-9ad5-38cd9dc84b3f.csv  BlockBlob    Hot          820610    application/octet-stream  2022-10-25T06:37:28+00:00
```

### PythonプログラムでBLOBの確認

実行するプログラム

```python:blob_download.py
import os
from azure.storage.blob import BlobServiceClient

# 接続文字列
CONNECTION_STRING = "[ストレージアカウント接続文字列]"
# コンテナ名
CONTAINER_NAME = "partnercenter"
# ローカルファイルパス（BLOBのターゲットと同一名）
LOCAL_PATH = "billing-data"


# Blobファイルをローカルにダウンロード
def blob_file_download():
    # 接続文字列を用いてBlobServiceClientを作成
    blob_service_client = BlobServiceClient.from_connection_string(CONNECTION_STRING)

    # BLOB一覧の取得
    blob_container = blob_service_client.get_container_client(CONTAINER_NAME)
    blob_list = blob_container.list_blobs()

    # BLOBデータのダウンロード
    print(f'Download target blob : {os.path.join(LOCAL_PATH, "*")}')
    for blob in blob_list :

        # ローカル構成もBLOBディレクトリ構成と同一にする
        if blob.name.startswith(LOCAL_PATH) :

            # ディレクトリはスルー、ファイルのみダウンロード
            if blob.size > 0 :
                dirname, filename = os.path.split(blob.name)
                print("Directory Name : ", dirname)
                print("File Name : ", filename)
                bytes = blob_container.get_blob_client(blob).download_blob().readall()
                save_blob(blob.name, bytes)
        else :
            print(f'Ignore blob : {blob.name}')


# ダウンロードしたBlobファイルをローカルに保存します（既にファイルが存在した場合は上書処理）
def save_blob(file_name, file_content):
    # ディレクトリ(がなければ)作成
    os.makedirs(os.path.dirname(file_name), exist_ok=True)
 
    # ファイル保存（BLOBフォルダと同一構成で保存）
    with open(file_name, "wb") as file:
      file.write(file_content)


if __name__ == "__main__":
    blob_file_download()
```

プログラムの実行
 
```
## 実行
$ python blob_download.py
Download target blob : billing-data/*
Directory Name :  billing-data/TestExport/20220901-20220915
File Name :  TestExport_6f92daf0-5c57-441d-a386-401ecd240d4c.csv
Directory Name :  billing-data/TestExport/20220901-20220915
File Name :  TestExport_eb4fcbd4-7f59-4eb1-9ad5-38cd9dc84b3f.csv

## 確認
$ ls -l billing-data/TestExport/20220901-20220915
total 3216
drwxr-xr-x  4 ihoge  staff     128 10 25 17:07 ./
drwxr-xr-x  3 ihoge  staff      96 10 25 17:07 ../
-rw-r--r--  1 ihoge  staff  820610 10 25 17:21 TestExport_6f92daf0-5c57-441d-a386-401ecd240d4c.csv
-rw-r--r--  1 ihoge  staff  820610 10 25 17:21 TestExport_eb4fcbd4-7f59-4eb1-9ad5-38cd9dc84b3f.csv
```

### まとめ

これで Pythonプログラム で Blob Storage からファイルをダウンロードできました。

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Azureストレージのコンテナーから、Pythonでファイルをダウンロードする](https://qiita.com/harutine/items/c4894f5f73ffcc97e136)
[Azureストレージのコンテナーからディレクトリごと一括でダウンロードする](https://qiita.com/harutine/items/22ede82ef76e819c756a)