빠른 시작: Azure에서 HTTP 요청에 응답하는 함수 만들기Quickstart: Create a function in Azure that responds to HTTP requests

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 C# 클래스 라이브러리 기반 함수를 만듭니다.In this article, you use command-line tools to create a C# class library-based function that responds to HTTP requests. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.After testing the code locally, you deploy it to the serverless environment of Azure Functions.

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 JavaScript 함수를 만듭니다.In this article, you use command-line tools to create a JavaScript function that responds to HTTP requests. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.After testing the code locally, you deploy it to the serverless environment of Azure Functions.

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 TypeScript 함수를 만듭니다.In this article, you use command-line tools to create a TypeScript function that responds to HTTP requests. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.After testing the code locally, you deploy it to the serverless environment of Azure Functions.

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 PowerShell 함수를 만듭니다.In this article, you use command-line tools to create a PowerShell function that responds to HTTP requests. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.After testing the code locally, you deploy it to the serverless environment of Azure Functions.

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 Python 함수를 만듭니다.In this article, you use command-line tools to create a Python function that responds to HTTP requests. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.After testing the code locally, you deploy it to the serverless environment of Azure Functions.

이 문서에서는 명령줄 도구를 사용하여 HTTP 요청에 응답하는 Java 함수를 만듭니다.In this article, you use command-line tools to create a Java function that responds to HTTP requests. 코드를 로컬로 테스트한 후 서버리스 Azure Functions 환경에 배포합니다.After testing the code locally, you deploy it to the serverless environment of Azure Functions.

이 빠른 시작을 완료하면 Azure 계정에서 약간의 비용(몇 USD 센트)이 발생합니다.Completing this quickstart incurs a small cost of a few USD cents or less in your Azure account.

또한 이 문서의 Visual Studio Code 기반 버전도 있습니다.There is also a Visual Studio Code-based version of this article.

참고

Maven이 선호하는 개발 도구가 아닌 경우 Gradle, IntelliJ IDEAVisual Studio Code를 사용하여 Java 개발자를 위한 비슷한 자습서를 확인하세요.If Maven is not your prefered development tool, check out our similar tutorials for Java developers using Gradle, IntelliJ IDEA and Visual Studio Code.

로컬 환경 구성Configure your local environment

시작하기 전에 다음이 있어야 합니다.Before you begin, you must have the following:

  • Node.js, 활성 LTS 및 유지 관리 LTS 버전(8.11.1 및 10.14.1 권장).Node.js, Active LTS and Maintenance LTS versions (8.11.1 and 10.14.1 recommended).

중요

이 퀵 스타트를 완료하려면 JAVA_HOME 환경 변수를 JDK 설치 위치로 설정해야 합니다.The JAVA_HOME environment variable must be set to the install location of the JDK to complete this quickstart.

필수 구성 요소 확인Prerequisite check

  • 터미널 또는 명령 창에서 func --version을 실행하여 Azure Functions Core Tools가 2.7.1846 버전 이상인지 확인합니다.In a terminal or command window, run func --version to check that the Azure Functions Core Tools are version 2.7.1846 or later.

  • az --version을 실행하여 Azure CLI 버전이 2.0.76 이상인지 확인합니다.Run az --version to check that the Azure CLI version is 2.0.76 or later.

  • az login을 실행하여 Azure에 로그인하고 활성 구독을 확인합니다.Run az login to sign in to Azure and verify an active subscription.

  • python --version(Linux/MacOS) 또는 py --version(Windows)을 실행하여 Python 버전이 3.8.x, 3.7.x 또는 3.6.x로 보고되는지 확인합니다.Run python --version (Linux/MacOS) or py --version (Windows) to check your Python version reports 3.8.x, 3.7.x or 3.6.x.

가상 환경 만들기 및 활성화Create and activate a virtual environment

적절한 폴더에서 다음 명령을 실행하여 .venv라는 가상 환경을 만들고 활성화합니다.In a suitable folder, run the following commands to create and activate a virtual environment named .venv. Azure Functions에서 지원하는 Python 3.8, 3.7 또는 3.6을 사용해야 합니다.Be sure to use Python 3.8, 3.7 or 3.6, which are supported by Azure Functions.

python -m venv .venv
source .venv/bin/activate

Python에서 venv 패키지를 Linux 배포에 설치하지 않은 경우 다음 명령을 실행합니다.If Python didn't install the venv package on your Linux distribution, run the following command:

sudo apt-get install python3-venv

활성화된 가상 환경에서 이후의 모든 명령을 실행합니다.You run all subsequent commands in this activated virtual environment.

로컬 함수 프로젝트 만들기Create a local function project

Azure Functions에서 함수 프로젝트는 각각 특정 트리거에 응답하는 하나 이상의 개별 함수에 대한 컨테이너입니다.In Azure Functions, a function project is a container for one or more individual functions that each responds to a specific trigger. 프로젝트의 모든 함수는 동일한 로컬 및 호스팅 구성을 공유합니다.All functions in a project share the same local and hosting configurations. 이 섹션에서는 단일 함수가 포함된 함수 프로젝트를 만듭니다.In this section, you create a function project that contains a single function.

다음과 같이 func init 명령을 실행하여 지정된 런타임에 LocalFunctionProj 폴더에 함수 프로젝트를 만듭니다.Run the func init command, as follows, to create a functions project in a folder named LocalFunctionProj with the specified runtime:

func init LocalFunctionProj --python
func init LocalFunctionProj --dotnet
func init LocalFunctionProj --javascript
func init LocalFunctionProj --typescript
func init LocalFunctionProj --powershell

빈 폴더에서 다음 명령을 실행하여 Maven archetype으로부터 Functions 프로젝트를 생성합니다.In an empty folder, run the following command to generate the Functions project from a Maven archetype.

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype 

Maven은 배포 시 프로젝트 생성 완료를 위해 필요한 값을 요청합니다.Maven asks you for values needed to finish generating the project on deployment.
메시지가 표시되면 다음 값을 제공합니다.Provide the following values when prompted:

promptPrompt Value DescriptionDescription
groupIdgroupId com.fabrikam Java에 대한 패키지 명명 규칙에 따라 모든 프로젝트에서 프로젝트를 고유하게 식별하는 값입니다.A value that uniquely identifies your project across all projects, following the package naming rules for Java.
artifactIdartifactId fabrikam-functions 버전 번호가 없는 jar의 이름인 값입니다.A value that is the name of the jar, without a version number.
versionversion 1.0-SNAPSHOT 기본값을 선택합니다.Choose the default value.
packagepackage com.fabrikam 생성된 함수 코드에 대한 Java 패키지인 값입니다.A value that is the Java package for the generated function code. 기본값을 사용하세요.Use the default.

Y를 입력하거나 Enter 키를 눌러 확인합니다.Type Y or press Enter to confirm.

Maven은 이름이 _artifactId_인 새 폴더에 프로젝트 파일을 만드는데, 이 예제에서는 fabrikam-functions입니다.Maven creates the project files in a new folder with a name of artifactId, which in this example is fabrikam-functions.

프로젝트 폴더로 이동합니다.Navigate into the project folder:

cd LocalFunctionProj
cd fabrikam-functions

이 폴더에는 local.settings.jsonhost.json이라는 구성 파일을 포함하여 프로젝트의 다양한 파일이 있습니다.This folder contains various files for the project, including configurations files named local.settings.json and host.json. local.settings.json은 Azure에서 다운로드한 비밀을 포함할 수 있으므로 이 파일은 기본적으로 .gitignore 파일의 원본 제어에서 제외됩니다.Because local.settings.json can contain secrets downloaded from Azure, the file is excluded from source control by default in the .gitignore file.

다음 명령을 사용하여 함수를 프로젝트에 추가합니다. 여기서 --name 인수는 함수(HttpExample)의 고유 이름이고, --template 인수는 함수의 트리거(HTTP)를 지정합니다.Add a function to your project by using the following command, where the --name argument is the unique name of your function (HttpExample) and the --template argument specifies the function's trigger (HTTP).

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

func new는 HttpExample.cs 코드 파일을 만듭니다.func new creates a HttpExample.cs code file.

func new는 프로젝트의 선택된 언어에 적합한 코드 파일과 function.json이라는 구성 파일을 포함하는 함수 이름과 일치하는 하위 폴더를 만듭니다.func new creates a subfolder matching the function name that contains a code file appropriate to the project's chosen language and a configuration file named function.json.

(선택 사항) 파일 내용 검사(Optional) Examine the file contents

원하는 경우 로컬에서 함수 실행으로 건너뛰고, 나중에 파일 내용을 검사할 수 있습니다.If desired, you can skip to Run the function locally and examine the file contents later.

HttpExample.csHttpExample.cs

HttpExample.cs에는 req 변수에 요청 데이터를 수신하는 Run 메서드가 포함되며, 트리거 동작을 정의하는 HttpTriggerAttribute로 데코레이트된 HttpRequest입니다.HttpExample.cs contains a Run method that receives request data in the req variable is an HttpRequest that's decorated with the HttpTriggerAttribute, which defines the trigger behavior.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace LocalFunctionProj
{
    public static class HttpExample
    {
        [FunctionName("HttpExample")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}

반환 개체는 OkObjectResult(200) 또는 BadRequestObjectResult(400)로 응답 메시지를 반환하는 ActionResult입니다.The return object is an ActionResult that returns an response message as either an OkObjectResult (200) or a BadRequestObjectResult (400). 자세한 내용은 Azure Functions HTTP 트리거 및 바인딩을 참조하세요.To learn more, see Azure Functions HTTP triggers and bindings.

Function.javaFunction.java

Function.java에는 request 변수에서 요청 데이터를 수신하는 run 메서드가 포함되며, 트리거 동작을 정의하는 HttpTrigger 주석으로 데코레이트된 HttpRequestMessage입니다.Function.java contains a run method that receives request data in the request variable is an HttpRequestMessage that's decorated with the HttpTrigger annotation, which defines the trigger behavior.

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 */

package com.functions;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

import java.util.Optional;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpExample". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/HttpExample
     * 2. curl "{your host}/api/HttpExample?name=HTTP%20Query"
     */
    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        final String query = request.getQueryParameters().get("name");
        final String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
        } else {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

응답 메시지는 HttpResponseMessage API에서 생성됩니다.The response message is generated by the HttpResponseMessage.Builder API.

pom.xmlpom.xml

앱을 호스트하기 위해 만든 Azure 리소스의 설정은 생성된 pom.xml 파일에 있는 com.microsoft.azuregroupId를 사용하여 플러그 인의 configuration 요소에 정의됩니다.Settings for the Azure resources created to host your app are defined in the configuration element of the plugin with a groupId of com.microsoft.azure in the generated pom.xml file. 예를 들어 아래 구성 요소는 westus 지역의 java-functions-group 리소스 그룹에 함수 앱을 만들도록 Maven 기반 배포에 지시합니다.For example, the configuration element below instructs a Maven-based deployment to create a function app in the java-functions-group resource group in the westus region. 함수 앱 자체는 java-functions-app-service-plan 플랜에서 호스트되는 Windows에서 실행되며, 이 플랜은 기본적으로 서버리스 사용 플랜입니다.The function app itself runs on Windows hosted in the java-functions-app-service-plan plan, which by default is a serverless Consumption plan.

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-functions-maven-plugin</artifactId>
    <version>${azure.functions.maven.plugin.version}</version>
    <configuration>
        <!-- function app name -->
        <appName>${functionAppName}</appName>
        <!-- function app resource group -->
        <resourceGroup>${functionResourceGroup}</resourceGroup>
        <!-- function app service plan name -->
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <!-- function app region-->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values -->
        <region>${functionAppRegion}</region>
        <!-- function pricingTier, default to be consumption if not specified -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values -->
        <!-- <pricingTier></pricingTier> -->

        <!-- Whether to disable application insights, default is false -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights-->
        <!-- <disableAppInsights></disableAppInsights> -->
        <runtime>
            <!-- runtime os, could be windows, linux or docker-->
            <os>windows</os>
            <javaVersion>8</javaVersion>
            <!-- for docker function, please set the following parameters -->
            <!-- <image>[hub-user/]repo-name[:tag]</image> -->
            <!-- <serverId></serverId> -->
            <!-- <registryUrl></registryUrl>  -->
        </runtime>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~3</value>
            </property>
        </appSettings>
    </configuration>
    <executions>
        <execution>
            <id>package-functions</id>
            <goals>

초기 배포 전에 runtime.oswindows에서 linux로 변경하는 등의 방법으로 이러한 설정을 변경하면 Azure에서 리소스를 만드는 방식을 제어할 수 있습니다.You can change these settings to control how resources are created in Azure, such as by changing runtime.os from windows to linux before initial deployment. Maven 플러그 인에서 지원하는 전체 설정 목록은 구성 세부 정보를 참조하세요.For a complete list of settings supported by the Maven plug-in, see the configuration details.

FunctionTest.javaFunctionTest.java

원형 역시 함수의 단위 테스트를 생성합니다.The archetype also generates a unit test for your function. 바인딩을 추가하거나 프로젝트에 새 함수를 추가하도록 함수를 변경하는 경우에는 FunctionTest.java 파일에서 테스트도 수정해야 합니다.When you change your function to add bindings or add new functions to the project, you'll also need to modify the tests in the FunctionTest.java file.

__init__.py__init__.py

__init__.py에는 function.json의 구성에 따라 트리거되는 main() Python 함수가 포함되어 있습니다.__init__.py contains a main() Python function that's triggered according to the configuration in function.json.

import logging

import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
             status_code=200
        )

HTTP 트리거의 경우 함수는 function.json에 정의된 req 변수에 요청 데이터를 받습니다.For an HTTP trigger, the function receives request data in the variable req as defined in function.json. reqazure.functions.HttpRequest 클래스의 인스턴스입니다.req is an instance of the azure.functions.HttpRequest class. function.json$return으로 정의되는 반환 개체는 azure.functions.HttpResponse 클래스의 인스턴스입니다.The return object, defined as $return in function.json, is an instance of azure.functions.HttpResponse class. 자세한 내용은 Azure Functions HTTP 트리거 및 바인딩을 참조하세요.To learn more, see Azure Functions HTTP triggers and bindings.

index.jsindex.js

index.jsfunction.json의 구성에 따라 트리거되는 함수를 내보냅니다.index.js exports a function that's triggered according to the configuration in function.json.

module.exports = async function (context, req) {
    context.log('JavaScript 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
    };
}

HTTP 트리거의 경우 함수는 function.json에 정의된 req 변수에 요청 데이터를 받습니다.For an HTTP trigger, the function receives request data in the variable req as defined in function.json. function.json$return으로 정의된 반환 개체는 응답입니다.The return object, defined as $return in function.json, is the response. 자세한 내용은 Azure Functions HTTP 트리거 및 바인딩을 참조하세요.To learn more, see Azure Functions HTTP triggers and bindings.

index.tsindex.ts

index.tsfunction.json의 구성에 따라 트리거되는 함수를 내보냅니다.index.ts exports a function that's triggered according to the configuration in function.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 변수에 요청 데이터를 받습니다.For an HTTP trigger, the function receives request data in the variable req of type HttpRequest as defined in function.json. function.json$return으로 정의된 반환 개체는 응답입니다.The return object, defined as $return in function.json, is the response.

run.ps1run.ps1

run.ps1function.json의 구성에 따라 트리거되는 함수 스크립트를 정의합니다.run.ps1 defines a function script that's triggered according to the configuration in function.json.

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

$body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."

if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

HTTP 트리거의 경우 함수는 function.json에 정의된 $Request 매개 변수에 전달된 요청 데이터를 받습니다.For an HTTP trigger, the function receives request data passed to the $Request param defined in function.json. function.jsonResponse로 정의된 반환 개체는 Push-OutputBinding cmdlet에 응답으로 전달됩니다.The return object, defined as Response in function.json, is passed to the Push-OutputBinding cmdlet as the response.

function.jsonfunction.json

function.json은 트리거 형식을 포함하여 함수의 입력 및 출력 bindings를 정의하는 구성 파일입니다.function.json is a configuration file that defines the input and output bindings for the function, including the trigger type.

원하는 경우 다른 Python 파일을 호출하도록 scriptFile을 변경할 수 있습니다.You can change scriptFile to invoke a different Python file if desired.

{
    "scriptFile": "__init__.py",
    "bindings": [
        {
            "authLevel": "function",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "http",
            "direction": "out",
            "name": "$return"
        }
    ]
}
{
    "bindings": [
        {
            "authLevel": "function",
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "http",
            "direction": "out",
            "name": "res"
        }
    ]
}
{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}

각 바인딩에는 명령, 형식 및 고유한 이름이 필요합니다.Each binding requires a direction, a type, and a unique name. HTTP 트리거의 입력 바인딩은 httpTrigger 형식이고, 출력 바인딩은 http 형식입니다.The HTTP trigger has an input binding of type httpTrigger and output binding of type http.

로컬에서 함수 실행Run the function locally

LocalFunctionProj 폴더에서 로컬 Azure Functions 런타임 호스트를 시작하여 함수를 실행합니다.Run your function by starting the local Azure Functions runtime host from the LocalFunctionProj folder:

func start
npm install
npm start
mvn clean package 
mvn azure-functions:run

출력의 끝 부분에 다음 줄이 표시됩니다.Toward the end of the output, the following lines should appear:

...

Now listening on: http://0.0.0.0:7071
Application started. Press Ctrl+C to shut down.

Http Functions:

        HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
...

참고

HttpExample이 아래와 같이 표시되지 않으면 프로젝트의 루트 폴더 외부에서 호스트를 시작했을 가능성이 높습니다.If HttpExample doesn't appear as shown below, you likely started the host from outside the root folder of the project. 이 경우 Ctrl+C를 사용하여 호스트를 중지하고, 프로젝트의 루트 폴더로 이동하여 이전 명령을 다시 실행합니다.In that case, use Ctrl+C to stop the host, navigate to the project's root folder, and run the previous command again.

이 출력에서 HttpExample 함수의 URL을 브라우저로 복사하고 ?name=<your-name> 쿼리 문자열을 추가하여 전체 URL을 http://localhost:7071/api/HttpExample?name=Functions와 같이 만듭니다.Copy the URL of your HttpExample function from this output to a browser and append the query string ?name=<your-name>, making the full URL like http://localhost:7071/api/HttpExample?name=Functions. 브라우저에서 Hello Functions와 같은 메시지가 표시됩니다.The browser should display a message like Hello Functions:

브라우저에서 로컬로 실행되는 함수의 결과

프로젝트를 시작한 터미널에도 요청 시 로그 출력이 표시됩니다.The terminal in which you started your project also shows log output as you make requests.

준비가 되면 Ctrl+C를 사용하고 y를 선택하여 함수 호스트를 중지합니다.When you're ready, use Ctrl+C and choose y to stop the functions host.

함수를 지원하는 Azure 리소스 만들기Create supporting Azure resources for your function

함수 코드를 Azure에 배포하기 전에 다음 세 가지 리소스를 만들어야 합니다.Before you can deploy your function code to Azure, you need to create three resources:

  • 리소스 그룹 - 관련 리소스에 대한 논리 컨테이너입니다.A resource group, which is a logical container for related resources.
  • 스토리지 계정 - 프로젝트에 대한 상태 및 기타 정보를 유지 관리합니다.A Storage account, which maintains state and other information about your projects.
  • 함수 앱 - 함수 코드를 실행할 수 있는 환경을 제공합니다.A function app, which provides the environment for executing your function code. 함수 앱은 로컬 함수 프로젝트에 매핑되며, 함수를 논리적 단위로 그룹화하여 리소스를 더 쉽게 관리, 배포 및 공유할 수 있습니다.A function app maps to your local function project and lets you group functions as a logical unit for easier management, deployment, and sharing of resources.

다음 Azure CLI 명령을 사용하여 이러한 항목을 만듭니다.Use the following Azure CLI commands to create these items. 각 명령은 완료 시 JSON 출력을 제공합니다.Each command provides JSON output upon completion.

아직 로그인하지 않은 경우 az login 명령을 사용하여 Azure에 로그인합니다.If you haven't done so already, sign in to Azure with the az login command:

az login

az group create 명령을 사용하여 리소스 그룹을 만듭니다.Create a resource group with the az group create command. 다음 예제에서는 AzureFunctionsQuickstart-rg라는 리소스 그룹을 westeurope 지역에 만듭니다.The following example creates a resource group named AzureFunctionsQuickstart-rg in the westeurope region. (일반적으로 az account list-locations 명령에서 사용 가능한 지역을 사용하여 리소스 그룹과 리소스를 가까운 지역에 만듭니다.)(You generally create your resource group and resources in a region near you, using an available region from the az account list-locations command.)

az group create --name AzureFunctionsQuickstart-rg --location westeurope

참고

Linux 및 Windows 앱을 동일한 리소스 그룹에 호스트할 수 없습니다.You can't host Linux and Windows apps in the same resource group. Windows 함수 앱 또는 웹앱이 포함된 AzureFunctionsQuickstart-rg이라는 기존 리소스 그룹이 있는 경우 다른 리소스 그룹을 사용해야 합니다.If you have an existing resource group named AzureFunctionsQuickstart-rg with a Windows function app or web app, you must use a different resource group.

az storage account create 명령을 사용하여 범용 스토리지 계정을 리소스 그룹 및 지역에 만듭니다.Create a general-purpose storage account in your resource group and region by using the az storage account create command. 다음 예제에서 <STORAGE_NAME>을 적절하고 전역적으로 고유한 이름으로 바꿉니다.In the following example, replace <STORAGE_NAME> with a globally unique name appropriate to you. 이름은 3~24자의 숫자와 소문자만 포함해야 합니다.Names must contain three to 24 characters numbers and lowercase letters only. Standard_LRS는 범용 계정을 지정하며, Functions로 지원됩니다.Standard_LRS specifies a general-purpose account, which is supported by Functions.

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group AzureFunctionsQuickstart-rg --sku Standard_LRS

이 빠른 시작에 대해 스토리지 계정은 약간의 비용(몇 USD 센트)만 발생합니다.The storage account incurs only a few cents (USD) for this quickstart.

az functionapp create 명령을 사용하여 함수 앱을 만듭니다.Create the function app using the az functionapp create command. 다음 예제에서 <STORAGE_NAME>을 이전 단계에서 사용한 계정의 이름으로 바꾸고, <APP_NAME>을 적절하고 전역적으로 고유한 이름으로 바꿉니다.In the following example, replace <STORAGE_NAME> with the name of the account you used in the previous step, and replace <APP_NAME> with a globally unique name appropriate to you. <APP_NAME>은 함수 앱의 기본 DNS 도메인이기도 합니다.The <APP_NAME> is also the default DNS domain for the function app.

Python 3.8을 사용하는 경우 --runtime-version3.8로 변경하고 --functions_version3으로 변경합니다.If you are using Python 3.8, change --runtime-version to 3.8 and --functions_version to 3.

Python 3.6을 사용하는 경우 --runtime-version3.6으로 변경합니다.If you are using Python 3.6, change --runtime-version to 3.6.

az functionapp create --resource-group AzureFunctionsQuickstart-rg --os-type Linux --consumption-plan-location westeurope --runtime python --runtime-version 3.7 --functions-version 2 --name <APP_NAME> --storage-account <STORAGE_NAME>

Node.js 8을 사용하는 경우 --runtime-version8로 변경합니다.If you are using Node.js 8, also change --runtime-version to 8.

az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location westeurope --runtime node --runtime-version 10 --functions-version 2 --name <APP_NAME> --storage-account <STORAGE_NAME>
az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location westeurope --runtime dotnet --functions-version 2 --name <APP_NAME> --storage-account <STORAGE_NAME>
az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location westeurope --runtime powershell --functions-version 2 --name <APP_NAME> --storage-account <STORAGE_NAME>

이 명령은 Azure Functions 소비 계획에 따라 지정된 언어 런타임을 실행하는 함수 앱을 만듭니다. 여기서 발생하는 사용량에 대한 비용은 무료입니다.This command creates a function app running in your specified language runtime under the Azure Functions Consumption Plan, which is free for the amount of usage you incur here. 또한 이 명령은 동일한 리소스 그룹에 연결된 Azure Application Insights 인스턴스를 프로비저닝하여 함수 앱을 모니터링하고 로그를 볼 수 있습니다.The command also provisions an associated Azure Application Insights instance in the same resource group, with which you can monitor your function app and view logs. 자세한 내용은 Azure Functions 모니터링을 참조하세요.For more information, see Monitor Azure Functions. 인스턴스를 활성화할 때까지 비용이 발생하지 않습니다.The instance incurs no costs until you activate it.

Azure에 함수 프로젝트 배포Deploy the function project to Azure

Core Tools를 사용하여 Azure에 프로젝트를 배포하기 전에 TypeScript 소스 파일에서 프로덕션이 준비된 JavaScript 파일 빌드를 만듭니다.Before you use Core Tools to deploy your project to Azure, you create a production-ready build of JavaScript files from the TypeScript source files.

다음 명령은 배포를 위한 TypeScript 프로젝트를 준비합니다.The following command prepares your TypeScript project for deployment:

npm run build:production 

이제 필요한 리소스가 있으면 func azure functionapp publish 명령을 사용하여 로컬 함수 프로젝트를 Azure의 함수 앱에 배포할 수 있습니다.With the necessary resources in place, you're now ready to deploy your local functions project to the function app in Azure by using the func azure functionapp publish command. 다음 예제에서 <APP_NAME>을 앱 이름으로 바꿉니다.In the following example, replace <APP_NAME> with the name of your app.

func azure functionapp publish <APP_NAME>

"... 이름의 앱을 찾을 수 없습니다."라는 오류가 표시되면 Azure에서 이전 az functionapp create 명령 후에 앱을 완전히 초기화하지 않았을 수 있으므로 몇 초 정도 기다렸다가 다시 시도하세요.If you see the error, "Can't find app with name ...", wait a few seconds and try again, as Azure may not have fully initialized the app after the previous az functionapp create command.

publish 명령은 다음 출력과 비슷한 결과를 표시합니다(간단히 하기 위해 잘랐음).The publish command shows results similar to the following output (truncated for simplicity):

...

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에 함수 프로젝트 배포Deploy the function project to Azure

함수 앱 및 관련 리소스는 함수 프로젝트를 처음 배포할 때 Azure에 생성됩니다.A function app and related resources are created in Azure when you first deploy your functions project. 앱을 호스트하기 위해 만든 Azure 리소스의 설정은 pom.xml 파일에 정의됩니다.Settings for the Azure resources created to host your app are defined in the pom.xml file. 이 문서에서는 기본값을 적용합니다.In this article, you'll accept the defaults.

Windows 대신 Linux에서 실행되는 함수 앱을 만들려면 pom.xml 파일의 runtime.os 요소를 windows에서 linux로 변경합니다.To create a function app running on Linux instead of Windows, change the runtime.os element in the pom.xml file from windows to linux. 사용 플랜에서 Linux를 실행할 수 있는 지역은 여기서 확인할 수 있습니다.Running Linux in a consumption plan is supported in these regions. Linux에서 실행되는 앱과 Windows에서 실행되는 앱이 동일한 리소스 그룹에 있으면 안 됩니다.You can't have apps that run on Linux and apps that run on Windows in the same resource group.

배포하기 전에 az login Azure CLI 명령을 사용하여 Azure 구독에 로그인합니다.Before you can deploy, use the az login Azure CLI command to sign in to your Azure subscription.

az login

다음 명령을 사용하여 프로젝트를 새 함수 앱에 배포합니다.Use the following command to deploy your project to a new function app.

mvn azure-functions:deploy

그러면 Azure에서 다음 리소스가 생성됩니다.This creates the following resources in Azure:

  • 리소스 그룹Resource group. 이름은 _java-functions-group_입니다.Named as java-functions-group.
  • Storage 계정Storage account. 함수에 필요합니다.Required by Functions. 이름은 스토리지 계정 이름 요구 사항에 따라 임의로 생성됩니다.The name is generated randomly based on Storage account name requirements.
  • 호스팅 계획.Hosting plan. westus 지역의 함수 앱에 대한 서버리스 호스팅입니다.Serverless hosting for your function app in the westus region. 이름은 _java-functions-app-service-plan_입니다.The name is java-functions-app-service-plan.
  • 함수 앱Function app. 함수 앱은 함수에 대한 배포 및 실행 단위입니다.A function app is the deployment and execution unit for your functions. 이름은 _artifactId_에 따라 임의로 생성된 이름에 임의로 생성된 번호를 붙여서 지정됩니다.The name is randomly generated based on your your artifactId, appended with a randomly generated number.

배포에서는 프로젝트 파일을 패키징한 후 zip 배포를 사용하여 새 함수 앱에 배포합니다.The deployment packages the project files and deploys them to the new function app using zip deployment. 코드는 Azure의 배포 패키지에서 실행됩니다.The code runs from the deployment package in Azure.

Azure에서 함수 호출Invoke the function on Azure

함수에서 HTTP 트리거를 사용하므로 브라우저 또는 도구(예: curl)를 사용하여 URL에 대한 HTTP 요청을 수행하여 호출합니다.Because your function uses an HTTP trigger, you invoke it by making an HTTP request to its URL in the browser or with a tool like curl. 두 경우 모두에서 code URL 매개 변수는 함수 엔드포인트의 호출 권한을 부여하는 고유한 함수 키입니다.In both instances, the code URL parameter is your unique function key that authorizes the invocation of your function endpoint.

publish 명령의 출력에 표시된 호출 URL 전체를 브라우저 주소 표시줄에 복사하여 &name=Functions 쿼리 매개 변수를 추가합니다.Copy the complete Invoke URL shown in the output of the publish command into a browser address bar, appending the query parameter &name=Functions. 브라우저에서 함수를 로컬로 실행했을 때와 비슷한 출력이 표시됩니다.The browser should display similar output as when you ran the function locally.

브라우저에서 보여 주는 Azure에서 실행되는 함수의 출력

게시된 함수 앱의 근 실시간 로그를 보려면 Application Insights 라이브 메트릭 스트림을 사용합니다.To view near real-time logs for a published function app, use the Application Insights Live Metrics Stream.

다음 명령을 실행하여 브라우저에서 라이브 메트릭 스트림을 엽니다.Run the following command to open the live metrics stream in a browser.

func azure functionapp logstream <APP_NAME> --browser

리소스 정리Clean up resources

다음 Azure Storage 큐 출력 바인딩 추가 단계로 계속 진행하는 경우 이미 수행한 작업을 기반으로 하여 빌드되는 모든 리소스를 그대로 유지합니다.If you continue to the next step, Add an Azure Storage queue output binding, keep all your resources in place as you'll build on what you've already done.

그렇지 않으면 추가 비용이 발생하지 않도록 다음 명령을 사용하여 리소스 그룹 및 포함된 모든 리소스를 삭제합니다.Otherwise, use the following command to delete the resource group and all its contained resources to avoid incurring further costs.

az group delete --name AzureFunctionsQuickstart-rg
az group delete --name java-functions-group

가상 환경을 종료하려면 deactivate를 실행하세요.To exit the virtual environment, run deactivate.

다음 단계Next steps