다음을 통해 공유


PowerShell Azure Functions 로컬 디버그하기

Azure Functions를 사용하면 PowerShell 스크립트로 함수를 개발할 수 있습니다.

다음 표준 개발 도구를 사용하여 PowerShell 스크립트와 마찬가지로 PowerShell 함수를 로컬로 디버그할 수 있습니다.

  • Visual Studio Code: 전체 PowerShell 개발 환경을 제공하는 PowerShell 확장이 포함된 Microsoft의 무료 경량 오픈 소스 텍스트 편집기입니다.
  • PowerShell 콘솔: 다른 PowerShell 프로세스를 디버그하는 데 사용하는 것과 동일한 명령을 사용하여 디버그합니다.

Azure Functions Core Tools 는 PowerShell 함수를 포함하여 Azure Functions의 로컬 디버깅을 지원합니다.

예제 함수 앱

이 문서에서 사용되는 함수 앱에는 단일 HTTP 트리거 함수가 있으며 다음 파일이 있습니다.

PSFunctionApp
 | - HttpTriggerFunction
 | | - run.ps1
 | | - function.json
 | - local.settings.json
 | - host.json
 | - profile.ps1

이 함수 앱은 PowerShell 빠른 시작을 완료할 때 가져오는 앱과 유사합니다.

함수 코드 run.ps1 는 다음 스크립트와 같습니다.

param($Request)

$name = $Request.Query.Name

if($name) {
    $status = 200
    $body = "Hello $name"
}
else {
    $status = 400
    $body = "Please pass a name on the query string or in the request body."
}

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})

연결 지점 설정

PowerShell 함수를 디버그하려면 디버거를 연결하기 위해 함수를 중지해야 합니다. cmdlet은 Wait-Debugger 실행을 중지하고 디버거를 기다립니다.

비고

PowerShell 7을 사용하는 경우 코드에 호출을 Wait-Debugger 추가할 필요가 없습니다.

다음과 같이 Wait-Debugger 명령문 바로 위에 if cmdlet에 대한 호출을 추가하기만 하면 됩니다.

param($Request)

$name = $Request.Query.Name

# This is where we will wait for the debugger to attach
Wait-Debugger

if($name) {
    $status = 200
    $body = "Hello $name"
}
# ...

디버깅은 if 문에서 시작됩니다.

Wait-Debugger 이제 Visual Studio Code 또는 PowerShell 콘솔을 사용하여 함수를 디버그할 수 있습니다.

Visual Studio Code에서 디버그

Visual Studio Code에서 PowerShell 함수를 디버그하려면 다음이 설치되어 있어야 합니다.

이러한 종속성을 설치한 후 기존 PowerShell Functions 프로젝트를 로드하거나 첫 번째 PowerShell Functions 프로젝트를 만듭니다.

비고

프로젝트에 필요한 구성 파일이 없는 경우 추가하라는 메시지가 표시됩니다.

PowerShell 버전 설정

PowerShell Core는 Windows PowerShell과 함께 설치됩니다. PowerShell Core를 Visual Studio Code용 PowerShell 확장과 함께 사용할 PowerShell 버전으로 설정합니다.

  1. F1 키를 눌러 명령 팔레트를 표시한 다음, Session을 검색합니다.

  2. PowerShell: 세션 메뉴 표시를 선택합니다.

  3. 현재 세션PowerShell Core 6이 아닌 경우 전환: PowerShell Core 6을 선택합니다.

PowerShell 파일을 열면 창의 오른쪽 아래에 녹색으로 표시된 버전이 표시됩니다. 이 텍스트를 선택하면 세션 메뉴도 표시됩니다. 자세한 내용은 확장에 사용할 PowerShell 버전 선택을 참조하세요.

함수 앱 시작

Wait-Debugger 디버거를 연결하려는 함수에 설정되어 있는지 확인합니다. Wait-Debugger를 추가하면, Visual Studio Code를 사용하여 함수 앱을 디버그할 수 있습니다.

디버그 창을 선택한 다음 PowerShell 함수에 연결합니다.

디버거

F5 키를 눌러 디버깅을 시작할 수도 있습니다.

디버깅 시작 작업은 다음 작업을 수행합니다.

  • func extensions install을(를) 터미널에서 실행하여 함수 앱에 필요한 Azure Functions 확장을 설치합니다.
  • 터미널에서 실행 func host start 하여 Functions 호스트에서 함수 앱을 시작합니다.
  • PowerShell 디버거를 Functions 런타임 내의 PowerShell 런스페이스에 연결합니다.

비고

Visual Studio Code에서 올바른 디버깅 환경을 보장하려면 PSWorkerInProcConcurrencyUpperBound가 1로 설정되어 있는지 확인해야 합니다. 기본값입니다.

함수 앱이 실행되면 HTTP 트리거 함수를 호출하려면 별도의 PowerShell 콘솔이 필요합니다.

이 경우 PowerShell 콘솔은 클라이언트입니다. 함수 Invoke-RestMethod 를 트리거하는 데 사용됩니다.

PowerShell 콘솔에서 다음 명령을 실행합니다.

Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"

응답이 즉시 반환되지 않습니다. Wait-Debugger 디버거를 연결했고 PowerShell 실행이 가능한 한 빨리 중단 모드로 전환되었기 때문입니다. 이는 나중에 설명하는 BreakAll 개념 때문입니다. 단추를 누른 continue 후 디버거는 이제 바로 다음 Wait-Debugger줄에서 중단됩니다.

이 시점에서 디버거가 연결되고 모든 일반 디버거 작업을 수행할 수 있습니다. Visual Studio Code에서 디버거를 사용하는 방법에 대한 자세한 내용은 공식 설명서를 참조하세요.

스크립트를 계속 및 완전히 호출하면 다음을 확인할 수 있습니다.

  • Invoke-RestMethod 작업을 수행한 PowerShell 콘솔이 결과를 반환했습니다.
  • Visual Studio Code의 PowerShell 통합 콘솔에서 스크립트가 실행되기를 기다리고 있습니다.

나중에 동일한 함수를 호출하면 PowerShell 확장의 디버거가 바로 다음에서 중단됩니다 Wait-Debugger.

PowerShell 콘솔에서 디버깅

비고

이 섹션에서는 Azure Functions Core Tools 문서를 읽고 명령을 사용하여 func host start 함수 앱을 시작하는 방법을 알고 있다고 가정합니다.

콘솔 cd 을 열고 함수 앱의 디렉터리로 이동하고 다음 명령을 실행합니다.

func host start

함수 앱이 실행되고 Wait-Debugger 있는 상태에서 프로세스에 연결할 수 있습니다. 두 개의 PowerShell 콘솔이 더 필요합니다.

콘솔 중 하나가 클라이언트 역할을 합니다. 이를 통해 함수를 트리거하기 위해 호출 Invoke-RestMethod 합니다. 예를 들어 다음 명령을 실행할 수 있습니다.

Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"

응답은 반환되지 않으며, 이는 다음의 Wait-Debugger결과입니다. 이제 PowerShell 런스페이스가 디버거가 연결되기를 기다리고 있습니다. 부착해 봅시다.

다른 PowerShell 콘솔에서 다음 명령을 실행합니다.

Get-PSHostProcessInfo

이 cmdlet은 다음 출력과 같은 테이블을 반환합니다.

ProcessName ProcessId AppDomainName
----------- --------- -------------
dotnet          49988 None
pwsh            43796 None
pwsh            49970 None
pwsh             3533 None
pwsh            79544 None
pwsh            34881 None
pwsh            32071 None
pwsh            88785 None

ProcessIdProcessName인 테이블의 항목에 dotnet를 고려합니다. 이 프로세스는 함수 앱입니다.

다음으로, 다음 코드 조각을 실행합니다.

# This enters into the Azure Functions PowerShell process.
# Put your value of `ProcessId` here.
Enter-PSHostProcess -Id $ProcessId

# This triggers the debugger.
Debug-Runspace 1

시작되면 디버거가 중단되고 다음과 같은 출력이 표시됩니다.

Debugging Runspace: Runspace1

To end the debugging session type the 'Detach' command at the debugger prompt, or type 'Ctrl+C' otherwise.

At /Path/To/PSFunctionApp/HttpTriggerFunction/run.ps1:13 char:1
+ if($name) { ...
+ ~~~~~~~~~~~
[DBG]: [Process:49988]: [Runspace1]: PS /Path/To/PSFunctionApp>>

이 시점에서 PowerShell 디버거의 중단점에서 중지됩니다. 여기에서 일반적인 디버그 작업, 프로시저 단위 실행, 한 단계씩 코드 실행, 계속, 종료 및 기타 작업을 수행할 수 있습니다. 콘솔에서 사용할 수 있는 전체 디버그 명령을 보려면 h 명령 또는 ? 명령을 실행하십시오.

cmdlet을 사용하여 이 수준에서 Set-PSBreakpoint 중단점을 설정할 수도 있습니다.

스크립트를 계속 및 완전히 호출하면 다음을 확인할 수 있습니다.

  • 실행한 Invoke-RestMethod PowerShell 콘솔이 이제 결과를 반환했습니다.
  • 실행한 Debug-Runspace PowerShell 콘솔에서 스크립트가 실행되기를 기다리고 있습니다.

동일한 함수를 다시 호출할 수 있습니다. 예를 들어 Invoke-RestMethod을 사용하여 호출하면, Wait-Debugger 명령 바로 뒤에서 디버거가 중단됩니다.

디버깅에 대한 고려 사항

Functions 코드를 디버깅할 때 발생하는 다음 문제에 유의하세요.

BreakAll 디버거가 예기치 않은 위치에서 중단될 수 있습니다.

PowerShell 확장은 Debug-Runspace을 사용하며, 이는 PowerShell의 BreakAll 기능에 의존합니다. 이 기능은 실행되는 첫 번째 명령에서 중지하도록 PowerShell에 지시합니다. 이 동작은 디버그된 Runspace 내에서 중단점을 설정할 수 있는 기회를 제공합니다.

Azure Functions 런타임은 실제로 run.ps1 스크립트를 호출하기 전에 몇 가지 명령을 실행하므로 디버거가 Microsoft.Azure.Functions.PowerShellWorker.psm1 또는 Microsoft.Azure.Functions.PowerShellWorker.psd1 내에서 중단될 수 있습니다.

이 중단이 발생하면 continue 또는 c 명령을 실행하여 이 중단점을 건너뜁니다. 그런 다음 예상 중단점에서 중지합니다.

문제 해결

디버깅하는 동안 어려움이 있는 경우 다음을 확인해야 합니다.

확인 조치
터미널에서 실행 func --version 합니다. 찾을 수 없는 오류가 func 발생하면 핵심 도구(func.exe)가 지역 path 변수에서 누락될 수 있습니다. 핵심 도구를 다시 설치합니다.
Visual Studio Code에서 기본 터미널은 func.exe대한 액세스 권한이 있어야 합니다. WSL(Linux용 Windows 하위 시스템)과 같이 Core Tools가 설치되지 않은 기본 터미널을 사용하지 않는지 확인합니다. Visual Studio Code의 기본 셸을 PowerShell 7(권장) 또는 Windows PowerShell 5.1로 설정합니다.

다음 단계

PowerShell을 사용하여 Functions를 개발하는 방법에 대한 자세한 내용은 Azure Functions PowerShell 개발자 가이드를 참조하세요.