> 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

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

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

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

### Azure Connection String

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

### オプション 1: 署名付き URL 経由でアップロード:

Azure SDK in 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 container 内の 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 token の取得方法](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-token>` の値を認証用の SAS token に置き換えてください。ファイルやフォルダーを再帰的にダウンロードしたい場合は、上記のように `--recursive=true` 引数を指定します。そうでない場合は、この引数を削除してください。

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

データをダウンロードしたので、次は次のいずれかを使って 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).

### 関連項目

* [Roboflow プロジェクト ID を取得](https://docs.roboflow.com/api-reference/workspace-and-project-ids)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.roboflow.com/roboflow/roboflow-jp/datasets/adding-data/upload-data-from-aws-gcp-and-azure/azure-blob-storage.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
