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

이 문서에서는 명령줄 도구를 사용하여 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. 이 빠른 시작을 완료하면 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.

사전 요구 사항Prerequisites

필수 구성 요소 확인Prerequisite check

  1. 터미널 또는 명령 창에서 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.
  2. az --version을 실행하여 Azure CLI 버전이 2.0.76 이상인지 확인합니다.Run az --version to check that the Azure CLI version is 2.0.76 or later.
  3. az login을 실행하여 Azure에 로그인하고 활성 구독을 확인합니다.Run az login to sign in to Azure and verify an active subscription.
  4. python --version(Linux/MacOS) 또는 py --version(Windows)을 실행하여 Python 버전 보고서 3.7.x를 확인합니다.Run python --version (Linux/MacOS) or py --version (Windows) to check your Python version reports 3.7.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.7을 사용해야 합니다.Be sure to use Python 3.7, which is 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. (가상 환경을 종료하려면 deactivate를 실행하세요.)(To exit the virtual environment, run deactivate.)

로컬 함수 프로젝트 만들기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.

  1. 가상 환경에서 func init 명령을 실행하여 지정된 런타임을 사용하여 함수 프로젝트를 LocalFunctionProj라는 폴더에 만듭니다.In the virtual environment, run the func init command to create a functions project in a folder named LocalFunctionProj with the specified runtime:

    func init LocalFunctionProj --python
    

    이 폴더에는 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.

    함수 프로젝트는 특정 런타임에 연결되므로 프로젝트의 모든 함수는 동일한 언어로 작성해야 합니다.Because a function project is tied to a specific runtime, all the functions in the project must be written with the same language.

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

    cd LocalFunctionProj
    
  3. 다음 명령을 사용하여 함수를 프로젝트에 추가합니다. 여기서 --name 인수는 함수의 고유 이름이고, --template 인수는 함수의 트리거를 지정합니다.Add a function to your project by using the following command, where the --name argument is the unique name of your function and the --template argument specifies the function's trigger. func new는 프로젝트의 선택한 언어에 적합한 코드 파일과 function.json이라는 구성 파일을 포함하는 함수 이름과 일치하는 하위 폴더를 만듭니다.func new create 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.

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

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

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

__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}!")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

HTTP 트리거의 경우 함수는 function.json에서 정의한 대로 req 변수의 요청 데이터를 받습니다.For 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.

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"
    }
  ]
}

각 바인딩에는 명령, 형식 및 고유한 이름이 필요합니다.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 런타임 호스트를 시작하여 함수를 시작합니다.Start the function by starting the local Azure Functions runtime host in the LocalFunctionProj folder:

func start

다음과 같은 출력이 표시됩니다.The following output should appear. (HttpExample이 아래와 같이 표시되지 않으면 HttpExample 폴더 내에서 호스트를 시작했을 가능성이 높습니다.(If HttpExample doesn't appear as shown below, you likely started the host from within the HttpExample folder. 이 경우 Ctrl+C를 사용하여 호스트를 중지하고, 부모 LocalFunctionProj 폴더로 이동하여 func start를 다시 실행합니다.)In that case, use Ctrl+C to stop the host, navigate to the parent LocalFunctionProj folder, and run func start again.)

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 함수의 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:

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

func start를 실행한 터미널에서도 요청 시 로그 출력이 표시됩니다.The terminal in which you ran func start also shows log output as you make requests.

준비가 되면 Ctrl+C를 사용하여 함수 호스트를 중지합니다.When you're ready, Ctrl+C 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.
  • Azure Storage 계정 - 프로젝트에 대한 상태 및 기타 정보를 유지 관리합니다.An Azure Storage account, which maintains state and other information about your projects.
  • Azure 함수 앱 - 함수 코드를 실행할 수 있는 환경을 제공합니다.An Azure functions 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 명령을 사용하여 만듭니다.You use Azure CLI commands to create these items. 각 명령은 완료 시 JSON 출력을 제공합니다.Each command provides JSON output upon completion.

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

    az login
    
  2. 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.

  3. 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는 일반적인 범용 계정을 지정합니다.Standard_LRS specifies a typical general-purpose account.

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

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

  4. az functionapp create 명령을 사용하여 Functions 앱을 만듭니다.Create the Functions 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.

    az functionapp create --resource-group AzureFunctionsQuickstart-rg --os-type Linux --consumption-plan-location westeurope --runtime python --name <app_name> --storage-account <storage_name>
    

    이 명령은 Azure Functions 소비 계획에 따라 지정된 언어 런타임을 실행하는 함수 앱을 만듭니다. 여기서 발생하는 사용량에 대한 비용은 무료입니다.This command creates a function app running the 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

이제 필요한 리소스가 있으면 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에서 함수 호출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 with your function endpoint.

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

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

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

리소스 정리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

다음 단계Next steps