랩: 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
랩 파일 다운로드
-
작업 표시줄에서 Windows PowerShell 아이콘을 선택합니다.
-
PowerShell 명령 프롬프트에서 현재 작업 디렉터리를 Allfiles(F):\ 경로로 변경합니다.
cd F:
- 명령 프롬프트 내에서 다음 명령을 입력하고 Enter 키를 눌러 GitHub에서 호스트되는 microsoftlearning/AZ-203-DevelopingSolutionsforMicrosoftAzure 프로젝트를 Allfiles (F):\ 드라이브로 복제합니다.
git clone --depth 1 --no-checkout https://github.com/microsoftlearning/AZ-203-DevelopingSolutionsForMicrosoftAzure.
- 명령 프롬프트 내에서 다음 명령을 입력하고 Enter 키를 눌러 AZ-203T05 랩을 완료하는 데 필요한 랩 파일을 체크 아웃합니다.
git checkout master -- Allfiles/*
- 현재 실행 중인 Windows PowerShell 명령 프롬프트 응용 프로그램을 닫습니다.
연습 1: Azure 리소스 만들기 및 구성
작업 1: Azure Portal 열기
-
작업 표시줄에서 Microsoft Edge 아이콘을 선택합니다.
-
열린 브라우저 창에서 Azure Portal(portal.azure.com)로 이동합니다.
-
로그인 페이지에서 Microsoft 계정의 전자 메일 주소를 입력합니다.
-
다음을 선택합니다.
-
Microsoft 계정의 비밀번호를 입력합니다.
-
로그인을 선택합니다.
참고: Azure Portal에 처음 로그인하는 경우 포털 둘러보기를 제공하는 대화 상자가 표시됩니다. 둘러보기를 건너뛰고 포털 사용을 시작하려면 시작하기를 선택합니다.
작업 2: Application Insights 리소스 만들기
-
다음과 같은 세부 정보를 사용하여 새 Application Insights 계정을 만듭니다.
-
새 리소스 그룹: MonitoredAssets
-
이름: instrm[소문자로 된 사용자 이름]
-
위치: (미국) 미국 동부
참고: 랩을 진행하기 전에 Azure 에서 저장소 계정 만들기가 완료될 때까지 기다립니다. 계정이 생성되면 알림을 받게 됩니다.
-
-
응용 프로그램 인사이트 블레이드의 속성 섹션에 액세스합니다.
-
계측 키 필드의 값을 관찰합니다. 이 키는 클라이언트 응용 프로그램에서 응용 프로그램 인사이트에 연결로 사용합니다.
작업 3: 웹앱 리소스 만들기
-
다음 세부 정보를 사용하여 새 웹앱을 만듭니다.
-
기존 리소스 그룹: MonitoredAssets
-
웹앱 이름: smpapi[소문자로 된 사용자 이름]
-
게시: 코드
-
런타임 스택: .NET Core 3.0
-
운영 체제: Windows
-
지역: 미국 동부
-
새 App Service 계획: MonitoredPlan
-
SKU 및 크기: 표준(S1)
-
Application Insights: 사용
-
기존 Application Insights 리소스: instrm[소문자로 된 사용자 이름]
참고: 랩을 진행하기 전에 Azure 에서 웹앱 만들기가 완료될 때까지 기다립니다. 앱을 만들 때 알림을 받게 됩니다.
-
-
이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.
-
블레이드 왼쪽의 설정 섹션에서 구성 섹션으로 이동합니다.
-
구성 설정 내의 애플리케이션 설정 탭을 찾아 액세스합니다.
-
APPINSIGHTS_INSTRUMENTATIONKEY 애플리케이션 설정 키에 해당하는 값을 확인합니다. 이 값은 웹앱 리소스를 빌드할 때 자동으로 설정되었습니다.
-
App Service 블레이드의 속성 섹션에 액세스합니다.
-
URL 필드의 값을 기록합니다. 이 값을 나중에 랩에서 사용하여 API 에 대한 요청을 합니다.
작업 4: 웹앱 자동 크기 조정 옵션 구성
-
App Services 블레이드의 규모 확장 섹션으로 이동합니다.
-
스케일 아웃 섹션에서 다음 세부 정보를 사용하여 사용자 지정 자동 크기 조정을 사용하도록 설정합니다.
-
이름: 컴퓨트 스케일러
-
스케일 모드 섹션에 메트릭에 따라 스케일을 선택합니다.
-
최소 인스턴스 수: 2
-
최대 인스턴스 수: 8
-
기본 인스턴스 수: 3
-
스케일 규칙: 기본 값이 있는 싱글 스케일 조정 규칙
-
-
변경 내용을 자동 사이즈 조정 구성에 저장합니다.
검토
이 연습에서는 랩의 나머지 부분에 사용할 리소스를 만들었습니다.
연습 2: .NET Core 웹 API 애플리케이션 빌드 및 배포
작업 1: .NET 코어 웹 API 프로젝트 빌드
-
Visual Studio Code를 엽니다.
-
Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Api 폴더를 엽니다.
-
탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.
-
명령 프롬프트에서 현재 디렉터리에서 SimpleApi라는 새 .NET Core 웹 API 응용 프로그램을 만듭니다.
dotnet new webapi --output . --name SimpleApi
- NuGet에서 Microsoft.ApplicationInsights.AspNetCore 패키지의 2.7.1 버전을 현재 프로젝트에 추가합니다.
dotnet add package Microsoft.ApplicationInsights.AspNetCore --version 2.7.1
- .NET Core 웹 애플리케이션 빌드:
dotnet build
작업 2: HTTPS 를 사용하지 않도록 설정하고 응용 프로그램 인사이트를 사용하도록 응용 프로그램 코드를 업데이트합니다.
-
Visual Studio Code의 탐색기를 사용하여 편집기에서 Startup.cs 파일을 엽니다.
-
43줄에서 다음 코드 줄을 찾아 삭제합니다:
app.UseHttpsRedirection();
> **참고**: 이 코드 줄은 웹앱이 HTTPS를 사용하도록 강제합니다. 이 랩에서는 이 작업을 사용할 필요가 없습니다.
- 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";``이 됩니다.
- ConfigureServices 메서드 내에 새 코드 줄을 추가함으로써 제공된 계측 키를 사용하여 Application Insights를 구성합니다.
services.AddApplicationInsightsTelemetry(INSTRUMENTATION_KEY);
-
Startup.cs 파일을 저장합니다.
-
탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉터리로 설정되어 있습니다.
-
.NET 코어 웹 응용 프로그램 빌드:
dotnet build
작업 3: API 응용 프로그램을 로컬로 테스트
-
탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉토리로 설정되어 있습니다.
-
.NET 코어 웹 응용 프로그램을 실행합니다.
dotnet run
-
Microsoft Edge 브라우저를 엽니다.
-
열린 브라우저 창에서 port 5000의 localhost에서 호스팅되는 테스트 응용 프로그램의 /api/value 상대 경로로 이동합니다.
참고: 전체 URL 은http://localhost:5000/api/values.
-
동일한 브라우저 창에서 포트 5000의 localhost에서 호스팅되는 테스트 응용 프로그램 /api/values/7 상대 경로로 이동합니다.
참고: 전체 URL 은http://localhost:5000/api/values/7
-
최근에 열었던 브라우저 창을 닫습니다.
-
현재 실행 중인 Visual Studio Code 응용 프로그램을 닫습니다.
작업 4: 응용 프로그램 인사이트 메트릭 보기
-
Azure 포털을 표시하는 현재 열려있는 브라우저 창으로 돌아갑니다.
-
이전에 랩에서 만든 instrm* 응용 프로그램 인사이트 계정에 액세스합니다.
-
응용프로그램 인사이트 블레이드에서 블레이드 중앙에 있는 타일에 표시되는 메트릭을 관찰합니다. 특히 발생한 서버 요청 수 및 평균 서버 응답 시간을 확인합니다.
참고: Application Insights 메트릭 차트에 요청이 표시되는 데 최대 5분이 걸릴 수 있습니다.
작업 5: 웹앱에 애플리케이션 배포
-
Visual Studio Code를 엽니다.
-
Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Api 폴더를 엽니다.
-
탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.
-
Microsoft Azure 자격 증명을 사용하여 Azure CLI 에 로그인합니다.
az login
- MonitoredAssets 리소스 그룹에 있는 모든 앱을 나열합니다.
az webapp list --resource-group MonitoredAssets
- 접두사 smpapi*가 있는 앱을 찾습니다.
az webapp list --resource-group MonitoredAssets --query "[?starts_with(name, 'smpapi')]"
- 접두사 smpapi*가 있는 단일 앱의 이름만 출력합니다.
az webapp list --resource-group MonitoredAssets --query "[?starts_with(name, 'smpapi')].{Name:name}" --output tsv
- 랩 파일이 포함된 Allfiles (F):\Allfiles\Labs\05\Starter 디렉터리로 현재 디렉터리를 변경합니다.
cd F:\Labfiles\05\Starter\
- 이 랩의 앞에서 만든 웹앱에 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\>** 자리 표시자를 이 랩의 앞에서 만든 웹앱의 이름으로 바꿉니다. 최근에 이전 단계에서 이 앱의 이름을 쿼리했습니다.
-
이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.
-
브라우저에서 smpapi* 웹앱을 엽니다.
-
웹 사이트의 /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 코어 콘솔 프로젝트 빌드
-
Visual Studio Code를 엽니다.
-
Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Console 폴더를 엽니다.
-
탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.
-
명령 프롬프트에서 현재 디렉터리에서 SimpleConsole이라는 새 .NET Core 콘솔 애플리케이션을 만듭니다.
dotnet new console --output . --name SimpleConsole
- NuGet에서 Polly 패키지의 7.1.0 버전을 현재 프로젝트에 추가합니다.
dotnet add package Polly --version 7.1.0
- .NET Core 웹 애플리케이션 빌드:
dotnet build
작업 2: HTTP 클라이언트 코드 추가
-
Visual Studio Code의 탐색기를 사용하여 편집기에서 Program.cs 파일을 엽니다.
-
다음 네임스페이스에 대해 파일 상단에 using 지시문을 추가합니다.
-
System.Net.Http
-
System.Threading.Tasks
-
using System.Net.Http;
using System.Threading.Tasks;
- 7줄에서 Program 클래스를 찾습니다.
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
- 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()
{
}
}
- 9 줄에서 _api 상수를 찾습니다.
private const string _api = "";
- 이 랩의 앞에서 기록한 웹앱의 URL에 변수 값을 설정하여 _api 상수를 업데이트합니다.
참고: 예를 들어 URL이 http://smpapistudent.azurewebsites.net인 경우 새 코드 줄은 private const string _api = “http://smpapistudent.azurewebsites.net”입니다.
- 실행 메서드 내에서 다음 두 코드 줄를 추가하여 /api/values/ 상대 경로의 문자열에서 HttpClient.GetStringAsync 메서드를 비동기적으로 호출하고 응답을 작성합니다.
string response = await _client.GetStringAsync("/api/values/");
Console.WriteLine(response);
- Program.cs 파일을 저장합니다.
작업 3: 콘솔 응용 프로그램 로컬 테스트
-
탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉토리로 설정되어 있습니다.
-
.NET 코어 웹 응용 프로그램을 실행합니다.
dotnet run
- 애플리케이션이 Azure에서 웹앱을 성공적으로 호출하고 이 랩의 앞에서 관찰한 것과 동일한 JSON 배열을 반환하는지 확인합니다.
["value1","value2"]
-
Azure Portal을 표시하며 현재 열려 있는 브라우저 창으로 돌아갑니다.
-
이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.
-
App Service 블레이드에서 웹앱의 실행을 멈추기 위해서 중지를 선택합니다.
-
Visual Studio Code를 엽니다.
-
Visual Studio Code에서 Allfiles (F):\Allfiles\Labs\05\Starter\Console 폴더를 엽니다.
-
탐색기를 사용하여 컨텍스트가 현재 작업 디렉터리로 설정된 새 터미널을 엽니다.
-
명령 프롬프트에서 .NET Core 웹 응용 프로그램을 실행합니다.
dotnet run
- 애플리케이션이 실패하고 다음 예외 메시지와 유사한 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: 폴리를 사용하여 재시도 논리 추가
-
Visual Studio Code의 탐색기를 사용하여 편집기에서 PollyHandler.cs 파일을 엽니다.
-
폴리핸들러 클래스 내에서 13-24줄을 관찰합니다. 이러한 코드 줄은 NET Foundation의 Polly 라이브러리를 사용하여 5분마다 실패한 HTTP 요청을 다시 시도하는 재시도 정책을 만듭니다.
-
Visual Studio Code의 탐색기를 사용하여 편집기에서 Program.cs 파일을 엽니다.
-
10 줄에서 _client 상수를 찾습니다.
private static HttpClient _client = new HttpClient(){ BaseAddress = new Uri(_api) };
- PollyHandler 클래스의 새 인스턴스를 사용하도록 HttpClient 생성자를 업데이트하여 _client 상수를 업데이트합니다.
private static HttpClient _client = new HttpClient(new PollyHandler()){ BaseAddress = new Uri(_api) };
- Program.cs 파일을 저장합니다.
작업 5: 재시도 논리 검증
-
탐색기를 사용하여 아직 열려 있지 않은 새 터미널을 열면 컨텍스트가 현재 작업 디렉터리로 설정되어 있습니다.
-
.NET 코어 웹 응용 프로그램을 실행합니다.
dotnet run
-
HTTP 요청 실행이 계속 실패하고 5초마다 재시도되고 있는지 관찰합니다. 응용 프로그램을 실행 상태로 둡니다. 성공할 때까지 웹앱에 무한히 액세스하려고 시도합니다.
-
Azure Portal을 표시하며 현재 열려 있는 브라우저 창으로 돌아갑니다.
-
이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.
-
App Service 블레이드에서 웹앱을 다시 시작하려면 시작을 선택합니다.
-
현재 실행 중인 Visual Studio Code 애플리케이션으로 돌아갑니다.
-
애플리케이션이 Azure에서 웹앱을 마침내 성공적으로 호출하고 이 랩의 앞에서 관찰한 것과 동일한 JSON 배열을 반환하는지 확인합니다.
-
현재 실행 중인 Visual Studio Code 애플리케이션을 닫습니다.
검토
이 연습에서는 조건부 재시도 논리를 사용하여 API에 액세스하는 콘솔 애플리케이션을 만들었습니다. API를 사용할 수 있는지 여부에 관계없이 애플리케이션이 계속 작동했습니다.
연습 4: 테스트 웹앱 로드
작업 1: 웹앱에서 성능 테스트 실행
-
Azure Portal을 표시하며 현재 열려 있는 브라우저 창으로 돌아갑니다.
-
이 랩의 앞에서 만든 smpapi* 웹앱에 액세스합니다.
-
App Service 블레이드에서 성능 테스트 링크를 선택합니다.
-
다음 세부 정보를 사용하여 새 성능 테스트를 만듭니다.
-
이름: Loadtest
-
부하 생성 원본: 미국 동부(웹 앱 위치)
-
사용자 로드: 1000
-
지속 기간: 10
-
테스트 유형: 수동 테스트
-
URL: http://<your-api-name>.azurewebsites.net/api/values
-
-
부하 테스트 블레이드에서 랩을 진행하기 전에 테스트가 시작되고 완료될 때까지 기다립니다. 웹앱 사용량이 증가함에 따라 라이브 차트가 업데이트되는지 확인합니다.
참고: 대부분의 로드 테스트는 리소스를 수집하고 시작하는 데 약 10~15분이 걸립니다. 부하 테스트가 시작되면 자동으로 새로 고쳐지므로 이 블레이드에서 기다릴 수 있습니다. 다음 부하 테스트는 이전에 랩에 단계에서 지정한 10 분 정도 걸립니다.
작업 2: 성능 테스트 후 Azure 모니터 메트릭 사용
-
Azure Monitor 서비스로 이동합니다.
-
모니터블레이드에서 메트릭 링크를 선택합니다.
-
메트릭 섹션에서 다음 세부 정보가 있는 새 차트를 만듭니다.
-
리소스: 이전에 랩에 단계에서 만든 instrm* 응용 프로그램 인사이트 계정
-
시간 범위: 마지막 30 분(자동)
-
차트 유형: 지역 도표
-
-
다음 세부 정보에 따라서 새 메트릭을 만들겁니다.
-
메트릭 네임스페이스: 표준 메트릭
-
메트릭: 프로세스 CPU
-
집계: 평균
-
-
다음 세부 정보에 따라서 다른 새 메트릭을 만들겁니다.
-
메트릭 네임스페이스: 로그 기반 메트릭
-
메트릭: 서버 응답 시간
-
집계: 평균
-
-
차트에 표시된 정보를 관찰합니다. 서버 응답 시간이 응용 프로그램의 로드가 증가함에 따라 CPU 시간과 어떻게 상관 관계가 있는지 관찰할 수 있습니다.
복습
이 연습에서는 Azure 에서 사용할 수 있는 도구를 사용하여 웹앱의 성능(로드) 테스트를 수행했습니다. 로드 테스트를 수행한 후 Azure Monitor 인터페이스의 메트릭을 사용하여 API 앱의 동작을 측정할 수 있었습니다.
연습5: 구독 정리
작업 1: Cloud Shell 열기
-
Azure Portal 상단에서 Cloud Shell 아이콘을 선택하여 새 셸 인스턴스를 엽니다.
-
Cloud Shell이 아직 구성되지 않은 경우 기본 설정을 사용하여 Bash용 셸을 구성합니다.
-
Cloud Shell 명령 프롬프트의 포털 하단에 다음 명령을 입력하고 Enter 키를 눌러 구독의 모든 리소스 그룹을 나열합니다.
az group list
- 다음 명령을 입력하고 Enter 키를 눌러 리소스 그룹을 삭제하는 데 사용할 수 있는 명령 목록을 봅니다.
az group delete --help
작업 2: 리소스 그룹 삭제
- 다음 명령을 입력하고 Enter 를 눌러 MonitoredAssets 리소스 그룹을 삭제합니다.
az group delete --name MonitoredAssets --no-wait --yes
- 포털 하단의 Cloud Shell 창을 닫습니다.
작업 3: 활성 애플리케이션 닫기
-
현재 실행 중인 Microsoft Edge 응용 프로그램을 닫습니다.
-
현재 실행 중인 Visual Studio Code 응용 프로그램을 닫습니다.
검토
이 연습에서는 이 랩에 사용된 리소스 그룹을 제거하여 구독을 정리했습니다.