> 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-ko/datasets/adding-data/upload-data-from-aws-gcp-and-azure/azure-blob-storage.md).

# Azure Blob Storage

{% hint style="info" %}
이 페이지에서는 signed URL 및 로컬 다운로드 워크플로를 다룹니다. 소스 데이터가 Azure에 있는 경우 다음을 사용하세요. [Datasources](/roboflow/roboflow-ko/datasets/adding-data/datasources.md) 및 Bucket Mirror를 사용하세요.
{% endhint %}

Azure Blob Storage에서 이미지 데이터 저장을 다루고 Roboflow에 업로드할 때는 일반적으로 두 가지 옵션이 있습니다. signed URL을 사용하거나, 이미지를 로컬에 업로드하기 위해 (Azure CLI를 통해) 이미지를 수동으로 로컬에 다운로드하는 방법입니다. 이 방법 중 어떤 것을 선택할지는 데이터 처리 및 관리에 대한 구체적인 필요에 따라 달라집니다.

* **Signed URLs**: 이 방법은 이미지를 로컬 머신으로 다운로드하는 데 따르는 추가 단계와 시간 소모를 피하고 싶을 때 특히 유리합니다. signed URL을 사용하면 이미지를 로컬에 저장할 필요 없이 Azure Blob Storage에서 Roboflow API로 이미지 데이터를 직접 업로드할 수 있습니다. 그 결과 처리 속도는 더 빨라지고 로컬 시스템의 부담은 줄어듭니다.
* **로컬 CLI**: 이미지를 먼저 로컬 환경에 다운로드하는 것을 선호하는 경우도 있을 수 있습니다. 예를 들어, Roboflow에 업로드하기 전에 이미지를 전처리하거나 수동으로 확인해야 한다면 로컬 사본이 있으면 유용합니다.

올바른 방법을 선택하는 것은 데이터 전송 속도, 전처리 필요 여부, 이미지의 수동 검토와 같은 구체적인 사용 사례 요구사항에 따라 달라집니다.

## Azure Connection String

Storage Account를 만든 후에는 Azure portal의 "Security + networking" 아래 "Access keys" 섹션에서 access keys 또는 connection string을 찾을 수 있습니다. 이러한 자격 증명은 애플리케이션 인증에 사용됩니다.

## 옵션 1: Signed URL로 업로드

Python의 Azure SDK를 사용하여 Azure Blob Storage에 있는 이미지의 signed 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이 필요합니다. 이미지의 signed 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) token을 사용하여 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에 업로드할 수 있습니다. [업로드 웹 인터페이스](/roboflow/roboflow-ko/datasets/adding-data.md#upload-data-with-the-web-application) 또는 [Roboflow CLI](/roboflow/roboflow-ko/datasets/adding-data.md#upload-datasets-with-the-command-line).

## 참고

* [Datasources (Bucket Mirror)](/roboflow/roboflow-ko/datasets/adding-data/datasources.md) — 스크립팅 없이 Azure에서 지속적이고 자동적인 동기화
* [Roboflow 프로젝트 ID 가져오기](https://docs.roboflow.com/api-reference/workspace-and-project-ids)
