랩: Azure에 배포된 서비스 모니터링

학생 랩 매뉴얼

랩 시나리오

당신은 신속하게 시장에 도착해야하는 다음 큰 신생 벤처를 위한 API 를 만들었습니다. 빨리 시장에 진출하고 싶지만 성장을 계획하지 않고 자원이 너무 적거나 사용자가 너무 많을 때 다른 벤처 기업이 실패하는 것을 목격했습니다. 이를 계획하려면 Microsoft Azure 앱 서비스의 확장 기능, 응용 프로그램 인사이트 원격 분석 기능 및 Azure DevOps 의 성능 테스트 기능을 활용하기로 결정했습니다. 이 프로젝트에서는 API 어플을 사용하여 API 를 앱 서비스에 배치하고, Application Insights 를 사용하여 원격 분석 및 메트릭을 캡처하고, 네트워크 문제 또는 기타 일시적인 오류를 처리할 수 있는 스마트 클라이언트를 구현합니다. 그런 다음 Azure DevOps 를 사용하여 API 를 로드합니다.

목표

이 랩을 완료하면 다음을 수행할 수 있습니다.

  • Application Insights 리소스를 만듭니다.

  • Application Insights 원격 분석 추적을 ASP.NET Core 웹 애플리케이션 및 Azure 웹앱 리소스에 통합합니다.

  • .NET Foundation 라이브러리를 사용하여 일시적인 오류가 발생할 수 있는 서비스에 대해 재시도 정책을 구현합니다.

  • Azure DevOps를 사용하여 웹앱을 성능 테스트합니다.

랩 설정

  • 예상 시간: 75 분

지침

시작하기 전에

랩 가상 머신에 로그인

다음 자격 증명을 사용하여 Windows 10 가상 머신에 로그인해야 합니다.

  • 사용자 이름: Admin

  • 암호: Pa55w.rd

설치된 응용 프로그램 검토

Windows 10 바탕 화면 하단에 있는 작업 표시줄을 살펴봅니다. 작업 표시줄에는 이 랩에서 사용할 응용 프로그램에 대한 아이콘이 포함되어 있습니다.

  • Microsoft Edge

  • 파일 탐색기

  • Visual Studio Code

  • Windows PowerShell

랩 파일 다운로드

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

  2. PowerShell 명령 프롬프트에서 현재 작업 디렉터리를 Allfiles(F):\ 경로로 변경합니다.

    cd F:
  1. 명령 프롬프트 내에서 다음 명령을 입력하고 Enter 키를 눌러 GitHub에서 호스트되는 microsoftlearning/AZ-203-DevelopingSolutionsforMicrosoftAzure 프로젝트를 Allfiles (F):\ 드라이브로 복제합니다.
    git clone --depth 1 --no-checkout https://github.com/microsoftlearning/AZ-203-DevelopingSolutionsForMicrosoftAzure.
  1. 명령 프롬프트 내에서 다음 명령을 입력하고 Enter 키를 눌러 AZ-203T05 랩을 완료하는 데 필요한 랩 파일을 체크 아웃합니다.
    git checkout master -- Allfiles/*
  1. 현재 실행 중인 Windows PowerShell 명령 프롬프트 응용 프로그램을 닫습니다.

연습 1: Azure 리소스 만들기 및 구성

작업 1: Azure Portal 열기

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

  2. 열린 브라우저 창에서 Azure Portal(portal.azure.com)로 이동합니다.

  3. 로그인 페이지에서 Microsoft 계정의 전자 메일 주소를 입력합니다.

  4. 다음을 선택합니다.

  5. Microsoft 계정의 비밀번호를 입력합니다.

  6. 로그인을 선택합니다.

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

작업 2: Application Insights 리소스 만들기

  1. 다음과 같은 세부 정보를 사용하여 새 Application Insights 계정을 만듭니다.

    • 새 리소스 그룹: MonitoredAssets

    • 이름: instrm[소문자로 된 사용자 이름]

    • 위치: (미국) 미국 동부

    참고: 랩을 진행하기 전에 Azure 에서 저장소 계정 만들기가 완료될 때까지 기다립니다. 계정이 생성되면 알림을 받게 됩니다.

  2. 응용 프로그램 인사이트 블레이드의 속성 섹션에 액세스합니다.

  3. 계측 키 필드의 값을 관찰합니다. 이 키는 클라이언트 응용 프로그램에서 응용 프로그램 인사이트에 연결로 사용합니다.

작업 3: 웹앱 리소스 만들기

  1. 다음 세부 정보를 사용하여 새 웹앱을 만듭니다.

    • 기존 리소스 그룹: MonitoredAssets

    • 웹앱 이름: smpapi[소문자로 된 사용자 이름]

    • 게시: 코드

    • 런타임 스택: .NET Core 3.0

    • 운영 체제: Windows

    • 지역: 미국 동부

    • 새 App Service 계획: MonitoredPlan

    • SKU 및 크기: 표준(S1)

    • Application Insights: 사용

    • 기존 Application Insights 리소스: instrm[소문자로 된 사용자 이름]

    참고: 랩을 진행하기 전에 Azure 에서 웹앱 만들기가 완료될 때까지 기다립니다. 앱을 만들 때 알림을 받게 됩니다.

  2. 이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.

  3. 블레이드 왼쪽의 설정 섹션에서 구성 섹션으로 이동합니다.

  4. 구성 설정 내의 애플리케이션 설정 탭을 찾아 액세스합니다.

  5. APPINSIGHTS_INSTRUMENTATIONKEY 애플리케이션 설정 키에 해당하는 값을 확인합니다. 이 값은 웹앱 리소스를 빌드할 때 자동으로 설정되었습니다.

  6. App Service 블레이드의 속성 섹션에 액세스합니다.

  7. URL 필드의 값을 기록합니다. 이 값을 나중에 랩에서 사용하여 API 에 대한 요청을 합니다.

작업 4: 웹앱 자동 크기 조정 옵션 구성

  1. App Services 블레이드의 규모 확장 섹션으로 이동합니다.

  2. 스케일 아웃 섹션에서 다음 세부 정보를 사용하여 사용자 지정 자동 크기 조정을 사용하도록 설정합니다.

    1. 이름: 컴퓨트 스케일러

    2. 스케일 모드 섹션에 메트릭에 따라 스케일을 선택합니다.

    3. 최소 인스턴스 수: 2

    4. 최대 인스턴스 수: 8

    5. 기본 인스턴스 수: 3

    6. 스케일 규칙: 기본 값이 있는 싱글 스케일 조정 규칙

  3. 변경 내용을 자동 사이즈 조정 구성에 저장합니다.

검토

이 연습에서는 랩의 나머지 부분에 사용할 리소스를 만들었습니다.

연습 2: .NET Core 웹 API 애플리케이션 빌드 및 배포

작업 1: .NET 코어 웹 API 프로젝트 빌드

  1. Visual Studio Code를 엽니다.

  2. Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Api 폴더를 엽니다.

  3. 탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.

  4. 명령 프롬프트에서 현재 디렉터리에서 SimpleApi라는 새 .NET Core 웹 API 응용 프로그램을 만듭니다.

    dotnet new webapi --output . --name SimpleApi
  1. NuGet에서 Microsoft.ApplicationInsights.AspNetCore 패키지의 2.7.1 버전을 현재 프로젝트에 추가합니다.
    dotnet add package Microsoft.ApplicationInsights.AspNetCore --version 2.7.1
  1. .NET Core 웹 애플리케이션 빌드:
    dotnet build

작업 2: HTTPS 를 사용하지 않도록 설정하고 응용 프로그램 인사이트를 사용하도록 응용 프로그램 코드를 업데이트합니다.

  1. Visual Studio Code탐색기를 사용하여 편집기에서 Startup.cs 파일을 엽니다.

  2. 43줄에서 다음 코드 줄을 찾아 삭제합니다:

    app.UseHttpsRedirection();
> **참고**: 이 코드 줄은 웹앱이 HTTPS를 사용하도록 강제합니다. 이 랩에서는 이 작업을 사용할 필요가 없습니다.
  1. Startup 클래스 내에서, 이 랩의 앞에서 만든 Application Insights 리소스에서 복사한 계측 키로 값이 설정된 INSTRUMENTATION_KEY라는 새 정적 문자열 상수를 추가합니다.
    private static string INSTRUMENTATION_KEY = "{your_instrumentation_key}";
> **참고**: 예를 들어 **계측 키**가 ``d2bb0eed-1342-4394-9b0c-8a56d21aaa43``이면 코드 줄은 ``private static string INSTRUMENTATION_KEY = "d2bb0eed-1342-4394-9b0c-8a56d21aaa43";``이 됩니다.
  1. ConfigureServices 메서드 내에 새 코드 줄을 추가함으로써 제공된 계측 키를 사용하여 Application Insights를 구성합니다.
    services.AddApplicationInsightsTelemetry(INSTRUMENTATION_KEY);
  1. Startup.cs 파일을 저장합니다.

  2. 탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉터리로 설정되어 있습니다.

  3. .NET 코어 웹 응용 프로그램 빌드:

    dotnet build

작업 3: API 응용 프로그램을 로컬로 테스트

  1. 탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉토리로 설정되어 있습니다.

  2. .NET 코어 웹 응용 프로그램을 실행합니다.

    dotnet run
  1. Microsoft Edge 브라우저를 엽니다.

  2. 열린 브라우저 창에서 port 5000localhost에서 호스팅되는 테스트 응용 프로그램의 /api/value 상대 경로로 이동합니다.

    참고: 전체 URL 은http://localhost:5000/api/values.

  3. 동일한 브라우저 창에서 포트 5000localhost에서 호스팅되는 테스트 응용 프로그램 /api/values/7 상대 경로로 이동합니다.

    참고: 전체 URL 은http://localhost:5000/api/values/7

  4. 최근에 열었던 브라우저 창을 닫습니다.

  5. 현재 실행 중인 Visual Studio Code 응용 프로그램을 닫습니다.

작업 4: 응용 프로그램 인사이트 메트릭 보기

  1. Azure 포털을 표시하는 현재 열려있는 브라우저 창으로 돌아갑니다.

  2. 이전에 랩에서 만든 instrm* 응용 프로그램 인사이트 계정에 액세스합니다.

  3. 응용프로그램 인사이트 블레이드에서 블레이드 중앙에 있는 타일에 표시되는 메트릭을 관찰합니다. 특히 발생한 서버 요청 수 및 평균 서버 응답 시간을 확인합니다.

    참고: Application Insights 메트릭 차트에 요청이 표시되는 데 최대 5분이 걸릴 수 있습니다.

작업 5: 웹앱에 애플리케이션 배포

  1. Visual Studio Code를 엽니다.

  2. Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Api 폴더를 엽니다.

  3. 탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.

  4. Microsoft Azure 자격 증명을 사용하여 Azure CLI 에 로그인합니다.

    az login
  1. MonitoredAssets 리소스 그룹에 있는 모든 을 나열합니다.
    az webapp list --resource-group MonitoredAssets
  1. 접두사 smpapi*가 있는 을 찾습니다.
    az webapp list --resource-group MonitoredAssets --query "[?starts_with(name, 'smpapi')]"
  1. 접두사 smpapi*가 있는 단일 앱의 이름만 출력합니다.
    az webapp list --resource-group MonitoredAssets --query "[?starts_with(name, 'smpapi')].{Name:name}" --output tsv
  1. 랩 파일이 포함된 Allfiles (F):\Allfiles\Labs\05\Starter 디렉터리로 현재 디렉터리를 변경합니다.
    cd F:\Labfiles\05\Starter\
  1. 이 랩의 앞에서 만든 웹앱api.zip 파일을 배포합니다.
    az webapp deployment source config-zip --resource-group MonitoredAssets --src api.zip --name <name-of-your-api-app>
> **참고**: **\<name-of-your-api-app\>** 자리 표시자를 이 랩의 앞에서 만든 웹앱의 이름으로 바꿉니다. 최근에 이전 단계에서 이 앱의 이름을 쿼리했습니다.
  1. 이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.

  2. 브라우저에서 smpapi* 웹앱을 엽니다.

  3. 웹 사이트의 /api/values/ 상대 경로에 대한 GET 요청을 수행하고 API 사용의 결과로 반환된 JSON 배열을 확인합니다.

    참고: 예를 들어 URL 이 https://smpapistudent.azurewebsites.net 경우 새 URL 이 https://smpapistudent.azurewebsites.net/api/values.

검토

이 연습에서는 ASP.NET Core를 사용하여 API를 만들고 애플리케이션 메트릭을 Application Insights로 스트리밍하도록 구성했습니다. 다음 응용 프로그램 인사이트 대시보드를 사용하여 API 에 대한 성능 세부 정보를 볼 수 있습니다.

연습 3: .NET 코어를 사용하여 클라이언트 응용 프로그램 빌드

작업 1: .NET 코어 콘솔 프로젝트 빌드

  1. Visual Studio Code를 엽니다.

  2. Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Console 폴더를 엽니다.

  3. 탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.

  4. 명령 프롬프트에서 현재 디렉터리에서 SimpleConsole이라는 새 .NET Core 콘솔 애플리케이션을 만듭니다.

    dotnet new console --output . --name SimpleConsole
  1. NuGet에서 Polly 패키지의 7.1.0 버전을 현재 프로젝트에 추가합니다.
    dotnet add package Polly --version 7.1.0
  1. .NET Core 웹 애플리케이션 빌드:
    dotnet build

작업 2: HTTP 클라이언트 코드 추가

  1. Visual Studio Code탐색기를 사용하여 편집기에서 Program.cs 파일을 엽니다.

  2. 다음 네임스페이스에 대해 파일 상단에 using 지시문을 추가합니다.

    • System.Net.Http

    • System.Threading.Tasks

    using System.Net.Http;
    using System.Threading.Tasks;
  1. 7줄에서 Program 클래스를 찾습니다.
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
  1. Program 클래스의 코드를 다음 코드로 바꿉니다.
    class Program
    {
        private const string _api = "";
        private static HttpClient _client = new HttpClient(){ BaseAddress = new Uri(_api) };
    
        static void Main(string[] args)
        {
            Run().Wait();
        }
    
        static async Task Run()
        {
    
        }
    }
  1. 9 줄에서 _api 상수를 찾습니다.
    private const string _api = "";
  1. 이 랩의 앞에서 기록한 웹앱의 URL에 변수 값을 설정하여 _api 상수를 업데이트합니다.

참고: 예를 들어 URL이 http://smpapistudent.azurewebsites.net인 경우 새 코드 줄은 private const string _api = “http://smpapistudent.azurewebsites.net”입니다.

  1. 실행 메서드 내에서 다음 두 코드 줄를 추가하여 /api/values/ 상대 경로의 문자열에서 HttpClient.GetStringAsync 메서드를 비동기적으로 호출하고 응답을 작성합니다.
    string response = await _client.GetStringAsync("/api/values/");
    Console.WriteLine(response);
  1. Program.cs 파일을 저장합니다.

작업 3: 콘솔 응용 프로그램 로컬 테스트

  1. 탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉토리로 설정되어 있습니다.

  2. .NET 코어 웹 응용 프로그램을 실행합니다.

    dotnet run
  1. 애플리케이션이 Azure에서 웹앱을 성공적으로 호출하고 이 랩의 앞에서 관찰한 것과 동일한 JSON 배열을 반환하는지 확인합니다.
    ["value1","value2"]
  1. Azure Portal을 표시하며 현재 열려 있는 브라우저 창으로 돌아갑니다.

  2. 이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.

  3. App Service 블레이드에서 웹앱의 실행을 멈추기 위해서 중지를 선택합니다.

  4. Visual Studio Code를 엽니다.

  5. Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Console 폴더를 엽니다.

  6. 탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.

  7. 명령 프롬프트에서 .NET Core 웹 응용 프로그램을 실행합니다.

    dotnet run
  1. 애플리케이션이 실패하고 다음 예외 메시지와 유사한 HttpRequestException 메시지가 표시되는지 확인하십시오.
    System.Net.Http.HttpRequestException: 응답 상태 코드는
    success: 403(사이트 사용 안 함).
       at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
       at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask)
       at SimpleConsole.Program.Run() in F:\Labfiles\05\Starter\Console\Program.cs:line 20
> **참고**: 이 예외는 웹앱을 더 이상 사용할 수 없기 때문에 발생합니다.

작업 4: 폴리를 사용하여 재시도 논리 추가

  1. Visual Studio Code탐색기를 사용하여 편집기에서 PollyHandler.cs 파일을 엽니다.

  2. 폴리핸들러 클래스 내에서 13-24줄을 관찰합니다. 이러한 코드 줄은 NET FoundationPolly 라이브러리를 사용하여 5분마다 실패한 HTTP 요청을 다시 시도하는 재시도 정책을 만듭니다.

  3. Visual Studio Code탐색기를 사용하여 편집기에서 Program.cs 파일을 엽니다.

  4. 10 줄에서 _client 상수를 찾습니다.

    private static HttpClient _client = new HttpClient(){ BaseAddress = new Uri(_api) }; 
  1. PollyHandler 클래스의 새 인스턴스를 사용하도록 HttpClient 생성자를 업데이트하여 _client 상수를 업데이트합니다.
    private static HttpClient _client = new HttpClient(new PollyHandler()){ BaseAddress = new Uri(_api) };
  1. Program.cs 파일을 저장합니다.

작업 5: 재시도 논리 검증

  1. 탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉터리로 설정되어 있습니다.

  2. .NET 코어 웹 응용 프로그램을 실행합니다.

    dotnet run
  1. HTTP 요청 실행이 계속 실패하고 5초마다 재시도되고 있는지 관찰합니다. 응용 프로그램을 실행 상태로 둡니다. 성공할 때까지 웹앱에 무한히 액세스하려고 시도합니다.

  2. Azure Portal을 표시하며 현재 열려 있는 브라우저 창으로 돌아갑니다.

  3. 이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.

  4. App Service 블레이드에서 웹앱을 다시 시작하려면 시작을 선택합니다.

  5. 현재 실행 중인 Visual Studio Code 애플리케이션으로 돌아갑니다.

  6. 애플리케이션이 Azure에서 웹앱을 마침내 성공적으로 호출하고 이 랩의 앞에서 관찰한 것과 동일한 JSON 배열을 반환하는지 확인합니다.

  7. 현재 실행 중인 Visual Studio Code 애플리케이션을 닫습니다.

검토

이 연습에서는 조건부 재시도 논리를 사용하여 API에 액세스하는 콘솔 애플리케이션을 만들었습니다. API를 사용할 수 있는지 여부에 관계없이 애플리케이션이 계속 작동했습니다.

연습 4: 테스트 웹앱 로드

작업 1: 웹앱에서 성능 테스트 실행

  1. Azure Portal을 표시하며 현재 열려 있는 브라우저 창으로 돌아갑니다.

  2. 이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.

  3. App Service 블레이드에서 성능 테스트 링크를 선택합니다.

  4. 다음 세부 정보를 사용하여 새 성능 테스트를 만듭니다.

    • 이름: Loadtest

    • 부하 생성 원본: 미국 동부(웹 앱 위치)

    • 사용자 로드: 1000

    • 지속 기간: 10

    • 테스트 유형: 수동 테스트

    • URL: http://<your-api-name>.azurewebsites.net/api/values

  5. 부하 테스트 블레이드에서 랩을 진행하기 전에 테스트가 시작되고 완료될 때까지 기다립니다. 웹앱 사용량이 증가함에 따라 라이브 차트가 업데이트되는지 확인합니다.

    참고: 대부분의 로드 테스트는 리소스를 수집하고 시작하는 데 약 10~15분이 걸립니다. 부하 테스트가 시작되면 자동으로 새로 고쳐지므로 이 블레이드에서 기다릴 수 있습니다. 다음 부하 테스트는 이전에 랩에 단계에서 지정한 10 분 정도 걸립니다.

작업 2: 성능 테스트 후 Azure 모니터 메트릭 사용

  1. Azure Monitor 서비스로 이동합니다.

  2. 모니터블레이드에서 메트릭 링크를 선택합니다.

  3. 메트릭 섹션에서 다음 세부 정보가 있는 새 차트를 만듭니다.

    • 리소스: 이전에 랩에 단계에서 만든 instrm* 응용 프로그램 인사이트 계정

    • 시간 범위: 마지막 30 분(자동)

    • 차트 유형: 지역 도표

  4. 다음 세부 정보에 따라서 새 메트릭을 만들겁니다.

    • 메트릭 네임스페이스: 표준 메트릭

    • 메트릭: 프로세스 CPU

    • 집계: 평균

  5. 다음 세부 정보에 따라서 다른 새 메트릭을 만들겁니다.

    • 메트릭 네임스페이스: 로그 기반 메트릭

    • 메트릭: 서버 응답 시간

    • 집계: 평균

  6. 차트에 표시된 정보를 관찰합니다. 서버 응답 시간이 응용 프로그램의 로드가 증가함에 따라 CPU 시간과 어떻게 상관 관계가 있는지 관찰할 수 있습니다.

복습

이 연습에서는 Azure 에서 사용할 수 있는 도구를 사용하여 웹앱의 성능(로드) 테스트를 수행했습니다. 로드 테스트를 수행한 후 Azure Monitor 인터페이스의 메트릭을 사용하여 API 앱의 동작을 측정할 수 있었습니다.

연습5: 구독 정리

작업 1: Cloud Shell 열기

  1. Azure Portal 상단에서 Cloud Shell 아이콘을 선택하여 새 셸 인스턴스를 엽니다.

  2. Cloud Shell이 아직 구성되지 않은 경우 기본 설정을 사용하여 Bash용 셸을 구성합니다.

  3. Cloud Shell 명령 프롬프트의 포털 하단에 다음 명령을 입력하고 Enter 키를 눌러 구독의 모든 리소스 그룹을 나열합니다.

    az group list
  1. 다음 명령을 입력하고 Enter 키를 눌러 리소스 그룹을 삭제하는 데 사용할 수 있는 명령 목록을 봅니다.
    az group delete --help

작업 2: 리소스 그룹 삭제

  1. 다음 명령을 입력하고 Enter 를 눌러 MonitoredAssets 리소스 그룹을 삭제합니다.
    az group delete --name MonitoredAssets --no-wait --yes
  1. 포털 하단의 Cloud Shell 창을 닫습니다.

작업 3: 활성 애플리케이션 닫기

  1. 현재 실행 중인 Microsoft Edge 응용 프로그램을 닫습니다.

  2. 현재 실행 중인 Visual Studio Code 응용 프로그램을 닫습니다.

검토

이 연습에서는 이 랩에 사용된 리소스 그룹을 제거하여 구독을 정리했습니다.