> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/roboflow/roboflow-jp/datasets/adding-data/upload-data-from-aws-gcp-and-azure/azure-blob-storage.md).

# Azure Blob Storage

{% hint style="info" %}
このページでは、署名付きURLとローカルダウンロードのワークフローについて説明します。ソースデータが Azure にある場合は、 [Datasources](/roboflow/roboflow-jp/datasets/adding-data/datasources.md) このパターンを適応させる代わりに、Bucket Mirror を使用してください。
{% endhint %}

Azure Blob Storage に画像データを保存し、Roboflow にアップロードする場合、一般的には 2 つの選択肢があります。署名付きURLを使用する方法、または画像を手動でローカルにダウンロードして（Azure CLI 経由で）ローカルからアップロードする方法です。どちらを選ぶかは、データ処理や管理に関する具体的なニーズによります。

* **Signed URLs**この方法は、画像をローカルマシンにダウンロードする際に発生する余分な手順と時間を避けたい場合に特に有利です。署名付きURLを使えば、画像データを Azure Blob Storage から Roboflow API に直接アップロードでき、ローカルに保存する必要がありません。その結果、処理が速くなり、ローカルシステムへの負荷も軽減されます。
* **CLI でローカル**画像をまずローカル環境にダウンロードしたい方がよいシナリオもあります。たとえば、Roboflow にアップロードする前に画像を前処理したり、手動で確認したりする必要がある場合は、ローカルコピーがあると便利です。

適切な方法の選択は、データ転送速度、前処理の必要性、画像の手動確認など、具体的なユースケース要件によって決まります。

## Azure 接続文字列

Storage Account を作成した後、Azure portal の "Security + networking" 配下にある "Access keys" セクションでアクセスキーまたは接続文字列を確認できます。これらの資格情報は、アプリケーションの認証に使用されます。

## オプション1：Signed URL 経由でアップロード

Azure SDK for Python を使って、Azure Blob Storage 内の画像に対する署名付きURLを生成できます。

```python
def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """Azure Blob の SAS URL を生成します。"""
    from azure.storage.blob import generate_blob_sas, BlobSasPermissions
    from datetime import datetime, timedelta

    sas_token = generate_blob_sas(
        blob_service_client.account_name,
        container_name,
        blob_name,
        account_key=blob_service_client.credential.account_key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
    return blob_url
```

上記のコードスニペットでは、blob service client、container name、blob name が必要です。画像の署名付きURLが生成され、返されます。

これを基に、Azure Blob Storage 内の利用可能なすべてのオブジェクトを取得し、それらを API 経由で Roboflow にアップロードする完全なソリューションを作成できます。このソリューションの概要を以下に示します。

```python
from azure.storage.blob import BlobServiceClient
import requests
import urllib.parse

# ************* ここに変数を設定してください *************
AZURE_CONNECTION_STRING = "YOUR_AZURE_CONNECTION_STRING"
AZURE_CONTAINER_NAME = "YOUR_AZURE_CONTAINER_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
# ***********************************************

def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """Azure Blob の SAS URL を生成します。"""
    from azure.storage.blob import generate_blob_sas, BlobSasPermissions
    from datetime import datetime, timedelta

    sas_token = generate_blob_sas(
        blob_service_client.account_name,
        container_name,
        blob_name,
        account_key=blob_service_client.credential.account_key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
    return blob_url

def get_azure_blob_objects(container_name: str) -> list:
    """指定した Azure Blob コンテナ内の blob 名の一覧を取得します。"""
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    container_client = blob_service_client.get_container_client(container_name)
    
    blobs = []
    blob_list = container_client.list_blobs()
    for blob in blob_list:
        blobs.append(blob.name)
    return blobs

def upload_to_roboflow(api_key: str, project_name: str, presigned_url: str, img_name='', split="train"):
    """Roboflow に画像をアップロードします。"""
    API_URL = "https://api.roboflow.com"
    if img_name == '':
        img_name = presigned_url.split("/")[-1]

    upload_url = "".join([
        API_URL + "/dataset/" + project_name + "/upload",
        "?api_key=" + api_key,
        "&name=" + img_name,
        "&split=" + split,
        "&image=" + urllib.parse.quote_plus(presigned_url),
    ])
    response = requests.post(upload_url)

    # レスポンスコードを確認
    if response.status_code == 200:
        print(f"{img_name} を {project_name} に正常にアップロードしました")
        return True
    else:
        print(f"{img_name} のアップロードに失敗しました。エラー: {response.content.decode('utf-8')}")
        return False

if __name__ == "__main__":
    # 利用可能な blob の一覧を取得
    available_blobs = get_azure_blob_objects(AZURE_CONTAINER_NAME)
    
    # オプション: ここで blob をフィルタリング
    # 例: available_blobs = [blob for blob in available_blobs if "some_condition"]
    
    # Azure Blob Service Client を初期化
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    
    # blob を Roboflow にアップロード
    for blob in available_blobs:
        blob_url = get_blob_sas_url(blob_service_client, AZURE_CONTAINER_NAME, blob)
        upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, blob_url)

```

## オプション 2: Azure からデータをローカルにダウンロード

最初に、 `azcopy` コマンドラインユーティリティをインストールします。このユーティリティを使うと、Azure Storage からファイルやフォルダーをダウンロードできます。次に、 [Shared Access Signature](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) トークンを使用して Azure アカウントで認証します。詳細は [SAS トークンの取得方法](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) について、azcopy のドキュメントで確認できます。

準備ができたら `azcopy` 、次のコマンドを実行してファイルまたはフォルダーをダウンロードします。

```bash
azcopy copy "C:\local\path" <sas-token> --recursive=true
```

置き換えてください `C:\local\path` をダウンロードしたいフォルダーまたはファイルのパスに置き換えてください。認証用の SAS トークンには `<sas-token>` の値を置き換えてください。ファイルやフォルダーを再帰的にダウンロードしたい場合は、上記のように `--recursive=true` 引数を指定してください。そうでない場合は、この引数を削除してください。

## Roboflow にデータをアップロード

データをダウンロードしたので、次は [Upload Web Interface](/roboflow/roboflow-jp/datasets/adding-data.md#upload-data-with-the-web-application) または [Roboflow CLI](/roboflow/roboflow-jp/datasets/adding-data.md#upload-datasets-with-the-command-line).

## 関連項目

* [Datasources (Bucket Mirror)](/roboflow/roboflow-jp/datasets/adding-data/datasources.md) — スクリプト不要で Azure から継続的かつ自動的に同期
* [Roboflow プロジェクト ID を取得する](https://docs.roboflow.com/api-reference/workspace-and-project-ids)
