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

 

개요

이 문서에서는 Microsoft Azure Blob 저장소를 사용하여 일반 시나리오를 수행하는 방법을 보여 줍니다. 샘플은 Objective-C로 작성되었으며 Azure Storage Client Library for iOS를 사용합니다. Blob 업로드나열다운로드 및 삭제 시나리오를 다룹니다. Blob에 대한 자세한 내용은다음 단계 섹션을 참조하십시오. 또한 샘플 앱을 다운로드하여 iOS 응용 프로그램에서 Azure 저장소의 사용을 신속하게 볼 수 있습니다.

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 저장소 에뮬레이터 사용을 참조하세요.

프레임워크 파일 빌드

Azure 저장소 iOS 라이브러리를 사용하려면 먼저 프레임워크 파일을 빌드해야 합니다.

  1. 먼저, azure-storage-ios repo를 다운로드하거나 복제합니다.

  2. azure-storage-ios -> Lib -> *Azure 저장소 클라이언트 라이브러리*로 이동하고 X 코드에서 Azure Storage Client Library.xcodeproj를 엽니다.

  3. Xcode의 왼쪽 위에서 "Azure 저장소 클라이언트 라이브러리"의 활성 구성표를 "프레임워크"로 변경합니다.

  4. 프로젝트를 빌드합니다(⌘+B). 그러면 바탕 화면에 Azure Storage Client Library.framework 파일이 만들어집니다.

Azure 저장소 iOS 라이브러리를 응용 프로그램으로 가져오기

다음을 수행하여 Azure 저장소 iOS 라이브러리를 응용 프로그램으로 가져올 수 있습니다.

  1. 새 프로젝트를 만들거나 Xcode에서 기존 프로젝트를 엽니다.

  2. 왼쪽의 탐색에서 프로젝트를 클릭하고 프로젝트 편집기의 위에서 일반 탭을 클릭합니다.

  3. 연결된 프레임워크 및 라이브러리 섹션 아래에서 추가 단추 (+)를 클릭합니다.

  4. *기타 추가...*를 클릭합니다. 방금 만든 Azure Storage Client Library.framework 파일을 찾아 추가합니다.

  5. 연결된 프레임워크 및 라이브러리 섹션 아래에서 추가 단추 (+)를 다시 클릭합니다.

  6. 이미 제공된 라이브러리 목록에서 libxml2.2.dylib를 검색하고 프로젝트에 추가합니다.

Import 문

Azure 저장소 API를 호출하려는 파일에 다음 import 문을 포함해야 합니다.

// Include the following import statement to use blob APIs.
#import <Azure Storage Client Library/Azure_Storage_Client_Library.h>

Blob 저장소에 액세스하도록 응용 프로그램 구성

저장소 서비스에 액세스하려면 응용 프로그램을 인증하는 두 가지 방법이 있습니다.

  • 공유 키: 테스트 목적으로만 공유 키 사용
  • 공유 액세스 서명(SAS): 프로덕션 응용 프로그램에 대해 SAS 사용

공유 키

공유 키 인증은 응용 프로그램이 계정 이름과 계정 키를 사용하여 저장소 서비스에 액세스하는 것을 의미합니다. 이 시작 설명서에서는 iOS에서 Blob 저장소를 사용하는 방법을 신속하게 표시하는 용도로 공유 키 인증을 사용합니다.

Only use Shared Key authentication for testing purposes!

연결된 저장소 계정에 대한 전체 읽기/쓰기 액세스를 부여하는 계정 이름 및 계정 키가 앱을 다운로드한 모든 사람에게 배포됩니다. 이 방법은 신뢰할 수 없는 클라이언트가 키를 손상시킬 수 있는 위험이 있으므로 좋은 방법은 아닙니다.

공유 키 인증을 사용하면 연결 문자열이 만들어집니다. 연결 문자열은 다음과 같이 구성됩니다.

  • DefaultEndpointsProtocol - HTTP 또는 HTTPS를 선택할 수 있습니다. 그러나 HTTPS를 사용하는 것이 좋습니다.
  • 계정 이름 - 저장소 계정의 이름입니다.
  • 계정 키 - Azure 포털을 사용 중인 경우 저장소 계정으로 이동하고  아이콘을 클릭하여 이 정보를 찾습니다. Azure 클래식 포털을 사용하는 경우 포털에서 저장소 계정으로 이동하고액세스 키 관리를 클릭합니다.

응용 프로그램에서의 모양은 다음과 같습니다.

// Create a storage account object from a connection string.
AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=account_name;AccountKey=account_key"];

공유 액세스 서명(SAS)

iOS 응용 프로그램에서 Blob 저장소에 대해 클라이언트의 요청을 인증하는 데 권장되는 방법은 공유 액세스 서명(SAS)을 사용하는 것입니다. SAS를 사용하면 지정된 사용 권한 집합과 함께 지정된 기간 동안 리소스에 대한 클라이언트 액세스를 부여할 수 있습니다. 저장소 계정 소유자는 iOS 클라이언트에서 사용할 SAS를 생성해야 합니다. SAS를 생성하려면 클라이언트로 배포되는 SAS를 생성하는 별도의 서비스를 작성할 수 있습니다. 테스트를 위해 Azure CLI를 사용하여 SAS를 생성할 수도 있습니다. 공유 키 자격 증명이 SAS를 생성하는 데 사용되지만 클라이언트는 SAS URL에 캡슐화된 인증 정보를 사용하여 생성된 SAS 사용할 수 있습니다. SAS를 만들 때, SAS가 유효한 시간 간격 및 SAS가 클라이언트에 부여하는 사용 권한을 지정할 수 있습니다. 예를 들어 Blob 컨테이너에 대해, SAS는 컨테이너에서 Blob에 대한 읽기, 쓰기 또는 삭제 권한을 부여하고 컨테이너에서 Blob를 나열하는 나열 권한을 부여할 수 있습니다.

다음 예제에서는 Azure CLI를 사용하여 2015년 9월 5일 오전 12:00시(UTC)까지, 컨테이너 *sascontainer*에 대한 읽기 및 쓰기 권한을 부여하는 SAS 토큰을 생성하는 방법을 보여줍니다.

  1. 먼저 Azure CLI 설치를 참조하여 Azure CLI를 설치하고 Azure 구독에 연결하는 방법을 알아봅니다.

  2. 그런 다음 Azure CLI에서 다음 명령을 입력하여 사용자 계정에 대한 연결 문자열을 가져옵니다.

    azure storage account connectionstring show youraccountname
  3. 방금 생성된 연결 문자열로 환경 변수를 만듭니다.

    export AZURE_STORAGE_CONNECTION_STRING=”your connection string
  4. SAS URL을 생성합니다.

    azure storage container sas create --container sascontainer --permissions rw --expiry 2015-09-05T00:00:00
  5. SAS URL은 다음과 유사하게 나타납니다.

    https://myaccount.blob.core.windows.net/sascontainer/sasblob.txt?sv=2012-02-12&st=2013-04-29T22%3A18%3A26Z&se=2013-04-30T02%3A23%3A26Z&sr=b&sp=rw&sig=Z%2FRHIX5Xcg0Mq2rqI3OlWTjEg2tYkboXr1P9ZUXDtkk%3D
  6. iOS 응용 프로그램에서 다음과 같은 방식으로 SAS URL을 사용하여 이제 컨테이너에 대한 참조를 가져올 수 있습니다.

    // Get a reference to a container in your Storage account
    AZSCloudBlobContainer *blobContainer = [[AZSCloudBlobContainer alloc] initWithUrl:[NSURL URLWithString:@" your SAS URL"]];

보시는 바와 같이 SAS 토큰을 사용하는 경우, iOS 응용 프로그램에서 계정 이름 및 계정 키가 노출되지 않습니다. 공유 액세스 서명: SAS 모델 이해를 확인하여 SAS에 대해 자세히 알아볼 수 있습니다.

비동기 작업

참고:

서비스에 대한 요청을 수행하는 모든 메서드는 비동기 작업입니다. 코드 샘플에서 이러한 메서드에는 완료 처리기가 있음을 확인할 수 있습니다. 완료 처리기 내에 있는 코드는 요청이 완료된  실행됩니다. 완료 처리기 이후 코드는 요청이 이루어지는 동안 실행됩니다.

컨테이너 만들기

Azure 저장소의 모든 Blob는 컨테이너에 있어야 합니다. 다음 예제에서는 *newcontainer*라는 컨테이너를 저장소 계정에 만드는 방법을 보여 줍니다(아직 없는 경우). 컨테이너에 대한 이름을 선택할 때 위에서 언급한 명명 규칙을 따릅니다.

 -(void)createContainer{
    // Create a storage account object from a connection string.
    AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

    // Create a blob service client object.
    AZSCloudBlobClient *blobClient = [account getBlobClient];

    // Create a local container object.
    AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"newcontainer"];

    // Create container in your Storage account if the container doesn't already exist
    [blobContainer createContainerIfNotExistsWithCompletionHandler:^(NSError *error, BOOL exists) {
        if (error){
            NSLog(@"Error in creating container.");
        }
    }];
}

Azure 포털 또는 저장소 탐색기를 확인하고 저장소 계정에 대한 컨테이너 목록에 *newcontainer*가 있는지 확인하여 이 작업을 확인할 수 있습니다.

컨테이너 사용 권한 설정

기본적으로 컨테이너의 사용 권한은 개인 액세스용으로 구성됩니다. 그러나 컨테이너는 컨테이너 액세스에 대한 몇 가지 다른 옵션을 제공합니다.

  • 개인: 계정 소유자만 컨테이너 및 Blob 데이터를 읽을 수 있습니다.

  • Blob: 이 컨테이너 내의 Blob 데이터는 익명 요청을 통해 읽을 수 있으나 컨테이너 데이터는 읽을 수 없습니다. 클라이언트는 익명 요청을 통해 컨테이너 내의 Blob을 열거할 수 없습니다.

  • 컨테이너: 익명 요청을 통해 컨테이너와 Blob 데이터를 읽을 수 있습니다. 클라이언트는 익명 요청을 통해 컨테이너 내에서 Blob을 열거할 수 있지만 저장소 계정 내에서 컨테이너를 열거할 수는 없습니다.

다음 예제에서는 인터넷에서 모든 사용자의 공용, 읽기 전용 액세스를 허용할 컨테이너 액세스 권한으로 컨테이너를 만드는 방법을 보여 줍니다.

 -(void)createContainerWithPublicAccess{
    // Create a storage account object from a connection string.
    AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

    // Create a blob service client object.
    AZSCloudBlobClient *blobClient = [account getBlobClient];

    // Create a local container object.
    AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"containerpublic"];

    // Create container in your Storage account if the container doesn't already exist
    [blobContainer createContainerIfNotExistsWithAccessType:AZSContainerPublicAccessTypeContainer requestOptions:nil operationContext:nil completionHandler:^(NSError *error, BOOL exists){
        if (error){
            NSLog(@"Error in creating container.");
        }
    }];
}

컨테이너에 Blob 업로드

Blob 서비스 개념 섹션에서 설명한 것처럼 Blob 저장소는 블록 Blob, 추가 Blob, 페이지 Blob의 서로 다른 Blob 유형을 제공합니다. 현재 Azure 저장소 iOS 라이브러리는 블록 Blob만 지원합니다. 대부분의 경우 블록 Blob을 사용하는 것이 좋습니다.

다음 예제에서는 NSString에서 블록 Blob를 업로드하는 방법을 보여줍니다. 같은 이름의 Blob가 이 컨테이너에 이미 있는 경우 이 Blob의 내용을 덮어씁니다.

 -(void)uploadBlobToContainer{
    // Create a storage account object from a connection string.
    AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

    // Create a blob service client object.
    AZSCloudBlobClient *blobClient = [account getBlobClient];

    // Create a local container object.
    AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"containerpublic"];

    [blobContainer createContainerIfNotExistsWithAccessType:AZSContainerPublicAccessTypeContainer requestOptions:nil operationContext:nil completionHandler:^(NSError *error, BOOL exists)
     {
         if (error){
             NSLog(@"Error in creating container.");
         }
         else{
             // Create a local blob object
             AZSCloudBlockBlob *blockBlob = [blobContainer blockBlobReferenceFromName:@"sampleblob"];

             // Upload blob to Storage
             [blockBlob uploadFromText:@"This text will be uploaded to Blob Storage." completionHandler:^(NSError *error) {
                if (error){
                    NSLog(@"Error in creating blob.");
                }             
             }];
         }
     }];
 }

Azure 포털 또는 저장소 탐색기를 확인하고 컨테이너 *containerpublic*이 Blob *sampleblob*을 포함하는지 확인하여 이 작업을 확인할 수 있습니다. 이 샘플에서는 공용 컨테이너를 사용했으므로 Blob URI로 이동하여 작업을 확인할 수도 있습니다.

https://nameofyourstorageaccount.blob.core.windows.net/containerpublic/sampleblob

NSString에서 블록 Blob를 업로드하는 것 외에도 이와 유사한 메서드가 NSData, NSInputStream 또는 로컬 파일에 존재합니다.

컨테이너의 Blob 나열

다음 예제에서는 컨테이너의 모든 Blob를 나열하는 방법을 보여줍니다. 이 작업을 수행할 때는 다음 매개 변수를 염두에 두어야 합니다.

  • continuationToken - 연속 토큰은 목록 작업을 시작할 위치를 나타냅니다. 토큰이 제공되지 않는 경우 처음부터 Blob를 나열합니다. 0에서 최대 설정까지 개수에 관계 없이 Blob를 나열할 수 있습니다. 이 메서드가 0개의 결과를 반환하더라도 results.continuationToken이 nil이 아니면 서비스에 나열되지 않은 더 많은 Blob이 있을 수 있습니다.
  • prefix - Blob 목록에 사용할 접두사를 지정할 수 있습니다. 이 접두사로 시작하는 Blob만 나열됩니다.
  • useFlatBlobListing - 컨테이너 및 Blob 이름 명명 및 참조 섹션에서 설명한 것처럼 Blob 서비스가 플랫 저장소 스키마인 경우에도 경로 정보로 Blob 이름을 지정하여 가상 계층 구조를 만들 수 있습니다. 그러나 현재는 플랫이 아닌 목록은 지원되지 않으며 곧 제공될 예정입니다. 지금은 이 값이 YES여야 합니다.
  • blobListingDetails - Blob을 나열할 때 포함할 항목을 지정할 수 있습니다.
    • AZSBlobListingDetailsNone: 커밋된 Blob만 나열하고 Blob 메타데이터는 반환하지 않습니다.
    • AZSBlobListingDetailsSnapshots: 커밋된 Blob 및 Blob 스냅숏을 나열합니다.
    • AZSBlobListingDetailsMetadata: 목록에 반환된 각 Blob에 대한 Blob 메타데이터를 검색합니다.
    • AZSBlobListingDetailsUncommittedBlobs: 커밋 및 커밋되지 않은 Blob을 나열합니다.
    • AZSBlobListingDetailsCopy: 목록에 복사 속성을 포함합니다.
    • AZSBlobListingDetailsAll: 사용 가능한 모든 커밋된 Blob, 커밋되지 않은 Blob 및 스냅숏을 나열하고 모든 메타데이터와 해당 Blob에 대한 복사 상태를 반환합니다.
  • maxResults - 이 작업에 대해 반환할 결과의 최대 수입니다. 제한을 설정하지 않으려면 -1을 사용합니다.
  • completionHandler - 나열 작업의 결과와 함께 실행할 코드 블록입니다.

이 예제에서는 연속 토큰이 반환될 때마다 나열 Blob 메서드를 재귀적으로 호출하는 데 도우미 메서드가 사용됩니다.

-(void)listBlobsInContainer{
  // Create a storage account object from a connection string.
  AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

  // Create a blob service client object.
  AZSCloudBlobClient *blobClient = [account getBlobClient];

  // Create a local container object.
  AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"containerpublic"];

  //List all blobs in container
  [self listBlobsInContainerHelper:blobContainer continuationToken:nil prefix:nil blobListingDetails:AZSBlobListingDetailsAll maxResults:-1 completionHandler:^(NSError *error) {
     if (error != nil){
         NSLog(@"Error in creating container.");
     }
  }];
}

//List blobs helper method
-(void)listBlobsInContainerHelper:(AZSCloudBlobContainer *)container continuationToken:(AZSContinuationToken *)continuationToken prefix:(NSString *)prefix blobListingDetails:(AZSBlobListingDetails)blobListingDetails maxResults:(NSUInteger)maxResults completionHandler:(void (^)(NSError *))completionHandler
{
  [container listBlobsSegmentedWithContinuationToken:continuationToken prefix:prefix useFlatBlobListing:YES blobListingDetails:blobListingDetails maxResults:maxResults completionHandler:^(NSError *error, AZSBlobResultSegment *results) {
     if (error)
     {
         completionHandler(error);
     }
     else
     {
         for (int i = 0; i < results.blobs.count; i++) {
             NSLog(@"%@",[(AZSCloudBlockBlob *)results.blobs[i] blobName]);
         }
         if (results.continuationToken)
         {
             [self listBlobsInContainerHelper:container continuationToken:results.continuationToken prefix:prefix blobListingDetails:blobListingDetails maxResults:maxResults completionHandler:completionHandler];
         }
         else
         {
             completionHandler(nil);
         }
     }
  }];
}

Blob 다운로드

다음 예제에서는 NSString 개체로 Blob를 다운로드하는 방법을 보여줍니다.

 -(void)downloadBlobToString{
    // Create a storage account object from a connection string.
    AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

    // Create a blob service client object.
    AZSCloudBlobClient *blobClient = [account getBlobClient];

    // Create a local container object.
    AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"containerpublic"];

    // Create a local blob object
    AZSCloudBlockBlob *blockBlob = [blobContainer blockBlobReferenceFromName:@"sampleblob"];

    // Download blob    
    [blockBlob downloadToTextWithCompletionHandler:^(NSError *error, NSString *text) {
        if (error) {
            NSLog(@"Error in downloading blob");
        }
        else{
            NSLog(@"%@",text);
        }
    }];
}

Blob 삭제

다음 예제에서는 Blob를 삭제하는 방법을 보여줍니다.

 -(void)deleteBlob{
    // Create a storage account object from a connection string.
    AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

    // Create a blob service client object.
    AZSCloudBlobClient *blobClient = [account getBlobClient];

    // Create a local container object.
    AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"containerpublic"];

    // Create a local blob object
    AZSCloudBlockBlob *blockBlob = [blobContainer blockBlobReferenceFromName:@"sampleblob1"];

    // Delete blob
    [blockBlob deleteWithCompletionHandler:^(NSError *error) {
      if (error) {
        NSLog(@"Error in deleting blob.");
      }
    }];
 }

Blob 컨테이너 삭제

다음 예제에서는 컨테이너를 삭제하는 방법을 보여줍니다.

 -(void)deleteContainer{
    // Create a storage account object from a connection string.
    AZSCloudStorageAccount *account = [AZSCloudStorageAccount accountFromConnectionString:@"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"];

    // Create a blob service client object.
    AZSCloudBlobClient *blobClient = [account getBlobClient];

    // Create a local container object.
    AZSCloudBlobContainer *blobContainer = [blobClient containerReferenceFromName:@"containerpublic"];

    // Delete container
    [blobContainer deleteContainerIfExistsWithCompletionHandler:^(NSError *error, BOOL success) {
        if(error){
            NSLog(@"Error in deleting container");
        }
    }];
}