Azure Functions를 로컬에서 코딩 및 테스트

Azure Portal에서 Azure Functions를 개발하고 테스트할 수 있지만 대부분의 개발자는 로컬 개발 환경을 선호합니다. Functions를 사용하면 즐겨 찾는 코드 편집기와 개발 도구를 사용하여 로컬 컴퓨터에서 함수를 쉽게 만들고 테스트할 수 있습니다. 로컬 함수는 라이브 Azure 서비스에 연결할 수 있고 사용자는 전체 Functions 런타임을 사용하여 로컬 머신에서 해당 함수를 디버깅할 수 있습니다.

이 문서에서는 기본 설정 언어를 위한 특정 개발 환경에 대한 링크를 제공합니다. 또한 local.settings.json 파일 작업과 같은 로컬 개발에 대한 몇 가지 공유 지침을 제공합니다.

로컬 개발 환경

로컬 컴퓨터에서 함수를 개발하는 방식은 언어 및 기본 도구에 따라 달라집니다. 다음 표에서 환경은 로컬 개발을 지원합니다.

환경 언어 설명
Visual Studio Code C#(In-Process)
C#(격리 작업자 프로세스)
JavaScript
PowerShell
Python
VS Code용 Azure Functions 확장은 VS Code에 Functions 지원을 추가합니다. 핵심 도구가 필요합니다. 2.x 버전의 핵심 도구를 사용하면 Linux, macOS 및 Windows에서 개발을 지원합니다. 자세한 내용은 Visual Studio Code를 사용하여 첫 번째 함수 만들기를 참조하세요.
명령 프롬프트 또는 터미널 C#(In-Process)
C#(격리 작업자 프로세스)
JavaScript
PowerShell
Python
Azure Functions Core Tools는 로컬 개발을 가능하게 하는 함수 생성을 위한 핵심 런타임 및 템플릿을 제공합니다. 버전 2.x는 Linux, macOS 및 Windows에서 개발을 지원합니다. 모든 환경은 로컬 Functions 런타임에 대한 핵심 도구를 사용합니다.
Visual Studio C#(In-Process)
C#(격리 작업자 프로세스)
Azure Functions 도구는 Visual Studio 2019부터 Visual StudioAzure 개발 워크로드에 포함됩니다. 클래스 라이브러리에서 함수를 컴파일하고 .dll을 Azure에 게시할 수 있습니다. 로컬 테스트에 대한 핵심 도구를 포함합니다. 자세한 내용은 Visual Studio를 사용하여 Azure Functions 개발을 참조하세요.
Maven(다양) Java Maven archetype은 Java 함수 개발을 가능하게 하는 핵심 도구를 지원합니다. 버전 2.x는 Linux, macOS 및 Windows에서 개발을 지원합니다. 자세한 내용은 Java 및 Maven을 사용하여 Azure에서 첫 번째 함수 만들기를 참조하세요. 또한 EclipseIntelliJ IDEA를 사용한 개발을 지원합니다.

참고 항목

Azure Portal에서 함수 코드를 편집하는 데 제한이 있으므로 함수를 로컬로 개발하고 Azure의 함수 앱에 코드 프로젝트를 게시해야 합니다. 자세한 내용은 Azure Portal의 개발 제한 사항을 참조하세요.

이러한 로컬 개발 환경 각각을 통해 함수 앱 프로젝트를 만들고 미리 정의된 함수 템플릿을 사용하여 새 함수를 만들 수 있습니다. 각각은 핵심 도구를 사용합니다. 다른 앱처럼 고유한 머신에서 실제 Functions 런타임에 대해 함수를 테스트하고 디버그할 수 있습니다. 이러한 환경 중 하나의 함수 앱 프로젝트를 Azure에 게시할 수도 있습니다.

로컬 프로젝트 파일

Functions 프로젝트 디렉터리에는 언어에 관계없이 다음 파일과 폴더가 포함되어 있습니다.

File name 설명
host.json 자세한 내용은 host.json 참조를 참조하세요.
local.settings.json 앱 설정을 포함하여 로컬에서 실행할 때 핵심 도구에서 사용하는 설정입니다. 자세히 알아보려면 로컬 설정 파일을 참조하세요.
gitignore가 포함되는 것이 좋습니다. local.settings.json 파일이 실수로 Git 리포지토리에 게시되는 것을 방지합니다. 자세히 알아보려면 로컬 설정 파일을 참조하세요.
.vscode\extensions.json Visual Studio Code에서 프로젝트 폴더를 열 때 사용되는 설정 파일입니다.

프로젝트의 다른 파일은 언어 및 특정 함수에 따라 달라집니다. 자세한 내용은 언어에 대한 개발자 가이드를 참조하세요.

로컬 설정 파일

local.settings.json 파일은 로컬 개발 도구에서 사용하는 앱 설정, 설정을 저장합니다. local.settings.json 파일의 설정은 프로젝트를 로컬에서 실행할 때만 사용됩니다. Azure에 프로젝트를 게시하는 경우 함수 앱의 앱 설정에도 필요한 설정을 추가해야 합니다.

Important

local.settings.json에는 연결 문자열과 같은 비밀이 포함될 수 있으므로 원격 리포지토리에 저장해서는 안 됩니다. Functions를 지원하는 도구는 local.settings.json 파일의 설정을 프로젝트가 배포된 함수 앱의 앱 설정과 동기화하는 방법을 제공합니다.

로컬 설정 파일의 구조는 다음과 같습니다.

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "<language worker>",
    "AzureWebJobsStorage": "<connection-string>",
    "MyBindingConnection": "<binding-connection-string>",
    "AzureWebJobs.HttpExample.Disabled": "true"
  },
  "Host": {
    "LocalHttpPort": 7071,
    "CORS": "*",
    "CORSCredentials": false
  },
  "ConnectionStrings": {
    "SQLConnectionString": "<sqlclient-connection-string>"
  }
}

다음 설정은 프로젝트를 로컬에서 실행할 때 지원됩니다.

설정 설명
IsEncrypted 이 설정이 true로 설정된 경우 모든 값은 로컬 머신 키로 암호화됩니다. func settings 명령과 함께 사용됩니다. 기본값은 false여야 합니다. 서비스 연결 문자열과 같은 비밀이 포함된 경우 로컬 컴퓨터에서 local.settings.json 파일을 암호화할 수 있습니다. 호스트는 실행 시 자동으로 설정의 암호를 해독합니다. 로컬로 암호화된 설정을 읽으려고 시도하기 전에 func settings decrypt 명령을 사용합니다.
Values 프로젝트가 로컬로 실행될 때 사용되는 애플리케이션 설정의 컬렉션입니다. 이러한 키-값(문자열-문자열) 쌍은 Azure에서 함수 앱의 애플리케이션 설정에 해당합니다(예: AzureWebJobsStorage). 많은 트리거와 바인딩에는 연결 문자열 앱 설정을 참조하는 속성(예: Blob Storage 트리거에 대한 Connection)이 있습니다. 이러한 속성의 경우 Values 배열에 정의된 애플리케이션 설정이 필요합니다. 일반적으로 사용되는 설정 목록은 다음 표를 참조하세요.
값은 JSON 개체 또는 배열이 아닌 문자열이어야 합니다. 설정 이름은 이중 밑줄(__)을 포함할 수 없으며 콜론(:)을 포함하지 않아야 합니다. 이중 밑줄 문자는 런타임에 예약되고 콜론은 종속성 주입을 지원하도록 예약되어 있습니다.
Host 이 섹션의 설정은 프로젝트를 로컬에서 실행할 때 Functions 호스트 프로세스를 사용자 지정합니다. 이러한 설정은 Azure에서 프로젝트를 실행하는 경우에도 적용되는 host.json 설정과는 별개입니다.
LocalHttpPort 로컬 Functions 호스트(func host startfunc run)를 실행할 때 사용되는 기본 포트를 설정합니다. --port 명령줄 옵션이 이 설정보다 우선합니다. 예를 들어 Visual Studio IDE에서 실행되는 경우 "프로젝트 속성 -> 디버그" 창으로 이동하고 "애플리케이션 인수" 필드에 제공할 수 있는 host start --port <your-port-number> 명령에서 포트 번호를 명시적으로 지정하여 포트 번호를 변경할 수 있습니다.
CORS CORS(원본 간 리소스 공유)에 허용된 원본을 정의합니다. 원본은 공백 없이 쉼표로 구분된 목록으로 제공됩니다. 와일드카드 값(*)이 지원되므로 모든 원본에서 요청할 수 있습니다.
CORSCredentials true로 설정하면 withCredentials 요청을 허용합니다.
ConnectionStrings 컬렉션입니다. 함수 바인딩에서 사용하는 연결 문자열에는 이 컬렉션을 사용하지 마십시오. 이 컬렉션은 일반적으로 구성 파일의 ConnectionStrings 섹션에서 연결 문자열을 가져오는 프레임워크에서만 사용됩니다(예: Entity Framework). 이 개체의 연결 문자열은 공급자 유형이 System.Data.SqlClient인 환경에 추가됩니다. 이 컬렉션의 항목은 다른 앱 설정을 사용하여 Azure에 게시되지 않습니다. 이러한 값을 함수 앱 설정의 Connection strings 컬렉션에 명시적으로 추가해야 합니다. 함수 코드에서 SqlConnection을 만드는 경우, 포털의 애플리케이션 설정에 다른 연결과 함께 연결 문자열 값을 저장해야 합니다.

다음 애플리케이션 설정은 로컬에서 실행할 때 Values 배열에 포함될 수 있습니다.

설정 설명
AzureWebJobsStorage 스토리지 계정 연결 문자열 또는
UseDevelopmentStorage=true
Azure Storage 계정에 대한 연결 문자열을 포함합니다. HTTP 이외의 트리거를 사용하는 경우 필요합니다. 자세한 내용은 AzureWebJobsStorage 참조를 참조하세요.
Azurite Emulator가 로컬에 설치되어 있고 AzureWebJobsStorageUseDevelopmentStorage=true로 설정하면 Core Tools는 에뮬레이터를 사용합니다. 자세한 내용은 로컬 스토리지 에뮬레이터를 참조하세요.
AzureWebJobs.<FUNCTION_NAME>.Disabled true|false 로컬에서 실행할 때 함수를 비활성화하려면 컬렉션에 "AzureWebJobs.<FUNCTION_NAME>.Disabled": "true"를 추가합니다. <FUNCTION_NAME>은 함수의 이름입니다. 자세한 내용은 Azure Functions에서 함수를 사용하지 않도록 설정하는 방법을 참조하세요.
FUNCTIONS_WORKER_RUNTIME dotnet
dotnet-isolated
node
java
powershell
python
Functions 런타임의 대상 언어를 나타냅니다. 버전 2.x 이상의 Functions 런타임에 필요합니다. 이 설정은 핵심 도구에 의해 프로젝트에 대해 생성됩니다. 자세한 내용은 FUNCTIONS_WORKER_RUNTIME 참조를 참조하세요.
FUNCTIONS_WORKER_RUNTIME_VERSION ~7 로컬로 실행할 때 PowerShell 7을 사용하도록 지정합니다. 설정되지 않은 경우 PowerShell Core 6이 사용됩니다. 이 설정은 로컬로 실행하는 경우에만 사용됩니다. Azure에서 실행하는 경우 PowerShell 런타임 버전은 포털에서 설정할 수 있는 powerShellVersion 사이트 구성 설정에 따라 결정됩니다.

설정 동기화

함수를 로컬로 개발할 때 앱에 필요한 모든 로컬 설정은 코드가 배포된 함수 앱의 앱 설정에도 있어야 합니다. 함수 앱에서 로컬 프로젝트로 현재 설정을 다운로드해야 할 수도 있습니다. Azure Portal에서 앱 설정을 수동으로 구성할 수 있으며 다음 도구를 사용하여 프로젝트의 로컬 설정과 앱 설정을 동기화할 수도 있습니다.

트리거 및 바인딩

함수를 로컬로 개발할 때 트리거 및 바인딩 동작을 고려해야 합니다. HTTP 트리거의 경우 로컬 컴퓨터에서 http://localhost/를 사용하여 HTTP 엔드포인트를 호출하기만 하면 됩니다. HTTP가 아닌 트리거 함수의 경우 다음과 같은 몇 가지 로컬 실행 옵션이 있습니다.

  • 로컬 개발 중에 바인딩을 테스트하는 가장 쉬운 방법은 라이브 Azure 서비스를 대상으로 하는 연결 문자열을 사용하는 것입니다. local.settings.json 파일의 Values 배열에 적절한 연결 문자열 설정을 추가하여 라이브 서비스를 대상으로 지정할 수 있습니다. 이렇게 하면 테스트 중 로컬 실행이 라이브 서비스 데이터에 영향을 줍니다. 따라서 개발 및 테스트 중에 사용할 별도의 서비스를 설정한 후 프로덕션 중에 다른 서비스로 전환하는 것을 고려하세요.
  • 스토리지 기반 트리거의 경우 로컬 스토리지 에뮬레이터를 사용할 수 있습니다.
  • 특수 관리자 엔드포인트를 사용하여 HTTP가 아닌 트리거 함수를 수동으로 실행할 수 있습니다. 자세히 알아보려면 HTTP 이외 트리거 함수를 수동으로 실행을 참조하세요.

로컬 테스트 중에는 Core Tools(func.exe)에서 제공하는 호스트를 로컬로 실행해야 합니다. 자세한 내용은 Azure Functions Core Tools를 참조하세요.

로컬 스토리지 에뮬레이터

로컬 개발 중에 Azure Storage 바인딩(Queue Storage, Blob Storage 및 Table Storage)으로 함수를 테스트할 때 원격 스토리지 서비스에 연결하지 않고도 로컬 Azurite 에뮬레이터를 사용할 수 있습니다. Azurite는 Visual Studio Code 및 Visual Studio와 통합되며 npm을 사용하여 명령 프롬프트에서 실행할 수도 있습니다. 자세한 내용은 로컬 Azure Storage 개발에 Azurite 에뮬레이터 사용을 참조하세요.

local.settings.json 파일의 Values 컬렉션에 있는 다음 설정은 기본 AzureWebJobsStorage 연결에 Azurite를 사용하도록 로컬 Functions 호스트에 지시합니다.

"AzureWebJobsStorage": "UseDevelopmentStorage=true"

이 설정을 사용하면 AzureWebJobsStorage를 연결로 사용하는 모든 Azure Storage 트리거 또는 바인딩이 로컬에서 실행될 때 Azurite에 연결됩니다. 로컬 실행 중에 스토리지 에뮬레이션을 사용할 때는 다음 사항을 고려해야 합니다.

  • Azurite를 설치하고 실행해야 합니다.
  • Azure에 게시하기 전에 Azure 서비스에 대한 실제 스토리지 연결을 사용하여 테스트해야 합니다.
  • 프로젝트를 게시할 때 AzureWebJobsStorage 설정을 UseDevelopmentStorage=true로 게시하지 마세요. Azure에서 AzureWebJobsStorage 설정은 항상 함수 앱에서 사용하는 스토리지 계정의 연결 문자열이어야 합니다. 자세한 내용은 AzureWebJobsStorage를 참조하세요.

다음 단계