Azure 파일 공유를 만들고 헤드 노드에 탑재하는 세부 단계는 Windows에서 Azure File Storage 시작을 참조하세요.

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

Blob Storage에 대한 자세한 내용은 Azure Blob Storage 소개를 참조하세요.

Azure Storage 계정 만들기

첫 번째 Azure Storage 계정을 가장 쉽게 만드는 방법은 Azure Portal을 사용하는 것입니다. 자세한 내용은 스토리지 계정 만들기를 참조하십시오.

또한 Azure PowerShell, Azure CLI 또는 .NET용 Azure Storage 리소스 공급자를 사용하여 Azure 스토리지 계정을 만들 수도 있습니다.

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

Azure Storage iOS 라이브러리를 애플리케이션으로 가져오기

Azure Storage CocoaPod를 사용하거나 프레임워크 파일을 가져와 Azure Storage iOS 라이브러리를 애플리케이션으로 가져올 수 있습니다. CocoaPod는 라이브러리를 손쉽게 통합하는 반면, 프레임워크 파일에서 가져오기는 기존 프로젝트에 대해 덜 침입적이기 때문에 권장되는 방식입니다.

이 라이브러리를 사용하려면 다음이 필요합니다.

  • iOS 8+
  • Xcode 7+

CocoaPod

  1. 컴퓨터에 CocoaPod를 아직 설치하지 않은 경우 터미널 창을 열고 다음 명령을 실행하여 컴퓨터에 이 프로그램을 설치합니다.

    sudo gem install cocoapods
    
  2. 그런 다음 프로젝트 디렉터리(.xcodeproj 파일이 포함된 디렉터리)에서 Podfile(파일 확장명 없음)이라는 새 파일을 만듭니다. Podfile에 다음을 추가한 후 저장합니다.

    platform :ios, '8.0'
    
    target 'TargetName' do
      pod 'AZSClient'
    end
    
  3. 터미널 창에서 프로젝트 디렉터리로 이동하고 다음 명령을 실행합니다.

    pod install
    
  4. Xcode에서 .xcodeproj가 열려 있으면 닫습니다. 프로젝트 디렉터리에서 확장명이 .xcworkspace인 새로 만든 프로젝트 파일을 엽니다. 지금부터 이 파일로 작업하게 됩니다.

프레임워크

라이브러리를 사용하는 다른 방법은 프레임워크를 수동으로 빌드하는 것입니다.

  1. 먼저, azure-storage-ios repo를 다운로드하거나 복제합니다.
  2. azure-storage-ios ->Lib ->Azure Storage 클라이언트 라이브러리로 이동하고 Xcode에서 AZSClient.xcodeproj를 엽니다.
  3. Xcode의 왼쪽 위에서 "Azure Storage 클라이언트 라이브러리"의 활성 구성표를 "프레임워크"로 변경합니다.
  4. 프로젝트를 빌드합니다(⌘+B). 그러면 바탕 화면에 AZSClient.framework 파일이 만들어집니다.

그런 다음, 다음을 수행하여 프레임워크 파일을 애플리케이션으로 가져올 수 있습니다.

  1. 새 프로젝트를 만들거나 Xcode에서 기존 프로젝트를 엽니다.
  2. AZSClient.framework를 Xcode 프로젝트 탐색기에 끌어다 놓습니다.
  3. 필요한 경우 항목 복사를 선택하고 마침을 클릭합니다.
  4. 왼쪽의 탐색에서 프로젝트를 클릭하고 프로젝트 편집기의 위에서 일반 탭을 클릭합니다.
  5. 연결된 프레임워크 및 라이브러리 섹션 아래에서 추가 단추 (+)를 클릭합니다.
  6. 이미 제공된 라이브러리 목록에서 libxml2.2.tbd를 검색하고 프로젝트에 추가합니다.

라이브러리 가져오기

// Include the following import statement to use blob APIs.
#import <AZSClient/AZSClient.h>

Swift를 사용하는 경우 브리징 헤더를 만들고 <AZSClient/AZSClient.h>를 가져와야 합니다.

  1. 헤더 파일 Bridging-Header.h를 만들고 위의 import 문을 추가합니다.
  2. 빌드 설정 탭으로 이동하고 Objective-C 브리징 헤더를 검색합니다.
  3. Objective-C 브리징 헤더의 필드를 두 번 클릭하고 다음 헤더 파일에 경로를 추가합니다.ProjectName/Bridging-Header.h
  4. 프로젝트(⌘+B)를 빌드하여 Xcode로 브리징 헤더를 받았음을 확인합니다.
  5. Swift 파일에서 직접 라이브러리를 사용하여 시작하면 import 문이 필요 없습니다.

Azure Storage에 액세스하도록 애플리케이션 구성

Storage 서비스에 액세스하려면 애플리케이션을 인증하는 두 가지 방법이 있습니다.

  • 공유 키: 테스트 목적으로만 공유 키 사용
  • SAS(공유 액세스 서명): 프로덕션 애플리케이션에 SAS 사용

공유 키

공유 키 인증은 애플리케이션이 계정 이름과 계정 키를 사용하여 Storage 서비스에 액세스하는 것을 의미합니다. 이 시작 설명서에서는 이 라이브러리를 사용하는 방법을 신속하게 표시하는 용도로 공유 키 인증을 사용합니다.

경고

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

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

  • DefaultEndpointsProtocol - HTTP 또는 HTTPS를 선택할 수 있습니다. 그러나 HTTPS를 사용하는 것이 좋습니다.
  • 계정 이름 - 스토리지 계정의 이름입니다.
  • 계정 키 - Azure Portal에서 스토리지 계정으로 이동하고 아이콘을 클릭하여 이 정보를 찾습니다.
  • (선택 사항) EndpointSuffix - Azure 중국 또는 Azure 거버넌스와 같이 다른 엔드포인트 접미사가 붙은 지역의 스토리지 서비스에 사용됩니다.

공유 키 인증을 사용하는 연결 문자열의 예는 다음과 같습니다.

"DefaultEndpointsProtocol=https;AccountName=your_account_name_here;AccountKey=your_account_key_here"

공유 액세스 서명(SAS)

모바일 애플리케이션에서 Azure Storage 서비스에 대해 클라이언트의 요청을 인증하는 데 권장되는 방법은 SAS(공유 액세스 서명)를 사용하는 것입니다. SAS를 사용하면 지정된 사용 권한 집합과 함께 지정된 기간 동안 리소스에 대한 클라이언트 액세스를 부여할 수 있습니다. 스토리지 계정 소유자는 모바일 클라이언트에서 사용할 SAS를 생성해야 합니다. SAS를 생성하려면 클라이언트로 배포되는 SAS를 생성하는 별도의 서비스를 작성할 수 있습니다. 테스트를 위해 Microsoft Azure Storage Explorer 또는 Azure Portal을 사용하여 SAS를 생성합니다. SAS를 만들 때, SAS가 유효한 시간 간격 및 SAS가 클라이언트에 부여하는 사용 권한을 지정할 수 있습니다.

다음 예제에서는 Microsoft Azure Storage Explorer를 사용하여 SAS를 생성하는 방법을 보여 줍니다.

  1. 아직 설치하지 않은 경우 Microsoft Azure Storage Explorer를 설치

  2. 구독에 연결합니다.

  3. Storage 계정에 클릭하고 왼쪽 아래에서 "동작" 탭을 클릭합니다. "공유 액세스 서명 가져오기"를 클릭하여 SAS에 대한 "연결 문자열"을 생성합니다.

  4. 다음은 Storage 계정의 Blob service에 대한 서비스, 컨테이너 및 개체 수준에서 읽기 및 쓰기 권한을 부여하는 SAS 연결 문자열 예제입니다.

    "SharedAccessSignature=sv=2015-04-05&ss=b&srt=sco&sp=rw&se=2016-07-21T18%3A00%3A00Z&sig=3ABdLOJZosCp0o491T%2BqZGKIhafF1nlM3MzESDDD3Gg%3D;BlobEndpoint=https://youraccount.blob.core.windows.net"

위에 표시된 것처럼 SAS를 사용하는 경우, 애플리케이션에서 계정 키가 노출되지 않습니다. 공유 액세스 서명: SAS 모델 이해를 확인하여 SAS 및 SAS 사용 모범 사례에 대해 자세히 알아볼 수 있습니다.

비동기 작업

참고

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

컨테이너 만들기

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

-(void)createContainer{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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.");
        }
    }];
}

Microsoft Azure Storage Explorer 를 확인하고 해당 newcontainer 가 스토리지 계정에 대한 컨테이너 목록에 있는지 확인하여 이 작업을 확인할 수 있습니다.

컨테이너 사용 권한 설정

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

  • 프라이빗: 계정 소유자만 컨테이너 및 Blob 데이터를 읽을 수 있습니다.
  • Blob: 이 컨테이너 내의 Blob 데이터는 익명 요청을 통해 읽을 수 있으나 컨테이너 데이터는 읽을 수 없습니다. 클라이언트는 익명 요청을 통해 컨테이너 내의 Blob을 열거할 수 없습니다.
  • 컨테이너: 익명 요청을 통해 컨테이너와 Blob 데이터를 읽을 수 있습니다. 클라이언트는 익명 요청을 통해 컨테이너 내에서 Blob을 열거할 수 있지만 스토리지 계정 내에서 컨테이너를 열거할 수는 없습니다.

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

-(void)createContainerWithPublicAccess{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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 Storage는 블록 Blob, 추가 Blob, 페이지 Blob의 세 가지 Blob 유형을 제공합니다. Azure Storage iOS 라이브러리는 세 가지 형식의 Blob을 모두 지원합니다. 대부분의 경우에는 블록 Blob을 사용하는 것이 좋습니다.

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

-(void)uploadBlobToContainer{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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.");
                    }
                }];
            }
        }];
}

Microsoft Azure Storage Explorer를 확인하고 컨테이너 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 service가 플랫 스토리지 스키마인 경우에도 경로 정보로 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{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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{
    NSError *accountCreationError;

    // 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" error:&accountCreationError];

    if(accountCreationError){
        NSLog(@"Error in creating account.");
    }

    // 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");
        }
    }];
}

다음 단계

지금까지 iOS에서 Blob Storage를 사용하는 방법을 살펴보았으므로 다음 링크를 따라 이동하여 iOS 라이브러리 및 Storage 서비스에 대한 자세한 내용을 확인하세요.

이 라이브러리에 대한 문의 사항이 있는 경우 Microsoft Q&A 질문 페이지 또는 Stack Overflow에 자유롭게 게시해 주세요. Azure Storage에 대한 기능 제안 사항이 있는 경우 Azure Storage 피드백에 게시해 주세요.