Azure 스토리지 계정(Storage Account) Blob Service/File Service/Queue Service 연동 및 실습
들어가며
- Microsoft Azure의 Blob Service, File Service, Queue Service를 Local Storage와 연동한 후, Local Storage에서 실습을 진행해보자.
- 이 과정을 통해 원격으로 Local Storage에서 Azure(클라우드)에 있는 Storage Account를 관리할 수 있다.
Azure Storage Account 서비스
① Azure Containers(Blobs)
- HTTP 또는 HTTPS를 통해 어디서나 액세스 가능하다.
- 텍스트 또는 이진 파일과 같은 대량의 비구조적 데이터를 저장할 수 있다.
- 액세스 :
http://mystorageaccount.blob.core.windows.net
② Azure Files
- SMB 3.0을 통해 어디서나 액세스 가능하다.
- 항상 사용 가능한 네트워크 파일 공유 호스트이다.
- 액세스 :
http://mystorageaccount.file.core.windows.net
③ Azure Queues
- HTTP 또는 HTTPS를 통해 어디서나 액세스 가능하다.
- 비동기 통신용 큐 기반 매커니즘을 제공한다.
- 큐에 최대 64KB 크기의 메시지를 저장할 수 있다.
- 액세스 :
http://mystorageaccount.queue.core.windows.net
④ Azure Tables
- HTTP 또는 HTTPS를 통해 어디서나 액세스가 가능하다.
- NoSQL 테이블을 저장할 수 있다.
- 액세스 :
http://mystorageaccount.table.core.windows.net
실습하기
- 잘 사용하지 않는 Table 서비스는 실습하지 않았다.
① Blob Service 다루기
| |
| !pip install azure-storage-blob azure-identity |
| import os, uuid |
| from azure.identity import DefaultAzureCredential |
| from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient |
- Azure에서 연결 문자열을 가져와 연결 문자열을 이용하여 Azure Blob 서버에 접속한다.
| |
| connect_str = '***************************************************' |
| blob_service_client = BlobServiceClient.from_connection_string(connect_str) |
- 원격으로 Blob Storage에 컨테이너를 생성한다.
| container_name = 'test33container' |
| |
| container_client = blob_service_client.create_container(container_name) |
- Local Storage에서 파일을 생성한다.
| |
| local_path = './data' |
| os.mkdir(local_path) |
| |
| |
| local_file_name = 'welcome' + '.txt' |
| upload_file_path = os.path.join(local_path, local_file_name) |
| |
| |
| file = open(upload_file_path, mode='w') |
| file.write('Welcome to Python') |
| file.close() |
- Blob Storage에 Local Storage에서 만든 파일을 업로드한다.
| blob_client = blob_service_client.get_blob_client(container=container_name, blob=local_file_name) |
| with open(file=upload_file_path, mode='rb') as data: |
| blob_client.upload_blob(data) |
- Blob Storage에 있는 파일들의 목록을 확인한다.
| |
| print('\\nListing blobs') |
| |
| blob_list = container_client.list_blobs() |
| for blob in blob_list: |
| print('\\t' + blob.name) |
- Blob Storage에 있는 파일을 Local Storage로 다운로드 받는다. 그리고 다운로드 받은 파일의 경로를 출력한다.
- 이때, 파일의 이름을 DOWNLOAD.txt 로 변경한다.
| |
| |
| |
| download_file_path = os.path.join(local_path, str.replace(local_file_name,'.txt','_DOWNLOAD.txt')) |
| print(download_file_path) |
| container_client = blob_service_client.get_container_client(container=container_name) |
| |
| with open(file=download_file_path, mode='wb') as download_file: |
| download_file.write(container_client.download_blob(blob.name).readall()) |
- 지금까지 생성하고 생성된 파일들과 디렉터리를 지운다.
② File Service 다루기
!pip install azure-storage-file
- Azure Storage Account의 이름(account_name)과 액세스 키(account_key)를 불러와 File Share와 연결을 시켜준다.
| from azure.storage.file import FileService |
| file_service = FileService(account_name='mylabuserstorage', account_key='*******************************************') |
- File Storage에 새로운 폴더(myshare)를 하나 만든다.
file_service.create_share('myshare')
- File Storage에 새로운 디렉터리를 생성한다. (myshare 폴더에 sampledir 폴더를 만든다.)
file_service.create_directory('myshare', 'sampledir')
- Local Storage의 이미지 파일(iu.jfif)을 myfile.jfif로 이름을 바꾸어 File Storage의 sampledir 폴더에 업로드한다.
| from azure.storage.file import ContentSettings |
| file_service.create_file_from_path( |
| 'myshare', |
| 'sampledir', |
| 'myfile.jfif', |
| 'iu.jfif' |
| ) |
- File Storage의 myshare 디렉터리 내부 파일들의 목록을 출력한다.
| |
| generator = file_service.list_directories_and_files('myshare') |
| for file_or_dir in generator: |
| print(file_or_dir.name) |
- File Storage의 파일을 Local Storage로 다운로드한다.
- 다운로드를 하고 파일의 이름을 IU_DOWNLOAD.jfif로 바꾼다.
| |
| file_service.get_file_to_path('myshare', 'sampledir', 'myfile.jfif', 'IU_DOWNLOAD.jfif') |
| |
| metadata = { 'foo' : 'bar' } |
| snapshot = file_service.snapshot_share('myshare', metadata=metadata) |
| |
| share = list(file_service.list_shares(include_snapshots=True)) |
| |
| directories_and_files = list(file_service.list_directories_and_files('myshare', snapshot='2023-05-14T12:09:25.0000000Z')) |
| |
| for file_or_dir in directories_and_files: |
| print(file_or_dir.name) |
| |
| file_service.delete_share('myshare', snapshot='2023-05-14T12:09:25.0000000Z') |
- 지금까지 생성했던 파일을 삭제해본다. (myshare/sampledir/myfile.jfif)
file_service.delete_file('myshare', 'sampledir', 'myfile.jfif')
- 생성했던 공유 폴더 자체를 삭제한다.
- 공유 폴더에 스냅샷이 들어있으면 삭제가 되지 않으니, 반드시 공유 폴더 안에 있는 스냅샷을 모두 지워준 후 이 작업을 수행한다.
③ Queue Service 다루기
| !pip install azure-storage-queue==2.1.0 |
| from azure.storage.queue import QueueService, QueueMessageFormat |
- 연결 문자열을 이용하여 연결한 후, queue-myqueue라는 이름의 큐를 Azure Storage Account에 생성한다.
| connect_str='************************************************************' |
| |
| queue_name = 'queue-myqueue' |
| queue_service = QueueService(connection_string=connect_str) |
| |
| queue_service.create_queue(queue_name) |
- 큐에 메시지를 저장해본다.
- 메시지로 변환하는 것을 엔코드(Encode) 라고 한다. (Encoding)
- 메시지를 풀어내는 것을 디코드(Decode) 라고 한다. (Decoding)
| queue_service.encode_function = QueueMessageFormat.binary_base64encode |
| queue_service.decode_function = QueueMessageFormat.binary_base64decode |
| import base64 |
| message = 'Hello World2' |
| print('Adding message: ' + message) |
| |
| message = base64.b64encode(message.encode('utf-8')) |
| queue_service.put_message(queue_name, message) |
- Azure Queue 페이지에서 암호화된 메시지를 확인할 수 있다.
- 이제 이 암호화된(인코딩된) 메시지를 선택해서 가져온 후, 출력해본다.
| messages = queue_service.peek_messages(queue_name) |
| |
| for peeked_message in messages: |
| message = base64.b64decode(peeked_message.content) |
| print('Peeked message: ' + message.decode('utf-8')) |
- Peak이 아닌 Get 방식으로 Azure Queue 페이지의 메시지를 가져와 본다.
- Peak 방식은 확인만 하는 것이다. 즉, 메시지를 가져오지 않는다. (간보기)
- Get 방식은 실제로 가져오는 것이다.
| messages = queue_service.get_messages(queue_name) |
| |
| for msg in messages: |
| message = base64.b64decode(msg.content) |
| print('Got message: ' + message.decode('utf-8')) |
참고 사이트
Storage 계정 개요 - Azure Storage
Azure Storage의 다양한 스토리지 계정 유형에 대해 알아봅니다. 계정 이름, 성능 계층, 액세스 계층, 중복, 암호화, 엔드포인트 등을 살펴봅니다.
learn.microsoft.com