예: Python용 Azure 라이브러리를 사용하여 Azure Storage에 액세스

이 문서에서는 Python 애플리케이션 코드의 Azure 클라이언트 라이브러리를 사용하여 Azure Blob Storage 컨테이너에 파일을 업로드하는 방법을 알아봅니다. 이 문서에서는 예제: Azure Storage 만들기에 표시된 리소스를 만들었다고 가정합니다.

이 문서의 모든 명령은 언급되지 않는 한 Linux/macOS bash 및 Windows 명령 셸에서 동일하게 작동합니다.

1: 로컬 개발 환경 설정

아직 실행하지 않은 경우 이 코드를 실행할 수 있는 환경을 설정합니다. 다음은 몇 가지 옵션입니다.

2: 라이브러리 패키지 설치

requirements.txt 파일에서 사용할 클라이언트 라이브러리 패키지에 대한 줄을 추가하고 파일을 저장합니다.

azure-storage-blob
azure-identity

그런 다음 터미널 또는 명령 프롬프트에서 요구 사항을 설치합니다.

pip install -r requirements.txt

3: 업로드할 파일 만들기

sample-source.txt 소스 파일을 만듭니다. 이 파일 이름은 코드에서 예상하는 이름입니다.

Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.

4: 앱 코드에서 Blob Storage 사용

다음 두 섹션에서는 예제를 통해 만든 Blob 컨테이너에 액세스하는 두 가지 방법인 Azure Storage 만들기를 보여 줍니다.

첫 번째 방법(인증 사용)서비스 주체를 사용하여 로컬 개발 중에 Azure 서비스에 대한 Python 앱 인증에 설명된 대로 앱을 DefaultAzureCredential 인증합니다. 이 메서드를 사용하면 먼저 앱 ID에 적절한 권한을 할당해야 합니다. 이는 권장되는 방법입니다.

두 번째 메서드(연결 문자열 포함)는 연결 문자열 사용하여 스토리지 계정에 직접 액세스합니다. 이 메서드는 더 간단해 보이지만 다음과 같은 두 가지 중요한 단점이 있습니다.

  • 연결 문자열 기본적으로 해당 계정 내의 개별 리소스가 아닌 Storage 계정으로 연결 에이전트를 인증합니다. 결과적으로 연결 문자열 필요한 것보다 더 광범위한 권한 부여를 부여합니다.

  • 연결 문자열 일반 텍스트로 액세스 정보를 포함하므로 제대로 생성되거나 보호되지 않으면 잠재적인 취약성이 발생합니다. 이러한 연결 문자열 노출되면 Storage 계정 내에서 광범위한 리소스에 액세스하는 데 사용할 수 있습니다.

이러한 이유로 프로덕션 코드에서 인증 방법을 사용하는 것이 좋습니다.

4a: 인증에 Blob Storage 사용

  1. 다음 코드를 사용하여 use_blob_auth.py라는 파일을 만듭니다. 주석은 단계를 설명합니다.

    import os
    import uuid
    
    from azure.identity import DefaultAzureCredential
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    credential = DefaultAzureCredential()
    
    # Retrieve the storage blob service URL, which is of the form
    # https://<your-storage-account-name>.blob.core.windows.net/
    storage_url = os.environ["AZURE_STORAGE_BLOB_URL"]
    
    # Create the client object using the storage URL and the credential
    blob_client = BlobClient(
        storage_url,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
        credential=credential,
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    

    참조 링크:

  2. 다음과 같은 환경 변수를 만듭니다 AZURE_STORAGE_BLOB_URL.

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    "pythonazurestorage12345"를 스토리지 계정의 이름으로 바꿉니다.

    AZURE_STORAGE_BLOB_URL 환경 변수는 이 예제에서만 사용됩니다. Azure 라이브러리에서 사용되지 않습니다.

  3. az ad sp create-for-rbac 명령을 사용하여 앱에 대한 새 서비스 주체를 만듭니다. 이 명령은 앱에 대한 앱 등록을 동시에 만듭니다. 서비스 주체에 선택한 이름을 지정합니다.

    az ad sp create-for-rbac --name {service-principal-name}
    

    이 명령의 출력은 다음과 같습니다. 다음 단계에서 이러한 값이 필요하고 암호(클라이언트 암호) 값을 다시 볼 수 없으므로 이러한 값을 기록하거나 이 창을 열어 둡니다. 그러나 필요한 경우 서비스 주체 또는 기존 암호를 무효화하지 않고 나중에 새 암호를 추가할 수 있습니다.

    {
      "appId": "00000000-0000-0000-0000-000000000000",
      "displayName": "{service-principal-name}",
      "password": "abcdefghijklmnopqrstuvwxyz",
      "tenant": "11111111-1111-1111-1111-111111111111"
    }
    

    Azure CLI 명령은 Azure Cloud Shell에서 실행하거나 Azure CLI가 설치된 워크스테이션에서 실행할 수 있습니다.

  4. 애플리케이션 서비스 주체에 대한 환경 변수를 만듭니다.

    이전 명령의 출력 값을 사용하여 다음 환경 변수를 만듭니다. 이러한 변수는 애플리케이션 서비스 주체를 사용하도록 지시 DefaultAzureCredential 합니다.

    • AZURE_CLIENT_ID → 앱 ID 값입니다.
    • AZURE_TENANT_ID → 테넌트 ID 값입니다.
    • AZURE_CLIENT_SECRET → 앱에 대해 생성된 암호/자격 증명입니다.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. 의도적으로 실패하는 코드를 실행하려고 시도합니다.

    python use_blob_auth.py
    
  6. "이 요청은 이 권한을 사용하여 이 작업을 수행할 권한이 없습니다." 오류를 확인합니다. 사용 중인 로컬 서비스 주체에 Blob 컨테이너에 액세스할 수 있는 권한이 아직 없기 때문에 오류가 발생합니다.

  7. az role assignment create Azure CLI 명령을 사용하여 Blob 컨테이너에 대한 기여자 권한을 서비스 주체에게 부여합니다.

    az role assignment create --assignee <AZURE_CLIENT_ID> \
        --role "Storage Blob Data Contributor" \
        --scope "/subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/PythonAzureExample-Storage-rg/providers/Microsoft.Storage/storageAccounts/pythonazurestorage12345/blobServices/default/containers/blob-container-01"
    

    인수는 --assignee 서비스 주체를 식별합니다. AZURE_CLIENT_ID> 자리 표시자를 서비스 주체의 앱 ID로 바꿉<니다.

    인수는 --scope 이 역할 할당이 적용되는 위치를 식별합니다. 이 예제에서는 "Blob-container-01"이라는 컨테이너의 서비스 주체에 "Storage Blob 데이터 기여자" 역할을 부여합니다.

    • 스토리지 계정과 pythonazurestorage12345 스토리지 계정의 정확한 이름을 포함하는 리소스 그룹으로 바꿉 PythonAzureExample-Storage-rg 니다. 또한 필요한 경우 Blob 컨테이너의 이름을 조정합니다. 잘못된 이름을 사용하는 경우 "중첩된 리소스에 대해 요청된 작업을 수행할 수 없습니다. 부모 리소스 'pythonazurestorage12345'를 찾을 수 없습니다."

    • <AZURE_SUBSCRIPTION_ID> 자리 표시자를 Azure 구독 ID로 바꿉니다. (az account show 명령을 실행하고 출력의 속성에서 구독 ID를 id 가져올 수 있습니다.)

    bash 셸을 사용할 때 역할 할당 명령이 "연결 어댑터를 찾을 수 없음" 오류를 반환하는 경우 경로 변환을 방지하도록 설정 export MSYS_NO_PATHCONV=1 해 봅니다. 자세한 내용은 이 문제를 참조하세요.

  8. 사용 권한이 전파되기까지 1~2분 정도 기다린 다음 코드를 다시 실행하여 이제 작동하는지 확인합니다. 사용 권한 오류가 다시 표시되면 조금 더 기다린 다음 코드를 다시 시도하세요.

역할 할당에 대한 자세한 내용은 Azure CLI를 사용하여 역할 권한을 할당하는 방법을 참조하세요.

4b: 연결 문자열 Blob Storage 사용

  1. 다음 코드를 사용하여 use_blob_conn_string.py이라는 Python 파일을 만듭니다. 주석은 단계를 설명합니다.

    import os
    import uuid
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    # Retrieve the connection string from an environment variable. Note that a
    # connection string grants all permissions to the caller, making it less
    # secure than obtaining a BlobClient object using credentials.
    conn_string = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
    
    # Create the client object for the resource identified by the connection
    # string, indicating also the blob container and the name of the specific
    # blob we want.
    blob_client = BlobClient.from_connection_string(
        conn_string,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    
  2. 스토리지 계정의 전체 연결 문자열 값인 환경 AZURE_STORAGE_CONNECTION_STRING변수를 만듭니다. (이 환경 변수는 다양한 Azure CLI 주석에서도 사용됩니다.) az storage account show-connection-string 명령을 실행하여 스토리지 계정에 대한 연결 문자열 가져올 수 있습니다.

    az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg -name pythonazurestorage12345
    

    스토리지 계정과 pythonazurestorage12345 스토리지 계정의 정확한 이름을 포함하는 리소스 그룹으로 바꿉 PythonAzureExample-Storage-rg 니다.

    환경 변수를 설정할 때 따옴표를 포함하여 출력에 있는 속성의 connectionString 전체 값을 사용합니다.

  3. 코드를 실행합니다.

    python use_blob_conn_string.py
    

이 메서드는 간단하지만 연결 문자열 스토리지 계정의 모든 작업에 권한을 부여합니다. 프로덕션 코드를 사용하면 이전 섹션에 설명된 대로 특정 권한을 사용하는 것이 좋습니다.

5. Blob 만들기 확인

두 방법 중 하나의 코드를 실행한 후 Azure Portal로 이동하여 Blob 컨테이너로 이동하여 sample-source.txt 파일과 동일한 내용이 있는 sample-blob-{random}.txt 명명된 새 Blob이 있는지 확인합니다.

Azure portal page for the blob container, showing the uploaded file

명명AZURE_STORAGE_CONNECTION_STRING된 환경 변수를 만든 경우 Azure CLI를 사용하여 az storage blob list 명령을 사용하여 Blob이 있는지 확인할 수도 있습니다.

az storage blob list --container-name blob-container-01

인증과 함께 Blob Storage를 사용하는 지침을 따른 경우 스토리지 계정에 대한 연결 문자열 사용하여 이전 명령에 매개 변수를 추가할 --connection-string 수 있습니다. 연결 문자열 가져오는 방법을 알아보려면 4b: 연결 문자열 Blob Storage 사용 지침을 참조하세요. 따옴표를 포함하여 전체 연결 문자열 사용합니다.

6: 리소스 정리

이 예제에서 사용된 리소스 그룹 및 스토리지 리소스를 유지할 필요가 없는 경우 az group delete 명령을 실행합니다. 리소스 그룹은 구독에서 진행 중인 요금이 발생하지 않지만 리소스 그룹의 스토리지 계정과 같은 리소스에는 요금이 부과될 수 있습니다. 적극적으로 사용하지 않는 그룹을 클린 것이 좋습니다. 인수 --no-wait 를 사용하면 작업이 완료되는 것을 기다리는 대신 명령이 즉시 반환됩니다.

az group delete -n PythonAzureExample-Storage-rg  --no-wait

ResourceManagementClient.resource_groups.begin_delete 메서드를 사용하여 코드에서 리소스 그룹을 삭제할 수도 있습니다. 예제: 리소스 그룹 만들기의 코드는 사용량을 보여 줍니다.

인증과 함께 Blob Storage를 사용하는 지침을 따른 경우 만든 애플리케이션 서비스 주체를 삭제하는 것이 좋습니다. az ad app delete 명령을 사용할 수 있습니다. <AZURE_CLIENT_ID> 자리 표시자를 서비스 주체의 앱 ID로 바꿉니다.

az ad app delete --id <AZURE_CLIENT_ID>

참고 항목