자습서: .NET 앱에서 Azure 스토리지 액세스

관리 ID를 사용하여 Azure App Service에서 실행되는 웹앱(로그인한 사용자가 아님)에서 Azure Storage 같은 Azure 서비스에 액세스하는 방법을 알아봅니다. 이 자습서에서는 예제로 Azure Storage로 연결하는 방법을 보여 줍니다.

관리 ID를 지원하는 모든 서비스(다음 이미지의 B)는 이 자습서를 사용하여 안전하게 액세스할 수 있습니다.

  • Azure Storage
  • Azure SQL Database
  • Azure Key Vault

Diagram that shows how to access storage.

웹앱에서 Azure 서비스(Azure Storage, Azure SQL Database, Azure Key Vault 또는 기타 서비스)에 대한 액세스 권한을 추가하려고 합니다. 공유 키를 사용할 수도 있지만, 그렇게 할 경우 비밀을 만들고 배포하고 관리할 수 있는 사람의 작업 보안을 걱정해야 합니다. 뿐만 아니라 키가 GitHub에 체크 인되어 해커가 키를 검색하는 방법을 알게 될 가능성이 있습니다. 웹앱에 데이터 액세스 권한을 부여하는 보다 안전한 방법은 관리 ID를 사용하는 것입니다.

Microsoft Entra ID의 관리 ID를 사용하면 앱 자격 증명 없이 App Service가 RBAC(역할 기반 액세스 제어)를 통해 리소스에 액세스할 수 있습니다. 웹앱에 관리 ID를 할당한 후에는 인증서를 만들고 배포하는 작업을 Azure가 처리합니다. 사용자는 비밀 또는 앱 자격 증명 관리에 대해 신경 쓸 필요가 없습니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 웹앱에서 시스템이 할당한 관리 ID를 만듭니다.
  • 스토리지 계정 및 Azure Blob Storage 컨테이너를 만듭니다.
  • 관리 ID를 사용하여 웹앱에서 스토리지에 액세스합니다.

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

필수 조건

앱에서 관리 ID 사용

Visual Studio를 통해 웹앱을 만들고 게시하는 경우 앱에서 관리 ID를 사용하도록 자동으로 설정되었습니다. 앱 서비스의 왼쪽 창에서 ID를 선택한 다음, 시스템 할당을 선택합니다. 상태켜기로 설정되어 있는지 확인합니다. 그렇지 않은 경우 켜기저장을 차례로 선택합니다. 확인 대화 상자에서 를 선택하여 시스템이 할당한 관리 ID를 사용하도록 설정합니다. 관리 ID를 사용하도록 설정하면 상태가 켜기로 설정되고 개체 ID를 사용할 수 있습니다.

Screenshot that shows the System assigned identity option.

이 단계에서는 인증/권한 부여 창에서 만든 앱 ID와 다른 새 개체 ID를 만듭니다. 시스템이 할당한 관리 ID의 개체 ID를 복사합니다. 나중에 필요합니다.

스토리지 계정 및 Blob Storage 컨테이너 만들기

이제 스토리지 계정 및 Blob Storage 컨테이너를 만들 수 있습니다.

모든 스토리지 계정은 Azure 리소스 그룹에 속해야 합니다. 리소스 그룹은 Azure 리소스를 그룹화하기 위한 논리적 컨테이너입니다. 스토리지 계정을 만들 때 새 리소스 그룹을 만들거나 기존 리소스 그룹을 사용할 수 있는 옵션이 있습니다. 이 문서에서는 새 리소스 그룹을 만드는 방법을 보여줍니다.

범용 v2 저장소 계정은 모든 Azure Storage 서비스(Blob, 파일, 큐, 테이블 및 디스크)에 대한 액세스를 제공합니다. 여기서 설명하는 단계에서는 범용 v2 스토리지 계정을 만들지만, 모든 유형의 스토리지 계정을 만드는 단계가 비슷합니다.

Azure Storage의 BLOB은 컨테이너로 구성됩니다. 이 자습서의 뒷부분에서 BLOB을 업로드하려면 먼저 컨테이너를 만들어야 합니다.

Azure Portal에서 범용 v2 스토리지 계정을 만들려면 다음 단계를 수행합니다.

  1. Azure Portal 메뉴에서 모든 서비스를 선택합니다. 리소스 목록에 스토리지 계정을 입력합니다. 입력을 시작하면 입력에 따라 목록이 필터링됩니다. Storage 계정을 선택합니다.

  2. 표시되는 스토리지 계정 창에서 만들기를 선택합니다.

  3. 스토리지 계정을 만들 구독을 선택합니다.

  4. 리소스 그룹 필드 아래의 드롭다운 메뉴에서 웹앱이 포함된 리소스 그룹을 선택합니다.

  5. 그런 다음, 스토리지 계정의 이름을 입력합니다. 선택하는 이름이 Azure에서 고유해야 합니다. 또한 이름의 길이가 3~24자여야 하고, 숫자 및 소문자만 포함할 수 있습니다.

  6. 스토리지 계정의 위치(영역)를 선택하거나 기본값을 사용합니다.

  7. 다음 필드는 기본값으로 유지합니다.

    필드
    배포 모델 리소스 관리자
    성능 표준
    계정 종류 StorageV2(범용 v2)
    복제 RA-GRS(읽기 액세스 지역 중복 스토리지)
    액세스 계층
  8. 검토 + 만들기를 선택하여 스토리지 계정 설정을 검토하고 계정을 만듭니다.

  9. 만들기를 실행합니다.

Azure Storage에서 Blob Storage 컨테이너를 만들려면 다음 단계를 수행합니다.

  1. Azure Portal의 새 스토리지 계정으로 이동합니다.

  2. 스토리지 계정의 왼쪽 메뉴에서 데이터 스토리지 섹션으로 스크롤한 다음, 컨테이너를 선택합니다.

  3. + 컨테이너 단추를 선택합니다.

  4. 새 컨테이너의 이름을 입력합니다. 컨테이너 이름은 소문자여야 하고, 문자 또는 숫자로 시작해야 하며, 문자, 숫자 및 대시(-) 문자만 포함할 수 있습니다.

  5. 컨테이너에 대한 공용 액세스 수준을 설정합니다. 기본 수준은 프라이빗(익명 액세스 없음) 입니다.

  6. 확인을 선택하여 컨테이너를 만듭니다.

스토리지 계정에 대한 액세스 권한 부여

Blob을 만들거나 읽거나 삭제하려면 먼저 스토리지 계정에 대한 액세스 권한을 웹앱에 부여해야 합니다. 이전 단계에서 관리 ID를 사용하여 App Service에서 실행되는 웹앱을 구성했습니다. Azure RBAC를 사용하면 보안 주체와 마찬가지로 관리 ID에 다른 리소스 액세스 권한을 제공할 수 있습니다. Storage Blob 데이터 기여자 역할은 Blob 컨테이너 및 데이터에 대한 읽기, 쓰기 및 삭제 권한을 웹앱(시스템이 할당한 관리 ID로 표시됨)에 제공합니다.

참고 항목

Blob 보기 또는 계정 간 Blob 복사와 같은 프라이빗 Blob 컨테이너의 일부 작업은 Azure RBAC에서 지원되지 않습니다. 프라이빗 액세스 수준이 있는 Blob 컨테이너에는 Azure RBAC에서 권한 부여되지 않은 모든 작업에 대해 SAS 토큰이 필요합니다. 자세한 내용은 공유 액세스 서명을 사용하는 경우를 참조하세요.

Azure Portal에서 스토리지 계정으로 이동하여 웹앱에 액세스 권한을 부여합니다. 왼쪽 창에서 액세스 제어(IAM)를 선택한 다음, 역할 할당을 선택합니다. 스토리지 계정에 액세스할 수 있는 사용자 목록이 표시됩니다. 이제 스토리지 계정에 액세스해야 하는 앱 서비스인 로봇에 역할 할당을 추가해야 합니다. 추가>역할 할당 추가를 선택하여 역할 할당 추가 페이지를 엽니다.

구독 범위에서 App ServiceStorage Blob 데이터 기여자 역할을 할당합니다. 세부 단계에 대해서는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

이제 웹앱이 스토리지 계정에 액세스할 수 있습니다.

Blob Storage에 액세스

DefaultAzureCredential 클래스는 Azure Storage에 대한 요청에 권한을 부여하기 위해 코드의 토큰 자격 증명을 가져오는 데 사용됩니다. 관리 ID를 사용하여 토큰을 가져오고 서비스 클라이언트에 연결하는 DefaultAzureCredential 클래스의 인스턴스를 만듭니다. 다음 코드 예제는 인증된 토큰 자격 증명을 가져와서 서비스 클라이언트 개체를 만드는 데 사용합니다. 이 개체는 새 BLOB을 업로드합니다.

이 코드를 샘플 애플리케이션의 일부로 보려면 GitHub의 샘플을 참조하세요.

클라이언트 라이브러리 패키지 설치

Blob Storage와 함께 작동하도록 Blob Storage NuGet 패키지를 설치하고, Microsoft Entra 자격 증명으로 인증하도록 .NET NuGet 패키지용 Azure ID 클라이언트 라이브러리를 설치합니다. .NET Core 명령줄 인터페이스 또는 Visual Studio의 패키지 관리자 콘솔을 사용하여 클라이언트 라이브러리를 설치합니다.

.NET Core 명령줄

  1. 명령줄을 열고 프로젝트 파일이 포함된 디렉터리로 전환합니다.

  2. 설치 명령을 실행합니다.

    dotnet add package Azure.Storage.Blobs
    
    dotnet add package Azure.Identity
    

패키지 관리자 콘솔

  1. Visual Studio에서 프로젝트 또는 솔루션을 열고 도구>NuGet 패키지 관리자>패키지 관리자 콘솔 명령을 사용하여 콘솔을 엽니다.

  2. 설치 명령을 실행합니다.

    Install-Package Azure.Storage.Blobs
    
    Install-Package Azure.Identity
    

.NET 예제

using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.IO;
using Azure.Identity;

// Some code omitted for brevity.

static public async Task UploadBlob(string accountName, string containerName, string blobName, string blobContents)
{
    // Construct the blob container endpoint from the arguments.
    string containerEndpoint = string.Format("https://{0}.blob.core.windows.net/{1}",
                                                accountName,
                                                containerName);

    // Get a credential and create a client object for the blob container.
    BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
                                                                    new DefaultAzureCredential());

    try
    {
        // Create the container if it does not exist.
        await containerClient.CreateIfNotExistsAsync();

        // Upload text to a new block blob.
        byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

        using (MemoryStream stream = new MemoryStream(byteArray))
        {
            await containerClient.UploadBlobAsync(blobName, stream);
        }
    }
    catch (Exception e)
    {
        throw e;
    }
}

리소스 정리

이 자습서를 완료하고 웹앱 또는 관련 리소스가 더 이상 필요하지 않으면 만든 리소스를 정리합니다.

리소스 그룹 삭제

Azure Portal의 포털 메뉴에서 리소스 그룹을 선택하고 앱 서비스 및 앱 서비스 계획이 포함된 리소스 그룹을 선택합니다.

리소스 그룹 삭제를 선택하여 리소스 그룹 및 모든 리소스를 삭제합니다.

Screenshot that shows deleting the resource group.

이 명령을 실행하는 데 몇 분 정도 걸릴 수 있습니다.

다음 단계

이 자습서에서는 다음 작업 방법을 알아보았습니다.

  • 시스템이 할당한 관리 ID를 만듭니다.
  • 스토리지 계정 및 Blob Storage 컨테이너를 만듭니다.
  • 관리 ID를 사용하여 웹앱에서 스토리지에 액세스합니다.