랩 07: 서비스 전반에서 리소스 비밀에 안전하게 액세스

Microsoft Azure 사용자 인터페이스

Microsoft 클라우드 도구의 동적 특성을 감안할 때, 이 학습 콘텐츠를 개발한 후 Azure UI가 변경될 수 있습니다. 따라서 랩 지침 및 랩 단계가 올바르게 정렬되지 않을 수 있습니다.

Microsoft는 커뮤니티에서 주목해야 할 변경 사항이 있을 때 이 학습 과정을 업데이트합니다. 그러나 클라우드 업데이트가 자주 이루어지기 때문에 이 학습 콘텐츠가 업데이트되기 전에 UI가 변경될 수 있습니다. 이 경우 변경 사항에 적응하고 필요에 따라 랩에서 작업합니다.

Instructions

시작하기 전에

랩 환경에 로그인

다음 자격 증명을 사용하여 Windows 11 VM(가상 머신)에 로그인합니다.

  • 사용자 이름: Admin
  • 암호: Pa55w.rd

참고: 강사가 가상 랩 환경 연결에 대한 지침을 제공합니다.

설치된 애플리케이션 검토

Windows 11 데스크톱에서 작업 표시줄을 찾습니다. 작업 표시줄에는 다음을 포함하여 이 랩에서 사용할 애플리케이션에 대한 아이콘이 포함되어 있습니다.

  • Microsoft Edge
  • 파일 탐색기
  • Terminal
  • Visual Studio Code

랩 시나리오

이 랩에서는 스토리지 계정에 액세스할 스토리지 계정 및 Azure Function 앱을 만듭니다. 연결 문자열 정보의 보안 스토리지를 보여 주려면 Key Vault 리소스를 프로비전하고 적절한 비밀을 관리하여 연결 문자열 정보를 저장합니다. 또한 서비스 ID를 관리하여 스토리지 계정에 대한 연결 문자열 정보에 대한 보안 액세스 권한을 얻습니다.

아키텍처 다이어그램

서비스에서 리소스 비밀에 보다 안전하게 액세스하는 사용자를 보여 주는 아키텍처 다이어그램.

연습 1: Azure 리소스 만들기

작업 1: Azure Portal 열기

  1. 작업 표시줄에서 Microsoft Edge 아이콘을 선택합니다.

  2. 열린 브라우저 창에서 Azure Portal(https://portal.azure.com)로 이동한 다음, 이 랩에 사용할 계정으로 로그인합니다.

    참고: Azure Portal에 처음 로그인하는 경우 포털 둘러보기가 제공됩니다. 둘러보기를 건너뛰고 포털 사용을 시작하려면 시작하기를 선택합니다.

작업 2: Storage 계정 만들기

  1. Azure Portal에서 리소스, 서비스 및 문서 검색 텍스트 상자를 사용하여 스토리지 계정을 검색한 다음, 결과 목록에서 스토리지 계정을 선택합니다.

  2.  스토리지 계정 블레이드에서 + 만들기를 선택합니다.

  3. 스토리지 계정 생성 블레이드의 기본 사항 탭에서 다음 작업을 수행하고 검토를 선택합니다.

    설정 작업
    구독 드롭다운 목록 기본값을 유지합니다.
    리소스 그룹 섹션 새로 만들기를 선택하고 ConfidentialStack을 입력한 다음 확인을 선택합니다.
    스토리지 계정 이름 텍스트 상자 securestor [사용자 이름] 을 입력합니다.
    지역 드롭다운 목록 (미국) 미국 동부를 선택합니다.
    성능 섹션 표준 옵션을 선택합니다.
    중복도 드롭다운 목록 LRS(로컬 중복 스토리지) 를 선택합니다.

    다음 스크린샷은 스토리지 계정 만들기 창에 구성된 설정을 보여 줍니다.

    스토리지 계정 만들기 창에 구성된 설정이 표시된 스크린샷

  4. 검토 탭에서 이전 단계 중 선택한 옵션을 검토합니다.

  5. 지정된 구성을 사용하여 스토리지 계정을 만들려면 만들기를 선택합니다.

    참고: 이 랩을 진행하기 전에 만들기 작업이 완료될 때까지 기다립니다.

  6. 배포 개요 창에서 리소스로 이동을 선택합니다.

  7.  스토리지 계정 블레이드의 보안 + 네트워킹 섹션에서 액세스 키 링크를 선택합니다.

  8.  액세스 키 섹션에서 키 표시를 선택합니다.

  9.  액세스 키 블레이드에서 연결 문자열 중 하나를 검토하고(표시 단추 사용) 메모장에 연결 문자열  상자의 값을 기록합니다. 는 플랫폼 관리 암호화 키이며 이 랩에서는 사용되지 않습니다.

    참고: 어떤 연결 문자열을 선택하든 상관없습니다. 서로 교환하여 사용할 수 있습니다.

작업 3: Azure Key Vault 만들기

  1. Azure Portal에서 리소스, 서비스 및 문서 검색 텍스트 상자를 사용하여 키 값을 검색한 다음, 결과 목록에서 키 값을 선택합니다.

  2. 키 자격 증명 모음 창에서 만들기를 선택합니다.

  3. 키 자격 증명 모음 만들기 블레이드의 기본 사항 탭에서 다음 작업을 수행한 후 다음을 선택하여 액세스 구성 탭으로 이동합니다.

    설정 작업
    구독 드롭다운 목록 기본값을 유지합니다.
    리소스 그룹 드롭다운 목록 목록에서 ConfidentialStack을 선택합니다.
    키 자격 증명 모음 이름 텍스트 상자 securevault [사용자 이름] 을 입력합니다.
    지역 드롭다운 목록 미국 동부를 선택합니다.
    가격 책정 계층 드롭다운 목록 표준 선택

    다음 스크린샷은 키 자격 증명 모음 만들기 창에 구성된 설정을 보여 줍니다.

    키 자격 증명 모음 만들기 창에 구성된 설정이 표시된 스크린샷

  4. 액세스 구성 탭에서 권한 모델을 Vault 액세스 정책으로 변경한 다음 검토 + 만들기를 선택합니다.

  5. 검토 + 만들기 탭에서 이전 단계에서 선택한 옵션을 검토합니다.

  6. 지정된 구성을 사용하여 키 자격 증명 모음을 만들려면 만들기를 선택합니다.

    참고: 이 랩을 진행하기 전에 만들기 작업이 완료될 때까지 기다립니다.

작업 4: 함수 앱 만들기

  1. Azure Portal에서 리소스, 서비스 및 문서 검색 텍스트 상자를 사용하여 함수 앱을 검색한 다음, 결과 목록에서 함수 앱을 선택합니다.

  2. 함수 앱 블레이드에서 만들기를 선택합니다.

  3. 함수 앱 만들기 창의 기본 사항 탭에서 다음 작업을 수행하고 다음: 스토리지를 선택합니다.

    설정 작업
    구독 드롭다운 목록 기본값을 유지합니다.
    리소스 그룹 드롭다운 목록 ConfidentialStack을 선택합니다.
    함수 앱 이름 텍스트 상자 securefunc [사용자 이름] 을 입력합니다.
    게시 섹션 코드 선택
    런타임 스택 드롭다운 목록 .NET을 선택합니다.
    버전 드롭다운 목록 8(LTS), 격리된 작업자 모델을 선택합니다.
    지역 드롭다운 목록 미국 동부 지역을 선택합니다.
    운영 체제 섹션 Linux를 선택합니다.
    호스팅 드롭다운 목록 사용량(서버리스) 을 선택합니다.

    다음 스크린샷은 함수 앱 만들기 창에 구성된 설정을 보여 줍니다.

    함수 앱 만들기 창에 구성된 설정이 표시된 스크린샷

  4. 스토리지 탭에서 다음 작업을 수행하고 검토 + 만들기를 선택합니다.

    설정 작업
    스토리지 계정 드롭다운 목록 securestor [사용자 이름] 스토리지 계정을 선택합니다.
  5. 검토 + 만들기 탭에서 이전 단계에서 선택한 옵션을 검토합니다.

  6. 지정된 구성을 사용하여 함수 앱을 만들려면 만들기를 선택합니다.

    참고: 이 랩을 진행하기 전에 만들기 작업이 완료될 때까지 기다립니다.

검토

이 연습에서는 이 랩에서 사용할 모든 리소스를 만들었습니다.

연습 2: 비밀 및 ID 구성

작업 1: 시스템 할당된 관리 서비스 ID 구성

  1. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  2. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  3. ConfidentialStack 창에서 securefunc [사용자 이름] 함수 앱을 선택합니다.

    참고: 리소스에는 함수 앱과 Application Insights 리소스 2개가 있으며 이름은 동일합니다. 함수 앱 리소스를 선택했는지 확인합니다.

  4. 함수 앱 블레이드의 설정 섹션에서 ID 옵션을 선택합니다.

  5. ID 창의 시스템 할당 탭에서 상태켜기로 설정한 다음 저장을 선택합니다.

  6. 를 선택하여 설정을 확인합니다.

    참고: 이 랩을 진행하기 전에 할당된 시스템에서 관리 ID가 만들어질 때까지 기다립니다.

작업 2: Key Vault 비밀 만들기

  1. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  2. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  3. ConfidentialStack 창에서 securevault [사용자 이름] 키 자격 증명 모음을 선택합니다.

  4. 키 자격 증명 모음 창에서 개체 섹션에 있는 비밀 링크를 선택합니다.

  5. 비밀 창에서 + 생성/가져오기를 클릭합니다.

  6. 비밀 만들기 창에서 다음 작업을 수행한 후, 만들기를 선택합니다.

    설정 작업
    업로드 옵션 드롭다운 목록 수동 선택
    이름 텍스트 상자 storagecredentials를 입력합니다.
    비밀 값 텍스트 상자 이 랩에서 이전에 기록한 스토리지 계정 연결 문자열을 입력합니다.
    콘텐츠 형식 텍스트 상자 비워 둠
    활성화 날짜 설정 확인란 선택되지 않음
    만료 날짜 설정 확인란 선택되지 않음
    사용 옵션 를 선택합니다.

    다음 스크린샷은 비밀 만들기 창에 구성된 설정을 보여 줍니다.

    비밀 만들기 창에서 구성된 설정을 표시하는 스크린샷

    참고: 이 랩을 진행하기 전에 비밀이 만들어질 때까지 기다립니다.

  7. 비밀 창으로 돌아가서 목록의 storagecredentials 항목을 선택합니다.

  8. 버전 창에서 storagecredentials 비밀의 최신 버전을 선택합니다.

  9. 비밀 버전 창에서 다음 작업을 수행합니다.

    1. 비밀 값을 보려면 비밀 값 표시를 선택합니다.

    2. 나중에 랩에서 이 값을 사용하기 때문에 비밀 식별자 텍스트 상자의 값을 기록합니다.

    참고: 비밀 값 텍스트 상자가 아닌 비밀 식별자 텍스트 상자의 값을 기록하고 있습니다.

작업 3: Key Vault 액세스 정책 구성

  1. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  2. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  3. ConfidentialStack 창에서 securevault[사용자 이름] 키 자격 증명 모음을 선택합니다.

  4. 키 자격 증명 모음 창의 개요 섹션에 있는 액세스 정책 링크를 선택합니다.

  5. 액세스 정책 창에서 + 만들기를 선택합니다.

  6. 액세스 정책 만들기 블레이드의 권한 섹션에서 다음을 선택합니다.

    설정 작업
    템플릿에서 구성 드롭다운 목록 비워 둠
    키 권한 확인란 0개 선택됨
    비밀 권한 확인란 GET 권한을 선택합니다.
    인증서 권한 확인란 0개 선택됨
  7. 보안 주체 섹션을 선택하고 다음을 선택합니다.

    설정 작업
    보안 주체 선택 링크 securefunc [사용자 이름] 이라는 서비스 주체를 찾아서 선택합니다. 이 랩의 앞에서 만든 시스템 할당 관리 ID는 Azure Function 리소스와 이름이 동일합니다.
  8. 검토 + 만들기, 만들기를 차례로 선택합니다.

    참고: 이 랩을 계속하기 전에 액세스 정책에 대한 변경 내용이 저장될 때까지 기다립니다.

작업 4: Key Vault 파생 애플리케이션 설정 만들기

  1. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  2. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  3. ConfidentialStack 창에서 securefunc[사용자 이름] 함수 앱을 선택합니다.

  4. 함수 앱 블레이드의 설정 섹션에서 환경 변수 링크를 선택합니다.

  5. 앱 설정 탭에서 + 추가를 선택합니다. 애플리케이션 설정 추가/편집 팝업 대화 상자에 다음 정보를 입력합니다.

    설정 작업
    이름 텍스트 상자 StorageConnectionString 입력
    텍스트 상자 @Microsoft.KeyVault(SecretUri=<Secret Identifier>) 구문을 사용하여 값을 생성합니다. 여기서 <Secret Identifier> 자리 표시자는 이 연습의 앞부분에서 기록한 비밀 식별자를 나타냅니다.
    배포 슬롯 설정 확인란 기본값을 유지합니다.

    참고: 예를 들어, 비밀 식별자가 https://securevaultstudent.vault.azure.net/secrets/storagecredentials/17b41386df3e4191b92f089f5efb4cbf인 경우 결과 값은 @Microsoft.KeyVault(SecretUri=https://securevaultstudent.vault.azure.net/secrets/storagecredentials/17b41386df3e4191b92f089f5efb4cbf)가 됩니다.

  6. 적용을 선택하여 팝업 대화 상자를 닫고 앱 설정 섹션으로 돌아갑니다.

  7. 앱 설정 섹션 하단에서 적용을 선택합니다.

    참고: 앱 설정을 업데이트할 때 앱이 다시 시작될 수 있다는 경고가 표시될 수 있습니다. 확인을 선택합니다. 랩을 계속하기 전에 애플리케이션 설정이 저장되기를 기다립니다.

검토

이 연습에서는 함수 앱에 대한 시스템 할당 관리 서비스 ID를 만든 다음 해당 ID에 키 자격 증명 모음에서 비밀 값을 얻을 수 있는 적절한 권한을 부여했습니다. 마지막으로 비밀을 만들어 함수 앱 구성 설정 내에서 참조했습니다.

연습 3: Azure Functions 앱 빌드

작업 1: 함수 프로젝트 초기화

  1. 작업 표시줄에서 터미널 아이콘을 선택합니다.

  2. 다음 명령을 실행하여 현재 디렉터리를 Allfiles (F):\Allfiles\Labs\07\Starter\func 빈 디렉터리로 변경합니다.

    cd F:\Allfiles\Labs\07\Starter\func
    

    참고: Windows 탐색기에서 F:\Allfiles\Labs\07\Starter\func.gitignore 파일에서 읽기 전용 특성을 제거합니다.

  3. 다음 명령을 실행하여 Azure Functions Core Tools를 사용하여 dotnet 런타임을 통해 현재 디렉터리에 새 로컬 Functions 프로젝트를 만듭니다.

    func init --worker-runtime dotnet-isolated --target-framework net8.0 --force
    

    참고: 설명서의 내용을 검토하여 Azure Functions Core Tools를 사용한 [새 프로젝트 만들기][azure-functions-core-tools-new-project] 방법을 파악할 수 있습니다.

  4. 다음 명령을 실행하여 .NET 8 프로젝트를 빌드합니다.

    dotnet build
    

작업 2: HTTP 트리거 함수 만들기

  1. 다음 명령을 실행하여 Azure Functions Core Tools를 사용하여 HTTP 트리거 템플릿으로 FileParser라는 새 함수를 만듭니다.

    func new --template "HTTP trigger" --name "FileParser"
    

    참고: 설명서의 내용을 검토하여 Azure Functions Core Tools를 사용한 [새 함수 만들기][azure-functions-core-tools-new-function] 방법을 파악할 수 있습니다.

  2. 현재 실행 중인 터미널 애플리케이션을 닫습니다.

작업 3: 애플리케이션 설정 구성 및 읽기

  1. 시작 화면에서 Visual Studio Code 타일을 선택합니다.

  2. 파일 메뉴에서 폴더 열기를 선택합니다.

  3. 열리는 파일 탐색기 창에서 Allfiles (F):\Allfiles\Labs\07\Starter\func을 찾아본 후, 폴더 선택을 선택합니다.

  4. Visual Studio Code 창의 탐색기 창에서 local.settings.json 파일을 엽니다.

  5. Values 개체의 현재 값을 기록해 둡니다.

    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
    
  6. StorageConnectionString이라는 새 설정을 추가한 다음 여기에 [TEST VALUE] 의 문자열 값을 할당하여 Values 개체의 값을 업데이트합니다.

    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "StorageConnectionString": "[TEST VALUE]"
    }
    
  7. 이제 local.settings.json 파일에 다음 코드가 포함되어 있어야 합니다.

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "StorageConnectionString": "[TEST VALUE]"
      }
    }
    
  8. 저장을 선택하여 변경 내용을 local.settings.json 파일에 저장합니다.

  9. Visual Studio Code 창의 탐색기 창에서 FileParser.cs 파일을 엽니다.

  10. 코드 편집기에서 18행으로 시작하는 FileParser 함수의 자동 생성 코드 콘텐츠를 다음 코드로 바꿉니다.

            [Function("FileParser")]
             public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
             {
                 _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                 var response = req.CreateResponse(HttpStatusCode.OK);
                 response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    
                 string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
                 response.WriteString(connectionString);
    
                 return response;
             }
    
  11. Null 값에 관한 경고를 무시합니다.

  12. 다음 콘텐츠로 구성되어야 하는 결과 코드를 검토합니다. 이 코드는 StorageConnectionString 환경 변수의 값을 반환합니다.

    using System.Net;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Http;
    using Microsoft.Extensions.Logging;
    
    namespace func
    {
        public class FileParser
        {
            private readonly ILogger _logger;
    
            public FileParser(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger<FileParser>();
            }
    
            [Function("FileParser")]
            public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
            {
                _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                var response = req.CreateResponse(HttpStatusCode.OK);
                response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    
                string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
                response.WriteString(connectionString);
    
                return response;
            }
        }
    }
    
  13. 저장을 선택하여 FileParser.cs 파일의 변경 내용을 저장합니다.

작업 4: 로컬 함수 유효성 검사

  1. 작업 표시줄에서 터미널 아이콘을 선택합니다.

  2. 다음 명령을 실행하여 현재 디렉터리를 Allfiles (F):\Allfiles\Labs\07\Starter\func 빈 디렉터리로 변경합니다.

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 다음 명령을 실행하여 함수 앱 프로젝트를 실행합니다.

    func start --build
    

    참고: 설명서의 내용을 검토하여 Azure Functions Core Tools를 사용한 [로컬에서 함수 앱 프로젝트 시작][azure-functions-core-tools-start-function] 방법을 파악할 수 있습니다.

  4. 랩 컴퓨터에서 명령 프롬프트를 시작합니다.

  5. 다음 명령을 실행하여 http://localhost:7071/api/FileParser에 대한 GET REST API 호출 테스트를 실행합니다.

    curl -X GET -i http://localhost:7071/api/FileParser
    
  6. HTTP 요청 결과로 반환되는 StorageConnectionString[TEST VALUE] 값을 살펴봅니다.

    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Date: Tue, 01 Sep 2020 23:35:39 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [TEST VALUE]
    
  7. 현재 실행 중인 터미널 애플리케이션과 명령 프롬프트 애플리케이션의 모든 인스턴스를 닫습니다.

작업 5: Azure Functions Core Tools를 사용하여 함수 배포

  1. 작업 표시줄에서 터미널 아이콘을 선택합니다.

  2. 다음 명령을 실행하여 현재 디렉터리를 Allfiles (F):\Allfiles\Labs\07\Starter\func 빈 디렉터리로 변경합니다.

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 다음 명령을 실행하여 Azure CLI(Command-Line Interface)에 로그인합니다.

    az login
    
  4. Microsoft Edge 브라우저 창에서 Azure 구독에 액세스하는 데 사용하는 계정의 자격 증명을 입력한 다음 로그인을 선택합니다.

  5. 현재 열려 있는 터미널 창으로 돌아갑니다. 로그인 프로세스가 완료될 때까지 기다립니다.

  6. 다음 명령을 실행하여 함수 앱 프로젝트를 게시합니다(<function-app-name> 자리 표시자를 이 랩의 앞부분에서 만든 함수 앱의 이름으로 바꿈).

    func azure functionapp publish <function-app-name> --dotnet-version 8.0
    

    참고: 예를 들어, 함수 앱 이름securefuncstudent이면 명령은 func azure functionapp publish securefuncstudent --force가 됩니다. 설명서의 내용을 검토하여 Azure Functions Core Tools를 사용한 [로컬 함수 앱 프로젝트 게시][azure-functions-core-tools-publish-azure] 방법을 파악할 수 있습니다.

  7. 랩을 진행하기 전에 배포가 마무리될 때까지 기다립니다.

  8. 현재 실행 중인 터미널 애플리케이션을 닫습니다.

작업 6: 키 자격 증명 모음 파생 애플리케이션 설정 테스트

  1. 작업 표시줄에서 Microsoft Edge 아이콘을 선택한 다음, Azure Portal이 포함된 탭을 선택합니다.

  2. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  3. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  4. ConfidentialStack 창에서 securefunc[사용자 이름] 함수 앱을 선택합니다.

  5. 함수 앱 블레이드에서 개요 옵션을 선택합니다.

  6. 개요 페이지 하단의 Functions 탭에서 기존 FileParser 함수를 선택합니다.

  7. 함수 창의 개발자 섹션에서 코드 + 테스트 옵션을 선택합니다.

  8. 함수 편집기에서 테스트/실행을 선택합니다.

  9. 자동으로 표시되는 창의 HTTP 메서드 목록에서 GET을 선택합니다.

  10. 실행을 선택하여 함수를 테스트합니다.

  11. 테스트 실행 결과를 검토합니다. Azure Storage 연결 문자열이 결과에 포함되어 있어야 합니다.

검토

이 연습에서는 서비스 ID를 사용하여 Key Vault에 저장된 비밀의 값을 읽고 함수 앱의 결과로 해당 값을 반환했습니다.

연습 4: Azure Blob Storage 데이터 액세스

작업 1: 샘플 Storage Blob 업로드

  1. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  2. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  3. ConfidentialStack 창에서 securestor [사용자 이름] 스토리지 계정을 선택합니다.

  4. 스토리지 계정 블레이드에서 데이터 스토리지 섹션에 있는 컨테이너 링크를 선택합니다.

  5. 컨테이너 섹션에서 + 컨테이너를 선택합니다.

  6. 새 컨테이너 팝업 창에서 다음 작업을 수행하고 만들기를 선택합니다.

    설정 작업
    이름 텍스트 상자 드롭을 입력합니다.
  7. 컨테이너 섹션으로 돌아가서 새로 만든 drop 컨테이너로 이동합니다.

  8. 컨테이너 블레이드에서 업로드를 선택합니다.

  9. Blob 업로드 창에서 다음 작업을 수행한 다음, 업로드를 선택합니다.

    설정 작업
    파일 섹션 파일 찾아보기를 선택하거나 끌어서 놓기 기능을 사용합니다.
    파일 탐색기 Allfiles (F):\Allfiles\Labs\07\Starter로 이동하여, records.json 파일을 선택한 다음 열기를 선택합니다.
    파일이 이미 있는 경우 덮어쓰기 확인란 이 확인란이 선택되어 있는지 확인합니다.

    참고: 이 랩을 계속하기 전에 Blob이 업로드될 때까지 기다립니다.

  10. 컨테이너 블레이드로 돌아가서 Blob 목록에서 records.json Blob을 선택합니다.

  11. Blob 창에서 Blob 메타데이터를 찾은 다음 Blob의 URL을 복사합니다.

  12. 작업 표시줄에서 Microsoft Edge 아이콘의 바로 가기 메뉴를 활성화한 다음, 새 창을 선택합니다.

  13. 새 브라우저 창에서 Blob에 대해 복사한 URL을 참조합니다.

  14. 이제 리소스를 찾을 수 없다는 오류 메시지가 표시됩니다.

    참고: 이는 Blob에 대한 익명 액세스가 사용하도록 설정되지 않았기 때문에 예상됩니다.

작업 2: .NET용 Azure SDK 끌어오기 및 구성

  1. 작업 표시줄에서 터미널 아이콘을 선택합니다.

  2. 다음 명령을 실행하여 현재 디렉터리를 Allfiles (F):\Allfiles\Labs\07\Starter\func 빈 디렉터리로 변경합니다.

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 다음 명령을 실행하여 NuGet에서 Azure.Storage.Blobs 패키지의 12.18.0 버전을 추가합니다.

    dotnet add package Azure.Storage.Blobs --version 12.18.0
    

    참고: Azure.Storage.Blobs NuGet 패키지는 Azure Blob Storage용 코드를 작성하는 데 필요한 .NET용 Azure SDK의 하위 집합을 참조합니다.

  4. 현재 실행 중인 터미널 애플리케이션을 닫습니다.

  5. 시작 화면에서 Visual Studio Code 타일을 선택합니다.

  6. 파일 메뉴에서 폴더 열기를 선택합니다.

  7. 열리는 파일 탐색기 창에서 Allfiles (F):\Allfiles\Labs\07\Starter\func을 찾아본 후, 폴더 선택을 선택합니다.

  8. Visual Studio Code 창의 탐색기 창에서 FileParser.cs 파일을 엽니다.

  9. Azure.Storage.BlobsAzure.Storage.Blobs.Models 네임스페이스에 대한 using 지시문을 추가합니다.

    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    
  10. 줄 19로 시작하는 현재 FileParser 메서드의 콘텐츠를 다음 코드로 바꿉니다.

             [Function("FileParser")]
             public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
             {
                 _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                 var response = req.CreateResponse(HttpStatusCode.OK);
    
                 string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
    
                 /* Create a new instance of the BlobClient class by passing in your
                    connectionString variable, a  "drop" string value, and a
                    "records.json" string value to the constructor */
                 BlobClient blob = new BlobClient(connectionString, "drop", "records.json");
    
                 // Download the content of the referenced blob 
                 BlobDownloadResult downloadResult = blob.DownloadContent();
    
                  // Retrieve the value of the downloaded blob and convert it to string
                 response.WriteString(downloadResult.Content.ToString());
                
                 //return the response
                 return response;
             }
    
  11. Null 값에 관한 경고를 무시합니다.

  12. 다음 콘텐츠로 구성되어야 하는 결과 코드를 검토합니다. 이 코드는 StorageConnectionString 환경 변수로 지정된 스토리지 계정에서 다운로드한 Blob의 콘텐츠를 반환합니다.

    namespace func
    {
        public class FileParser
        {
            private readonly ILogger _logger;
    
            public FileParser(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger<FileParser>();
            }
    
            [Function("FileParser")]
            public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
            {
                _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                var response = req.CreateResponse(HttpStatusCode.OK);
    
                string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
    
                /* Create a new instance of the BlobClient class by passing in your
                   connectionString variable, a  "drop" string value, and a
                   "records.json" string value to the constructor */
                BlobClient blob = new BlobClient(connectionString, "drop", "records.json");
    
                // Download the content of the referenced blob 
                BlobDownloadResult downloadResult = blob.DownloadContent();
    
                 // Retrieve the value of the downloaded blob and convert it to string
                response.WriteString(downloadResult.Content.ToString());
                
                //return the response
                return response;
            }
        }
    }
    
  13. 저장을 선택하여 FileParser.cs 파일의 변경 내용을 저장합니다.

작업 3: Azure Functions 앱 배포 및 유효성 검사

  1. 작업 표시줄에서 터미널 아이콘을 선택합니다.

  2. 다음 명령을 실행하여 현재 디렉터리를 Allfiles (F):\Allfiles\Labs\07\Starter\func 빈 디렉터리로 변경합니다.

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 다음 명령을 실행하여 Azure CLI에 로그인합니다.

    az login
    
  4. Microsoft Edge 브라우저 창에서 Microsoft 계정의 메일 주소 및 암호를 입력한 후, 로그인을 선택합니다.

  5. 현재 열려 있는 터미널 창으로 돌아갑니다. 로그인 프로세스가 완료될 때까지 기다립니다.

  6. 다음 명령을 실행하여 함수 앱 프로젝트를 다시 게시합니다(<function-app-name> 자리 표시자를 이 랩의 앞부분에서 사용한 함수 앱의 이름으로 바꿈).

    func azure functionapp publish <function-app-name> --dotnet-version 8.0
    

    참고: 예를 들어, 함수 앱 이름securefuncstudent이면 명령은 func azure functionapp publish securefuncstudent가 됩니다. 설명서의 내용을 검토하여 Azure Functions Core Tools를 사용한 [로컬 함수 앱 프로젝트 게시][azure-functions-core-tools-publish-azure] 방법을 파악할 수 있습니다.

  7. 랩을 진행하기 전에 배포가 마무리될 때까지 기다립니다.

  8. 현재 실행 중인 터미널 애플리케이션을 닫습니다.

  9. 작업 표시줄에서 Microsoft Edge 아이콘을 선택한 다음, Azure Portal을 참조합니다.

  10. Azure Portal의 탐색 창에서 리소스 그룹 링크를 선택합니다.

  11. 리소스 그룹 블레이드에서 ConfidentialStack 리소스 그룹을 선택합니다.

  12. ConfidentialStack 창에서 securefunc[사용자 이름] 함수 앱을 선택합니다.

  13. 함수 앱 블레이드에서 개요 옵션을 선택합니다.

  14. 개요 페이지의 Functions 탭에서 기존 FileParser 함수를 선택합니다.

  15. 함수 창의 개발자 섹션에서 코드 + 테스트 옵션을 선택합니다.

  16. 함수 편집기에서 테스트/실행을 선택합니다.

  17. 자동으로 표시되는 창의 HTTP 메서드 목록에서 GET을 선택합니다.

  18. 실행을 선택하여 함수를 테스트합니다.

  19. 테스트 실행 결과를 검토합니다. 출력에는 스토리지 계정에 저장된 $/drop/records.json Blob의 내용이 포함됩니다.

검토

이 연습에서는 C# 코드를 사용하여 스토리지 계정에 액세스한 다음 Blob의 내용을 다운로드했습니다.