본문 바로가기

Data Engineering/MS Azure

Azure Blob 스토리지에 대한 이해

클라우드 제품이 MS Azure 클라우드 기반으로 만들어진 많은 경우, 비용적인 측면과 사용에의 편리함 때문에 데이터 레이크로 Blob 스토리지를 사용할  가능성이 매우 높다. 본인 역시 회사에서 운영 중인 클라우드 제품 일부가 Azure 기반으로 설계되어, 데이터 파이프라인 구축할 때 Azure에 대한 이해가 필수적으로 필요했다. 예전에 정리해둔 내용을 공개해본다..

 

1. MS Azure Blob Storage  

Azure Blob Storage는 클라우드를 위한 Microsoft의 개체 스토리지 솔루션이다. Blob Storage는 대량의 비정형 데이터를 저장하도록 최적화되어 있다. 비정형 데이터는 텍스트 또는 이진 데이터와 같은 특정 데이터 모델이나 정의를 따르지 않는 데이터이다.

사용자 또는 클라이언트 애플리케이션은 전 세계 어디서든 HTTP/HTTPS를 통해 Blob Storage의 개체에 액세스할 수 있다. Blob Storage의 개체는 Azure Storage REST API, Azure PowerShell, Azure CLI 또는 Azure Storage 클라이언트 라이브러리를 통해 액세스할 수 있다. 클라이언트 라이브러리는 다음을 포함하여 다양한 언어에서 사용할 수 있다.: .NET, Java, Node.JS, Python, Go, PHP, Ruby

 

 

1-1. Azure Blob Service

Azure Blob 저장소는 HTTP 또는 HTTPS를 통해 전 세계 어디에서든 액세스할 수 있는 다량의 구조화되지 않은 개체 데이터(예: 텍스트 또는 이진 데이터)를 저장할 수 있는 서비스

  • Blob: 모든 형식과 크기의 파일. 
  • 컨테이너: Blob 집합 그룹화를 제공. 모든 Blob은 컨테이너에 있어야 한다.
  • 액세스 키: 스토리지 계정에 대한 애플리케이션의 요청을 인증한다.
    • Azure Key Vault 같은 안전한 위치에 키를 보관하고 새 키로 자주 대체한다.
    • 두 키를 사용하면 다른 키를 사용하는 동안 하나를 대체할 수 있다.
  • 연결 문자열: 스토리지 계정의 루트 암호와 비슷하다.
    • 스토리지 계정 이름, 계정키(i.e. 액세스키), 기본 엔드포인트 프로토콜,  엔드포인트 서픽스로 이루어진 문자열이다.

 

1-2. 개발자가 Azure Portal에서 blob 파일을 확인하는 방법

로그인 > 디렉터리 선택 > Azure 서비스 중 '스토리지 계정' 메뉴 클릭 >  blob 파일을 확인할 하나의 계정 클릭 > 데이터 스토리지의 '컨테이너' 메뉴 클릭 > 컨테이너 > ... 

위와 같이 폴더트리 구조처럼 보이지만 blob 자체가 파일이다.

 

1-3. 개발자가 Azure Portal에서 액세스 키를 확인하는 방법

로그인 > 디렉터리 선택 > Azure 서비스 중 '스토리지 계정' 메뉴 클릭 > 액세스 키를 확인할 하나의 계정 클릭 > 보안+네트워킹의 '액세스 키' 메뉴 클릭 > 상단 '키 표시' 버튼 클릭 > key1의 키와 연결 문자열 복사

 

 


2. MS Azure Blob Storage 이용한 Data Pipeline 구축 방법

스토리지 계정을 만들 때 Azure는 두 개의 512비트 스토리지 계정 액세스 키를 생성한다. 이러한 키를 사용하면 공유 키 권한 부여를 통해 스토리지 계정의 데이터에 액세스 권한을 부여할 수 있다. Azure Storage REST API를 이용하여 MS Azure Blob Storage에 Access하겠다.  

 

고려 사항  Python Spark
장점 데이터 처리를 지원하는 고기능의 라이브러리가 많다.
ID DX 서버 정책에 일관성이 부여된다.
대용량 데이터를 처리하는 데에 속도가 빠르다.
데이터를 구조화하고 인덱싱 하기 간편하다.
단점 데이터 사이즈 증가에 따라 물리적인 서버의 성능에 영향을 많이 받는다. Azure Storage REST API를 Spark로만 지원하지 않는다.

데이터 파이프라인을 구축할 때 중요한 점은 기존에 사용하고 있던 툴과 dependency를 갖고 운영 상의 문제를 일으키지 않는지 점검하는 것이다. 쉬운 방법으로는 기존에 사용하던 툴이 있다면 연장 선상에서 추가적으로 사용하는 것이 안전할 수 있다. 본인도 현재 회사의 데이터 수집, 전처리 파이프라인이 Python 자체 개발 모듈로 수행 중이므로 Python으로 제공하는 라이브러리를 활용하여 Blob 파일에 접근했다(하지만 후에 이는 속도 측면에서 확실히 불리한 선택이었음을 깨달았다).

 

 

2-1. 연결 문자열을 활용한 Access

연결 문자열의 획득은 본 문서의 1-3을 확인하세요.

// code placeholder
# Import Libraries
from azure.storage.blob import BlobClient

# Import Configuration Variables
# If there is a problem to configure access info of MS Azure,
# then check the configuration file ./utils/iddx_configs.py
import utils.iddx_configs as IddxConfigs

AZURE_CCKR_STORAGE_CONNECTION_STRING = 'DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2};EndpointSuffix={3}'.format(IddxConfigs.IDDX_SOLMA_CCKR_DEFAULTENDPOINTSPROTOCOL, IddxConfigs.IDDX_SOLMA_CCKR_ACCOUNTNAME, IddxConfigs.IDDX_SOLMA_CCKR_ACCOUNTKEY, IddxConfigs.IDDX_SOLMA_CCKR_ENDPOINTSUFFIX)
CONTAINER_NAME = 'my_contatiner'
BLOB_NAME = 'my_blob_file_name.json'

blob_client = BlobClient.from_connection_string(AZURE_CCKR_STORAGE_CONNECTION_STRING, container_name=CONTAINER_NAME, blob_name=BLOB_NAME)

 

2-2. SAS(공유 액세스 서명)을 활용한 Access

Azure Storage 컨테이너에 대한 제한된 액세스 권한을 부여하는 URI이다. 스토리지 계정 키를 공유하지 않고 특정 시간 범위 동안 스토리지 계정 리소스에 대한 액세스 권한을 부여하려는 경우에 SAS를 사용한다.

 

 


#. 보안 액세스를 위한 고민

1. 설정값 관리 방법

개발 서버,  접속 정보와 같은 설정값은 보안 관리되어야 할 대상이다.

AS IS 

  • 빌트인 데이터, 혹은 외부 파일을 통해 설정(config 파일)되어 있다.

TO BE 

  1. 저장소 위치 및 저장 방식 변경이 필요하다.
  2. 설정값에 대해 주기적으로 유효성 TEST가 필요하다.
  3. 메인 저장소, 서브 저장소를 두고 주기적으로 동기화해줘야 한다(메인 저장소에 접근 불가한 상태일때, 설정값을 사용하지 못하는 운영 케이스가 발생한다. 이때 서브 저장소에서 저장된 설정값을 사용할 수 있도록 앱이 구성되어야 한다).

 

설정값 저장소/저장 방식에 대해 고민 중인 방법


방법 환경 변수를 사용 동적 로딩을 사용
장점 별도의 파일로 관리되지 않으므로 시크릿 값 등이 노출될 위험이 적음
환경변수만 받아오면 되기 때문에 사용하기 편함
특정 도커 컨테이너에 제한되지 않고 소스 코드 어디에서도 가져다 쓸 수 있음
특정 프로젝트 디렉토리에 제한되지 않음
설정값을 구조화하여 관리할 수 있음
단점 Apach Server, Nginx Server 웹서버에서는 환경 변수를 사용할 수 없음
설정값이 많아지면 효율적인 관리가 어려움
DB connection에 문제가 생기는 경우, 설정값을 사용할 수 없음
(즉 설정값만 저장하는 DB를 분리하는 것이 좋음)
DB 설계 및 관리를 잘해야 함

 

 

References

Python Library: azure-storage-blob v 12.9.0 (link)

Python Library: azure-storage-blob / BlobClient Class(link)