원본 링크: https://azure.microsoft.com/ko-kr/documentation/articles/storage-python-how-to-use-blob-storage/

 

개요

이 문서에서는 Blob 저장소를 사용하여 일반 시나리오를 수행하는 방법을 보여 줍니다. 샘플은 Python으로 작성되었으며 Microsoft Azure Storage SDK for Python을 사용합니다. 여기서 다루는 시나리오에는 Blob 업로드, 나열, 다운로드 및 삭제가 포함됩니다.

Blob 저장소 정의

Azure Blob 저장소는 HTTP 또는 HTTPS를 통해 전 세계 어디에서든 액세스할 수 있는 다량의 구조화되지 않은 개체 데이터(예: 텍스트 또는 이진 데이터)를 저장할 수 있는 서비스입니다. Blob 저장소를 사용하여 세상에 공개적으로 표시하거나 응용 프로그램 데이터를 비공개적으로 저장할 수 있습니다.

Blob 저장소의 일반적인 사용은 다음과 같습니다.

  • 브라우저에 직접 이미지 또는 문서 제공
  • 분산 액세스를 위해 파일 저장
  • 동영상 및 오디오 스트리밍
  • 백업 및 복원, 재해 복구 및 보관 데이터 저장
  • 온-프레미스 또는 Azure 호스티드 서비스에서 분석하기 위해 데이터 저장

BLOB 서비스 개념

Blob 서비스에는 다음 구성 요소가 포함됩니다.

Blob1

  • 저장소 계정: Azure 저장소에 대한 모든 액세스는 저장소 계정을 통해 수행됩니다. 이 저장소 계정은 범용 저장소 계정이거나, 개체/Blob 저장용으로 특화된 Blob 저장소 계정이 될 수 있습니다. 저장소 계정에 대한 자세한 내용은 Azure 저장소 계정을 참조하세요.

  • 컨테이너: 컨테이너는 Blob 집합 그룹화를 제공합니다. 모든 Blob은 컨테이너에 있어야 합니다. 한 계정에 포함될 수 있는 컨테이너 수에는 제한이 없습니다. 한 컨테이너에 저장될 수 있는 Blob 수에도 제한이 없습니다. 컨테이너 이름은 소문자여야 합니다.

  • Blob: 모든 형식과 크기의 파일입니다. Azure 저장소에는 블록 Blob, 페이지 Blob 및 추가 Blob의 세 가지 Blob 유형이 있습니다.

    블록 Blob 은 문서 및 미디어 파일과 같은 텍스트 또는 이진 파일을 저장하기에 적합합니다.추가 Blob 은 블록으로 구성된다는 점에서 블록 Blob과 유사하지만 추가 작업에 최적화되었으므로 로깅 시나리오에 유용합니다. 단일 블록 Blob 또는 추가 Blob은 195GB(4MB X 50,000) 이상의 총 크기에 대해 최대 각 4MB의 최대 50,000 블록을 포함할 수 있습니다.

    페이지 Blob 은 최대 1TB 크기까지 가능하며 빈번한 읽기/쓰기 작업에 대해 더 효율적입니다. Azure 가상 컴퓨터는 OS 및 데이터 디스크로 페이지 Blob을 사용합니다.

    컨테이너 및 Blob를 명명하는 세부 정보는 컨테이너, Blob 및 메타데이터 명명 및 참조를 참조하세요.

Azure 저장소 계정 만들기

첫 번째 Azure 저장소 계정을 가장 쉽게 만드는 방법은 Azure 포털을 사용하는 것입니다. 자세한 내용은 저장소 계정 만들기를 참조하십시오.

Azure PowerShellAzure CLI 또는 .NET용 저장소 리소스 공급자 클라이언트 라이브러리를 사용하여 Azure 저장소 계정을 만들 수도 있습니다.

또한 이번에 저장소 계정을 만들지 않으려는 경우 Azure 저장소 에뮬레이터를 사용하여 로컬 환경에서 코드를 실행하고 테스트할 수 있습니다. 자세한 내용은 개발 및 테스트에 Azure 저장소 에뮬레이터 사용을 참조하세요.

컨테이너 만들기

사용하려는 blob의 형식을 기반으로 BlockBlobServiceAppendBlobService 또는PageBlobService 개체를 만듭니다. 다음 코드에서는 BlockBlobService 개체를 사용합니다. 프로그래밍 방식으로 Azure 블록 Blob 저장소에 액세스하려는 Python 파일의 맨 위쪽에 다음을 추가합니다.

from azure.storage.blob import BlockBlobService

다음 코드에서는 저장소 계정 이름 및 계정 키를 사용하는 BlockBlobService 개체를 만듭니다. 'myaccount' 및 'mykey'를 사용자의 계정 이름 및 키로 바꾸세요.

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey')

Azure 저장소의 모든 Blob은 컨테이너에 있어야 합니다. 컨테이너는 Blob 이름의 일부를 형성합니다. 예를 들어 mycontainer은(는) 이러한 샘플 Blob URI에서 컨테이너의 이름입니다.

https://storagesample.blob.core.windows.net/mycontainer/blob1.txt
https://storagesample.blob.core.windows.net/mycontainer/photos/myphoto.jpg

컨테이너 이름은 유효한 DNS 이름이어야 하고 다음 명명 규칙을 따라야 합니다.

  1. 컨테이너 이름은 문자 또는 숫자로 시작해야 하며 문자, 숫자 및 대시(-) 문자를 포함할 수 있습니다.
  2. 컨테이너 이름에서 모든 대시(-) 문자는 문자 또는 숫자 바로 앞뒤에 와야 하며 연속 대시를 사용할 수 없습니다.
  3. 컨테이너 이름의 모든 문자는 소문자여야 합니다.
  4. 컨테이너 이름의 길이는 3자 이상, 63자 이하여야 합니다.
중요:

컨테이너의 이름은 항상 소문자여야 합니다. 컨테이너 이름에 대문자를 포함하거나 컨테이너 명명 규칙을 위반하는 경우에 400 오류(잘못된 요청) 메시지를 받을 수 있습니다.

다음 코드 예제에서는 BlockBlobService 개체를 사용하여 컨테이너가 없는 경우 새로 만들 수 있습니다.

block_blob_service.create_container('mycontainer')

기본적으로 새 컨테이너는 전용이므로 이 컨테이너에서 Blob을 다운로드하려면 앞에서 한 것처럼 저장소 액세스 키를 지정해야 합니다. 컨테이너 내의 blob을 모든 사용자가 사용할 수 있도록 설정하려는 경우 다음 코드를 사용하여 컨테이너를 만들고 공용 액세스 수준을 전달할 수 있습니다.

from azure.storage.blob import PublicAccess
block_blob_service.create_container('mycontainer', public_access=PublicAccess.Container)

또는 다음 코드를 사용하여 컨테이너를 만든 후 수정할 수 있습니다.

block_blob_service.set_container_acl('mycontainer', public_access=PublicAccess.Container)

이렇게 변경한 후에는 인터넷의 모든 사용자가 공용 컨테이너의 Blob을 볼 수 있지만 수정하거나 삭제는 할 수 없습니다.

컨테이너에 Blob 업로드

블록 blob을 만들고 데이터를 업로드하려면 create_blob_from_path,create_blob_from_streamcreate_blob_from_bytes 또는 create_blob_from_text 메서드를 사용합니다. 이러한 메서드는 데이터의 크기가 64MB를 초과할 경우 필요한 청크를 수행하는 고급 메서드입니다.

create_blob_from_path는 지정된 경로에서 파일의 내용을 업로드하고,create_blob_from_stream은 이미 열린 파일/스트림에서 내용을 업로드합니다.create_blob_from_bytes는 바이트 배열을 업로드하고, create_blob_from_text는 지정된 인코딩을 사용하여 지정된 텍스트 값을 업로드합니다(기본값은 UTF-8).

다음 예제에서는 sunset.png 파일의 내용을 myblob Blob에 업로드합니다.

from azure.storage.blob import ContentSettings
block_blob_service.create_blob_from_path(
    'mycontainer',
    'myblockblob',
    'sunset.png',
    content_settings=ContentSettings(content_type='image/png')
            )

컨테이너의 Blob 나열

컨테이너의 Blob을 나열하려면 list\_blobs 메서드를 사용합니다. 이 메서드는 생성기를 반환합니다. 다음 코드는 컨테이너에 있는 각 Blob의 이름을 콘솔에 출력합니다.

generator = block_blob_service.list_blobs('mycontainer')
for blob in generator:
    print(blob.name)

Blob 다운로드

Blob에서 데이터를 다운로드하려면 get_blob_to_pathget_blob_to_stream,get_blob_to_bytes 또는 get_blob_to_text를 사용합니다. 이러한 메서드는 데이터의 크기가 64MB를 초과할 경우 필요한 청크를 수행하는 고급 메서드입니다.

다음 예제에서는 get_blob_to_path를 사용하여 myblob Blob의 내용을 다운로드 후 out-sunset.png 파일에 저장하는 방법을 보여 줍니다.

block_blob_service.get_blob_to_path('mycontainer', 'myblockblob', 'out-sunset.png')

Blob 삭제

마지막으로 Blob을 삭제하려면 delete_blob을 호출합니다.

block_blob_service.delete_blob('mycontainer', 'myblockblob')

추가 Blob에 쓰기

추가 Blob은 로깅 등의 추가 작업에 최적화되어 있습니다. 블록 Blob과 마찬가지로 추가 Blob은 블록으로 구성되지만 추가 Blob에 새 블록을 추가할 때 항상 Blob 끝에 추가됩니다. 추가 Blob의 기존 블록을 업데이트하거나 삭제할 수는 없습니다. 블록 Blob과 달리 추가 Blob의 블록 ID는 노출되지 않습니다.

추가 Blob의 각 블록은 최대 4MB까지 다양한 크기일 수 있으며, 추가 Blob 하나에 최대 50,000개의 블록이 포함될 수 있습니다. 따라서 추가 Blob의 최대 크기는 195GB(4MB X 50,000개 블록)보다 약간 더 큽니다.

아래 예제에서는 새 추가 Blob을 만들고 간단한 로깅 작업을 시뮬레이트하여 일부 데이터를 추가합니다.

from azure.storage.blob import AppendBlobService
append_blob_service = AppendBlobService(account_name='myaccount', account_key='mykey')

# The same containers can hold all types of blobs
append_blob_service.create_container('mycontainer')

# Append blobs must be created before they are appended to
append_blob_service.create_blob('mycontainer', 'myappendblob')
append_blob_service.append_blob_from_text('mycontainer', 'myappendblob', u'Hello, world!')

append_blob = append_blob_service.get_blob_to_text('mycontainer', 'myappendblob')