빠른 시작: 명령줄에서 Azure에 TypeScript 함수 만들기

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 TypeScript 함수를 만듭니다. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.

Important

이 문서의 내용은 페이지 상단의 선택기에서 선택한 Node.js 프로그래밍 모델에 따라 변경됩니다. v4 모델은 일반적으로 사용 가능하며 JavaScript 및 TypeScript 개발자를 위해 보다 유연하고 직관적인 환경을 제공하도록 설계되었습니다. 마이그레이션 가이드에서 v3과 v4의 차이점에 대해 자세히 알아봅니다.

이 빠른 시작을 완료하면 Azure 계정에서 몇 센트(USD) 이하의 비용이 조금 발생합니다.

이 문서의 Visual Studio Code 기반 버전도 있습니다.

로컬 환경 구성

시작하기 전에 다음과 같은 필수 구성 요소를 갖추고 있어야 합니다.

Azure Functions 핵심 도구 설치

Core Tools를 설치하는 권장 방법은 로컬 개발 시스템의 운영 체제에 따라 다릅니다.

다음 단계에서는 MSI(Windows 설치 프로그램)를 사용하여 Core Tools v4.x를 설치합니다. 다른 패키지 기반 설치 관리자에 대한 자세한 내용은 핵심 도구 추가 정보를 참조하세요.

다음과 같이 Windows 버전에 따라 Core Tools 설치 프로그램을 다운로드하여 실행합니다.

이전에 Windows 설치 프로그램(MSI)을 사용하여 Windows에 Core Tools를 설치한 경우 최신 버전을 설치하기 전에 프로그램 추가/제거에서 이전 버전을 제거해야 합니다.

  • Core Tools 버전 v4.0.5382 이상을 설치했는지 확인합니다.

로컬 함수 프로젝트 만들기

Azure Functions에서 함수 프로젝트는 각각 특정 트리거에 응답하는 하나 이상의 개별 함수에 대한 컨테이너입니다. 프로젝트의 모든 함수는 동일한 로컬 및 호스팅 구성을 공유합니다. 이 섹션에서는 단일 함수가 포함된 함수 프로젝트를 만듭니다.

  1. 적합한 폴더에서 다음과 같이 func init 명령을 실행하여 현재 폴더에 TypeScript Node.js v3 프로젝트를 만듭니다.

    func init --typescript --model V3
    

    이제 이 폴더에는 local.settings.jsonhost.json이라는 구성 파일을 포함하여 프로젝트의 다양한 파일이 있습니다. local.settings.json은 Azure에서 다운로드한 비밀을 포함할 수 있으므로 이 파일은 기본적으로 .gitignore 파일의 원본 제어에서 제외됩니다.

  2. 다음 명령을 사용하여 함수를 프로젝트에 추가합니다. 여기서 --name 인수는 함수(HttpExample)의 고유 이름이고, --template 인수는 함수의 트리거(HTTP)를 지정합니다.

    func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
    

    func new는 프로젝트의 선택된 언어에 적합한 코드 파일과 function.json이라는 구성 파일을 포함하는 함수 이름과 일치하는 하위 폴더를 만듭니다.

(선택 사항) 파일 내용 검사

원하는 경우 로컬에서 함수 실행으로 건너뛰고, 나중에 파일 내용을 검사할 수 있습니다.

index.ts

index.tsfunction.json의 구성에 따라 트리거되는 함수를 내보냅니다.

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));
    const responseMessage = name
        ? "Hello, " + name + ". This HTTP triggered function executed successfully."
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.";

    context.res = {
        // status: 200, /* Defaults to 200 */
        body: responseMessage
    };

};

export default httpTrigger;

HTTP 트리거의 경우 함수는 function.json에 정의된 HttpRequest 유형의 req 변수에 요청 데이터를 받습니다. function.json$return으로 정의된 반환 개체는 응답입니다.

function.json

function.json은 트리거 형식을 포함하여 함수의 입력 및 출력 bindings를 정의하는 구성 파일입니다.

{
    "bindings": [
        {
            "authLevel": "function",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "http",
            "direction": "out",
            "name": "res"
        }
    ]
}

각 바인딩에는 명령, 형식 및 고유한 이름이 필요합니다. HTTP 트리거의 입력 바인딩은 httpTrigger 형식이고, 출력 바인딩은 http 형식입니다.

  1. 적합한 폴더에서 다음과 같이 func init 명령을 실행하여 현재 폴더에 TypeScript Node.js v4 프로젝트를 만듭니다.

    func init --typescript
    

    이제 이 폴더에는 local.settings.jsonhost.json이라는 구성 파일을 포함하여 프로젝트의 다양한 파일이 있습니다. local.settings.json은 Azure에서 다운로드한 비밀을 포함할 수 있으므로 이 파일은 기본적으로 .gitignore 파일의 원본 제어에서 제외됩니다. 필요한 npm 패키지도 node_modules에 설치됩니다.

  2. 다음 명령을 사용하여 함수를 프로젝트에 추가합니다. 여기서 --name 인수는 함수(HttpExample)의 고유 이름이고, --template 인수는 함수의 트리거(HTTP)를 지정합니다.

    func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
    

    func new는 함수의 코드를 포함하는 src/functions 디렉터리에 HttpExample.ts라는 파일을 만듭니다.

  3. local.settings.json에 Azure Storage 연결 정보를 추가합니다.

    {
        "Values": {       
            "AzureWebJobsStorage": "<Azure Storage connection information>",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    
  4. (선택 사항) 특정 함수(예: HTTP 트리거)에 대해 자세히 알아보려면 다음 명령을 실행하면 됩니다.

    func help httptrigger
    

로컬에서 함수 실행

  1. LocalFunctionProj 폴더에서 로컬 Azure Functions 런타임 호스트를 시작하여 함수를 실행합니다.

    npm install
    npm start
    
    npm start
    

    출력의 끝 부분에 다음 로그가 표시됩니다.

    Screenshot of terminal window output when running function locally.

    참고 항목

    HttpExample이 로그와 같이 표시되지 않으면 프로젝트의 루트 폴더 외부에서 호스트를 시작했을 가능성이 높습니다. 이 경우 Ctrl+c를 사용하여 호스트를 중지하고, 프로젝트의 루트 폴더로 이동하여 이전 명령을 다시 실행합니다.

  2. 이 출력에서 HttpExample 함수의 URL을 브라우저로 복사하고 ?name=<your-name> 쿼리 문자열을 추가하여 전체 URL을 http://localhost:7071/api/HttpExample?name=Functions와 같이 만듭니다. 브라우저에서 Hello Functions와 같은 메시지가 표시됩니다.

    Result of the function run locally in the browser

    프로젝트를 시작한 터미널에도 요청 시 로그 출력이 표시됩니다.

  3. 준비가 되면 Ctrl+c를 사용하고 y를 선택하여 함수 호스트를 중지합니다.

함수를 지원하는 Azure 리소스 만들기

함수 코드를 Azure에 배포하기 전에 다음 세 가지 리소스를 만들어야 합니다.

  • 리소스 그룹 - 관련 리소스에 대한 논리 컨테이너입니다.
  • 스토리지 계정 - 함수에 대한 상태 및 기타 정보를 유지 관리합니다.
  • 함수 앱 - 함수 코드를 실행할 수 있는 환경을 제공합니다. 함수 앱은 로컬 함수 프로젝트에 매핑되며, 함수를 논리적 단위로 그룹화하여 리소스를 더 쉽게 관리, 배포 및 공유할 수 있습니다.

다음 명령을 사용하여 이러한 항목을 만듭니다. Azure CLI와 PowerShell이 모두 지원됩니다.

  1. 아직 로그인하지 않은 경우 Azure에 로그인합니다.

    az login
    

    az login 명령은 Azure 계정에 로그인합니다.

  2. 선택한 지역에 AzureFunctionsQuickstart-rg라는 리소스 그룹을 만듭니다.

    az group create --name AzureFunctionsQuickstart-rg --location <REGION>
    

    az group create 명령은 리소스 그룹을 만듭니다. 위의 명령에서 az account list-locations 명령에서 반환된 사용 가능한 지역 코드를 사용하여 <REGION>을 가까운 지역으로 바꿉니다.

  3. 범용 스토리지 계정을 리소스 그룹 및 지역에 만듭니다.

    az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsQuickstart-rg --sku Standard_LRS --allow-blob-public-access false
    

    az storage account create 명령은 스토리지 계정을 만듭니다.

    이전 예제에서 <STORAGE_NAME>을 사용자에게 적절하고 Azure Storage에서 고유한 이름으로 바꿉니다. 이름은 3~24자의 숫자와 소문자만 포함해야 합니다. Standard_LRS는 범용 계정을 지정하며, Functions로 지원됩니다.

Important

스토리지 계정은 중요한 앱 데이터를 저장하는 데 사용되며, 이러한 중요 앱 데이터에 애플리케이션 코드 자체가 포함되는 경우도 있습니다. 다른 앱이나 사용자가 스토리지 계정에 액세스하는 행위를 제한해야 합니다.

  1. Azure에서 함수 앱을 만듭니다.

    az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location <REGION> --runtime node --runtime-version 18 --functions-version 4 --name <APP_NAME> --storage-account <STORAGE_NAME>
    

    az functionapp create 명령은 Azure에서 함수 앱을 만듭니다. 최신 버전의 Node.js(현재 18)를 사용하는 것이 좋습니다. --runtime-version18로 설정하여 버전을 지정할 수 있습니다.

    이전 예제에서는 <STORAGE_NAME>을 이전 단계에서 사용한 계정의 이름으로 바꾸고, <APP_NAME>을 적절하고 전역적으로 고유한 이름으로 바꿉니다. <APP_NAME>은 함수 앱의 기본 DNS 도메인이기도 합니다.

    이 명령은 Azure Functions 소비 계획에 따라 지정된 언어 런타임을 실행하는 함수 앱을 만듭니다. 여기서 발생하는 사용량에 대한 비용은 무료입니다. 또한 이 명령은 동일한 리소스 그룹에 연결된 Azure Application Insights 인스턴스를 만들어 함수 앱을 모니터링하고 로그를 볼 수 있습니다. 자세한 내용은 Azure Functions 모니터링을 참조하세요. 인스턴스를 활성화할 때까지 비용이 발생하지 않습니다.

Azure에 함수 프로젝트 배포

Core Tools를 사용하여 Azure에 프로젝트를 배포하기 전에 TypeScript 소스 파일에서 프로덕션이 준비된 JavaScript 파일 빌드를 만듭니다.

  1. 다음 명령을 사용하여 배포할 TypeScript 프로젝트를 준비합니다.

    npm run build
    
  2. 이제 필요한 리소스가 있으면 publish 명령을 사용하여 로컬 함수 프로젝트를 Azure의 함수 앱에 배포할 수 있습니다. 다음 예제에서 <APP_NAME>을 앱 이름으로 바꿉니다.

    func azure functionapp publish <APP_NAME>
    

    "... 이름의 앱을 찾을 수 없습니다."라는 오류가 표시되면 Azure에서 이전 az functionapp create 명령 후에 앱을 완전히 초기화하지 않았을 수 있으므로 몇 초 정도 기다렸다가 다시 시도하세요.

    publish 명령은 다음 출력과 비슷한 결과를 표시합니다(간단히 하기 위해 잘랐음).

     ...
    
     Getting site publishing info...
     Creating archive for current directory...
     Performing remote build for functions project.
    
     ...
    
     Deployment successful.
     Remote build succeeded!
     Syncing triggers...
     Functions in msdocs-azurefunctions-qs:
         HttpExample - [httpTrigger]
             Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexample?code=KYHrydo4GFe9y0000000qRgRJ8NdLFKpkakGJQfC3izYVidzzDN4gQ==
     

Azure에서 함수 호출

함수에서 HTTP 트리거를 사용하므로 브라우저 또는 도구(예: curl)를 사용하여 URL에 대한 HTTP 요청을 수행하여 호출합니다.

publish 명령의 출력에 표시된 호출 URL 전체를 브라우저 주소 표시줄에 복사하여 ?name=Functions 쿼리 매개 변수를 추가합니다. 브라우저에서 함수를 로컬로 실행했을 때와 비슷한 출력이 표시됩니다.

The output of the function run on Azure in a browser

다음 명령을 실행하여 거의 실시간으로 스트리밍 로그를 확인합니다.

func azure functionapp logstream <APP_NAME> 

별도의 터미널 창 또는 브라우저에서 원격 함수를 다시 호출합니다. Azure의 함수 실행에 대한 자세한 로그가 터미널에 표시됩니다.

리소스 정리

다음 단계를 계속 진행하고 Azure Storage 큐 출력 바인딩을 추가하는 경우 이미 수행한 작업을 기반으로 하여 빌드되는 모든 리소스를 그대로 유지합니다.

그렇지 않으면 추가 비용이 발생하지 않도록 다음 명령을 사용하여 리소스 그룹 및 포함된 모든 리소스를 삭제합니다.

az group delete --name AzureFunctionsQuickstart-rg

다음 단계