Azure Functions Python 개발자 가이드Azure Functions Python developer guide

이 문서에서는 Python을 사용하여 Azure Functions를 개발하는 방법을 소개합니다.This article is an introduction to developing Azure Functions using Python. 아래 내용은 Azure Functions 개발자 가이드를 이미 읽었다고 가정합니다.The content below assumes that you've already read the Azure Functions developers guide.

Python 개발자는 다음 문서 중 하나에 관심이 있을 수도 있습니다.As a Python developer, you may also be interested in one of the following articles:

시작하기Getting started 개념Concepts 시나리오/샘플Scenarios/Samples

프로그래밍 모델Programming model

Azure Functions의 함수는 입력을 처리하고 출력을 생성하는 Python 스크립트의 상태 비저장 메서드여야 합니다.Azure Functions expects a function to be a stateless method in your Python script that processes input and produces output. 기본적으로 런타임은 메서드가 __init__.py 파일에서 main()이라는 글로벌 메서드로 구현될 것으로 예상합니다.By default, the runtime expects the method to be implemented as a global method called main() in the __init__.py file. 대체 진입점을 지정할 수도 있습니다.You can also specify an alternate entry point.

트리거 및 바인딩의 데이터는 function.json 파일에 정의된 name 속성을 사용하여 메서드 특성을 통해 함수에 바인딩됩니다.Data from triggers and bindings is bound to the function via method attributes using the name property defined in the function.json file. 예를 들어 아래의 function.jsonreq라는 HTTP 요청에 의해 트리거되는 단순 함수를 설명합니다.For example, the function.json below describes a simple function triggered by an HTTP request named req:

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

이 정의에 따라 함수 코드를 포함하는 __init__.py 파일은 다음 예제와 비슷합니다.Based on this definition, the __init__.py file that contains the function code might look like the following example:

def main(req):
    user = req.params.get('user')
    return f'Hello, {user}!'

또한 Python 형식 주석을 사용하여 함수에서 매개 변수 형식 및 반환 형식을 명시적으로 선언할 수 있습니다.You can also explicitly declare the attribute types and return type in the function using Python type annotations. 이렇게 하면 여러 Python 코드 편집기에서 제공하는 인텔리센스 및 자동 완성 기능을 사용할 수 있습니다.This helps you use the intellisense and autocomplete features provided by many Python code editors.

import azure.functions


def main(req: azure.functions.HttpRequest) -> str:
    user = req.params.get('user')
    return f'Hello, {user}!'

azure.functions.* 패키지에 포함된 Python 주석을 사용하여 입력 및 출력을 메서드에 바인딩합니다.Use the Python annotations included in the azure.functions.* package to bind input and outputs to your methods.

대체 진입점Alternate entry point

필요한 경우 function.json 파일에서 scriptFileentryPoint 속성을 지정하여 함수의 기본 동작을 변경할 수 있습니다.You can change the default behavior of a function by optionally specifying the scriptFile and entryPoint properties in the function.json file. 예를 들어 아래의 function.jsonmain.py 파일의 customentry() 메서드를 Azure 함수의 진입점으로 사용하도록 런타임에 지시합니다.For example, the function.json below tells the runtime to use the customentry() method in the main.py file, as the entry point for your Azure Function.

{
  "scriptFile": "main.py",
  "entryPoint": "customentry",
  "bindings": [
      ...
  ]
}

폴더 구조Folder structure

Python Functions 프로젝트에 권장하는 폴더 구조는 다음 예제와 같습니다.The recommended folder structure for a Python Functions project looks like the following example:

 <project_root>/
 | - .venv/
 | - .vscode/
 | - my_first_function/
 | | - __init__.py
 | | - function.json
 | | - example.py
 | - my_second_function/
 | | - __init__.py
 | | - function.json
 | - shared_code/
 | | - __init__.py
 | | - my_first_helper_function.py
 | | - my_second_helper_function.py
 | - tests/
 | | - test_my_second_function.py
 | - .funcignore
 | - host.json
 | - local.settings.json
 | - requirements.txt
 | - Dockerfile

기본 프로젝트 폴더 (<project_root>)에는 다음 파일이 포함 될 수 있습니다.The main project folder (<project_root>) can contain the following files:

  • local.settings.json: 로컬에서 실행될 때 앱 설정과 연결 문자열을 저장하는 데 사용됩니다.local.settings.json: Used to store app settings and connection strings when running locally. 이 파일은 Azure에 게시되지 않습니다.This file doesn't get published to Azure. 자세한 내용은 local.settings.file을 참조하세요.To learn more, see local.settings.file.
  • requirements.txt: Azure에 게시할 때 시스템이 설치 하는 Python 패키지 목록을 포함 합니다.requirements.txt: Contains the list of Python packages the system installs when publishing to Azure.
  • host.json: 함수 앱의 모든 함수에 영향을 주는 글로벌 구성 옵션이 포함됩니다.host.json: Contains global configuration options that affect all functions in a function app. 이 파일은 Azure에 게시됩니다.This file does get published to Azure. 로컬로 실행할 경우 일부 옵션이 지원되지 않습니다.Not all options are supported when running locally. 자세한 내용은 host.json을 참조하세요.To learn more, see host.json.
  • . vscode/: (선택 사항) 저장소 vscode 구성을 포함 합니다..vscode/: (Optional) Contains store VSCode configuration. 자세히 알아보려면 Vscode 설정을 참조 하세요.To learn more, see VSCode setting.
  • . venv/: (선택 사항) 로컬 개발에 사용 되는 Python 가상 환경을 포함 합니다..venv/: (Optional) Contains a Python virtual environment used by local development.
  • Dockerfile: (선택 사항) 사용자 지정 컨테이너에서 프로젝트를 게시할 때 사용 됩니다.Dockerfile: (Optional) Used when publishing your project in a custom container.
  • 테스트/: (선택 사항) 함수 앱의 테스트 사례를 포함 합니다.tests/: (Optional) Contains the test cases of your function app.
  • . funcignore: (선택 사항) Azure에 게시 되지 않아야 하는 파일을 선언 합니다..funcignore: (Optional) Declares files that shouldn't get published to Azure. 일반적으로이 파일에는 .vscode/ 편집기 설정을 무시 하 고, .venv/ 로컬 Python 가상 환경을 무시 하 tests/ 고, 테스트 사례를 무시 하 고, local.settings.json 로컬 앱 설정을 게시 하지 않도록 하는가 포함 됩니다.Usually, this file contains .vscode/ to ignore your editor setting, .venv/ to ignore local Python virtual environment, tests/ to ignore test cases, and local.settings.json to prevent local app settings being published.

각 함수에는 자체 코드 파일과 바인딩 구성 파일(function.json)이 있습니다.Each function has its own code file and binding configuration file (function.json).

Azure의 함수 앱에 프로젝트를 배포할 때 주 프로젝트 (<project_root>) 폴더의 전체 콘텐츠는 패키지에 포함 되어야 합니다. 즉, host.json 패키지 루트에 있어야 합니다.When deploying your project to a function app in Azure, the entire contents of the main project (<project_root>) folder should be included in the package, but not the folder itself, which means host.json should be in the package root. 이 예제에서는 다른 함수와 함께 폴더의 테스트를 유지 관리 하는 것이 좋습니다 tests/ .We recommend that you maintain your tests in a folder along with other functions, in this example tests/. 자세한 내용은 단위 테스트를 참조하세요.For more information, see Unit Testing.

가져오기 동작Import behavior

절대 참조와 상대 참조를 모두 사용 하 여 함수 코드에서 모듈을 가져올 수 있습니다.You can import modules in your function code using both absolute and relative references. 위에 표시 된 폴더 구조를 기반으로 다음 가져오기는 함수 파일 내에서 작업 <project_root> \my _ first _ 함수 \ _ _ init _ _ . py:Based on the folder structure shown above, the following imports work from within the function file <project_root>\my_first_function\__init__.py:

from shared_code import my_first_helper_function #(absolute)
import shared_code.my_second_helper_function #(absolute)
from . import example #(relative)

참고

Shared_code/ 폴더는 _ _ _ _ 절대 가져오기 구문을 사용할 때 Python 패키지로 표시 하는 py 파일을 포함 해야 합니다.The shared_code/ folder needs to contain an __init__.py file to mark it as a Python package when using absolute import syntax.

다음 _ _ 앱 _ _ 가져오기 및 상위 수준 상대적 가져오기는 정적 형식 검사기에서 지원 되지 않고 Python 테스트 프레임 워크에서 지원 되지 않으므로 더 이상 사용 되지 않습니다.The following __app__ import and beyond top-level relative import are deprecated, since it is not supported by static type checker and not supported by Python test frameworks:

from __app__.shared_code import my_first_helper_function #(deprecated __app__ import)
from ..shared_code import my_first_helper_function #(deprecated beyond top-level relative import)

트리거 및 입력Triggers and Inputs

입력은 Azure Functions에서 트리거 입력과 추가 입력의 두 가지 범주로 나뉩니다.Inputs are divided into two categories in Azure Functions: trigger input and additional input. function.json에서는 둘이 서로 다르지만, Python 코드에서는 사용법이 동일합니다.Although they are different in the function.json file, usage is identical in Python code. 트리거 및 입력 소스의 연결 문자열 또는 비밀은 로컬로 실행할 때에는 local.settings.json 파일의 값에 매핑되고, Azure에서 실행할 때에는 애플리케이션 설정에 매핑됩니다.Connection strings or secrets for trigger and input sources map to values in the local.settings.json file when running locally, and the application settings when running in Azure.

예를 들어 다음 코드는 둘 사이의 차이점을 보여줍니다.For example, the following code demonstrates the difference between the two:

// function.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "authLevel": "anonymous",
      "route": "items/{id}"
    },
    {
      "name": "obj",
      "direction": "in",
      "type": "blob",
      "path": "samples/{id}",
      "connection": "AzureWebJobsStorage"
    }
  ]
}
// local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": "<azure-storage-connection-string>"
  }
}
# __init__.py
import azure.functions as func
import logging


def main(req: func.HttpRequest,
         obj: func.InputStream):

    logging.info(f'Python HTTP triggered function processed: {obj.read()}')

함수가 호출되면 HTTP 요청이 req로 함수에 전달됩니다.When the function is invoked, the HTTP request is passed to the function as req. 항목은 경로 URL의 ID 를 기반으로 Azure Blob Storage에서 검색되고 함수 본문에서 obj로 제공됩니다.An entry will be retrieved from the Azure Blob Storage based on the ID in the route URL and made available as obj in the function body. 여기서 지정된 스토리지 계정은 AzureWebJobsStorage 앱 설정에 있는 연결 문자열로, 함수 앱에서 사용하는 것과 동일한 스토리지 계정입니다.Here, the storage account specified is the connection string found in the AzureWebJobsStorage app setting, which is the same storage account used by the function app.

outputsOutputs

출력은 반환 값 및 출력 매개 변수 둘 다로 표현될 수 있습니다.Output can be expressed both in return value and output parameters. 출력이 하나만 있는 경우 반환 값을 사용하는 것이 좋습니다.If there's only one output, we recommend using the return value. 다중 출력의 경우 출력 매개 변수를 사용해야 합니다.For multiple outputs, you'll have to use output parameters.

함수의 반환 값을 출력 바인딩의 값으로 사용하려면 바인딩의 name 속성을 function.json$return으로 설정해야 합니다.To use the return value of a function as the value of an output binding, the name property of the binding should be set to $return in function.json.

다중 출력을 생성하려면 azure.functions.Out 인터페이스에서 제공하는 set() 메서드를 사용하여 바인딩에 값을 할당합니다.To produce multiple outputs, use the set() method provided by the azure.functions.Out interface to assign a value to the binding. 예를 들어 다음 함수는 메시지를 큐로 푸시하고 HTTP 응답도 반환할 수 있습니다.For example, the following function can push a message to a queue and also return an HTTP response.

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "authLevel": "anonymous"
    },
    {
      "name": "msg",
      "direction": "out",
      "type": "queue",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "$return",
      "direction": "out",
      "type": "http"
    }
  ]
}
import azure.functions as func


def main(req: func.HttpRequest,
         msg: func.Out[func.QueueMessage]) -> str:

    message = req.params.get('body')
    msg.set(message)
    return message

로깅Logging

함수 앱의 루트 logging 처리기를 통해 Azure Functions 런타임 로거에 액세스할 수 있습니다.Access to the Azure Functions runtime logger is available via a root logging handler in your function app. 이 로거는 Application Insights에 연결되어 있으며, 함수를 실행하는 동안 발생하는 경고 및 오류에 플래그를 지정할 수 있도록 합니다.This logger is tied to Application Insights and allows you to flag warnings and errors encountered during the function execution.

다음 예제는 HTTP 트리거를 통해 함수가 호출될 때 정보 메시지를 기록합니다.The following example logs an info message when the function is invoked via an HTTP trigger.

import logging


def main(req):
    logging.info('Python HTTP trigger function processed a request.')

다양한 추적 수준에서 콘솔에 쓸 수 있는 추가 로깅 메서드가 제공됩니다.Additional logging methods are available that let you write to the console at different trace levels:

방법Method DescriptionDescription
critical(_message_) 루트 로거에 위험 수준의 메시지를 기록합니다.Writes a message with level CRITICAL on the root logger.
error(_message_) 루트 로거에 오류 수준의 메시지를 기록합니다.Writes a message with level ERROR on the root logger.
warning(_message_) 루트 로거에 경고 수준의 메시지를 기록합니다.Writes a message with level WARNING on the root logger.
info(_message_) 루트 로거에 정보 수준의 메시지를 기록합니다.Writes a message with level INFO on the root logger.
debug(_message_) 루트 로거에 디버그 수준의 메시지를 기록합니다.Writes a message with level DEBUG on the root logger.

로깅에 대한 자세한 내용은 Azure Functions 모니터링을 참조하세요.To learn more about logging, see Monitor Azure Functions.

HTTP 트리거 및 바인딩HTTP Trigger and bindings

HTTP 트리거는 파일의 function.js에 정의 되어 있습니다.The HTTP trigger is defined in the function.json file. 바인딩의 name은 함수의 명명된 매개 변수와 일치해야 합니다.The name of the binding must match the named parameter in the function. 이전 예제에서는 바인딩 이름 req를 사용합니다.In the previous examples, a binding name req is used. 이 매개 변수는 HttpRequest 개체이며 HttpResponse 개체가 반환됩니다.This parameter is an HttpRequest object, and an HttpResponse object is returned.

HttpRequest 개체에서 요청 헤더, 쿼리 매개 변수, 경로 매개 변수 및 메시지 본문을 가져올 수 있습니다.From the HttpRequest object, you can get request headers, query parameters, route parameters, and the message body.

다음 예제는 Python용 HTTP 트리거 템플릿에서 가져온 것입니다.The following example is from the HTTP trigger template for Python.

def main(req: func.HttpRequest) -> func.HttpResponse:
    headers = {"my-http-header": "some-value"}

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

이 함수에서 name 쿼리 매개 변수의 값은 HttpRequest 개체의 params 매개 변수에서 가져옵니다.In this function, the value of the name query parameter is obtained from the params parameter of the HttpRequest object. JSON으로 인코딩된 메시지 본문은 get_json 메서드를 사용하여 읽습니다.The JSON-encoded message body is read using the get_json method.

마찬가지로, 반환된 HttpResponse 개체의 응답 메시지에 대한 status_codeheaders를 설정할 수 있습니다.Likewise, you can set the status_code and headers for the response message in the returned HttpResponse object.

크기 조정 및 성능Scaling and Performance

Python 함수 앱에 대 한 크기 조정 및 성능 모범 사례는 python 규모 및 성능 문서를 참조 하세요.For scaling and performance best practices for Python function apps, please refer to the Python scale and performance article.

ContextContext

실행 중에 함수의 호출 컨텍스트를 가져오려면 해당 서명에 context 인수를 포함해야 합니다.To get the invocation context of a function during execution, include the context argument in its signature.

다음은 그 예입니다.For example:

import azure.functions


def main(req: azure.functions.HttpRequest,
         context: azure.functions.Context) -> str:
    return f'{context.invocation_id}'

Context 클래스에는 다음과 같은 문자열 특성이 있습니다.The Context class has the following string attributes:

function_directory 함수가 실행되는 디렉터리입니다.function_directory The directory in which the function is running.

function_name 함수의 이름입니다.function_name Name of the function.

invocation_id 현재 함수 호출의 ID입니다.invocation_id ID of the current function invocation.

글로벌 변수Global variables

나중에 실행할 수 있도록 앱 상태가 유지된다는 보장은 없습니다.It is not guaranteed that the state of your app will be preserved for future executions. 그러나 Azure Functions 런타임은 동일한 앱을 여러 차례 실행할 때 종종 동일한 프로세스를 재사용합니다.However, the Azure Functions runtime often reuses the same process for multiple executions of the same app. 비용이 많이 드는 컴퓨팅 결과를 캐시하려면 글로벌 변수로 선언하면 됩니다.In order to cache the results of an expensive computation, declare it as a global variable.

CACHED_DATA = None


def main(req):
    global CACHED_DATA
    if CACHED_DATA is None:
        CACHED_DATA = load_json()

    # ... use CACHED_DATA in code

환경 변수Environment variables

Functions에서 서비스 연결 문자열 같은 애플리케이션 설정은 실행 중에 환경 변수로 공개됩니다.In Functions, application settings, such as service connection strings, are exposed as environment variables during execution. import os를 선언한 다음, setting = os.environ["setting-name"]을 사용하여 이러한 설정에 액세스할 수 있습니다.You can access these settings by declaring import os and then using, setting = os.environ["setting-name"].

다음 예제에서는 myAppSetting이라는 키가 있는 애플리케이션 설정을 가져옵니다.The following example gets the application setting, with the key named myAppSetting:

import logging
import os
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:

    # Get the setting named 'myAppSetting'
    my_app_setting_value = os.environ["myAppSetting"]
    logging.info(f'My app setting value:{my_app_setting_value}')

로컬에서 개발하는 경우 애플리케이션 설정은 local.settings.json 파일에 유지됩니다.For local development, application settings are maintained in the local.settings.json file.

Python 버전Python version

Azure Functions에서 지원하는 Python 버전은 다음과 같습니다.Azure Functions supports the following Python versions:

Functions 버전Functions version Python* 버전Python* versions
3.x3.x 3.9 (미리 보기)3.9 (Preview)
3.83.8
3.73.7
3.63.6
2.x2.x 3.73.7
3.63.6

*공식 CPython 배포판*Official CPython distributions

Azure에서 함수 앱을 만들 때 특정 Python 버전을 요청하려면 az functionapp create 명령의 --runtime-version 옵션을 사용합니다.To request a specific Python version when you create your function app in Azure, use the --runtime-version option of the az functionapp create command. Functions 런타임 버전은 --functions-version 옵션을 통해 설정됩니다.The Functions runtime version is set by the --functions-version option. Python 버전은 함수 앱을 만들 때 설정되며 변경할 수 없습니다.The Python version is set when the function app is created and can't be changed.

로컬로 실행하는 경우 런타임에서는 사용 가능한 Python 버전을 사용합니다.When running locally, the runtime uses the available Python version.

패키지 관리Package management

Azure Functions Core Tools 또는 Visual Studio Code를 사용하여 로컬에서 개발하는 경우 필요한 패키지의 이름과 버전을 requirements.txt 파일에 추가하고 pip를 사용하여 설치합니다.When developing locally using the Azure Functions Core Tools or Visual Studio Code, add the names and versions of the required packages to the requirements.txt file and install them using pip.

예를 들어 다음 요구 사항 파일 및 pip 명령을 사용하여 PyPI에서 requests 패키지를 설치할 수 있습니다.For example, the following requirements file and pip command can be used to install the requests package from PyPI.

requests==2.19.1
pip install -r requirements.txt

Azure에 게시Publishing to Azure

게시할 준비가 되면 공개적으로 제공되는 모든 종속성이 프로젝트 디렉터리의 루트에 있는 requirements.txt 파일에 나열되는지 확인합니다.When you're ready to publish, make sure that all your publicly available dependencies are listed in the requirements.txt file, which is located at the root of your project directory.

가상 환경 폴더를 비롯하여 게시에서 제외되는 프로젝트 파일과 폴더는 .funcignore 파일에 나열됩니다.Project files and folders that are excluded from publishing, including the virtual environment folder, are listed in the .funcignore file.

Azure에 Python 프로젝트를 게시 하는 데 지원 되는 세 가지 빌드 작업은 원격 빌드, 로컬 빌드 및 사용자 지정 종속성을 사용한 빌드입니다.There are three build actions supported for publishing your Python project to Azure: remote build, local build, and builds using custom dependencies.

또한 Azure Pipelines를 사용 하 여 종속성을 빌드하고 CD (지속적인 업데이트)를 사용 하 여 게시할 수 있습니다.You can also use Azure Pipelines to build your dependencies and publish using continuous delivery (CD). 자세히 알아보려면 Azure DevOps를 사용 하 여 지속적인업데이트를 참조 하세요.To learn more, see Continuous delivery by using Azure DevOps.

원격 빌드Remote build

원격 빌드를 사용 하는 경우 서버에서 복원 된 종속성과 기본 종속성이 프로덕션 환경과 일치 합니다.When using remote build, dependencies restored on the server and native dependencies match the production environment. 이로 인해 더 작은 배포 패키지가 업로드 됩니다.This results in a smaller deployment package to upload. Windows에서 Python 앱을 개발할 때 원격 빌드를 사용 합니다.Use remote build when developing Python apps on Windows. 프로젝트에 사용자 지정 종속성이 있는 경우 추가 인덱스 URL로 원격 빌드를 사용할수 있습니다.If your project has custom dependencies, you can use remote build with extra index URL.

종속성은 requirements.txt 파일의 내용에 따라 원격으로 가져옵니다.Dependencies are obtained remotely based on the contents of the requirements.txt file. 원격 빌드는 권장 빌드 방법입니다.Remote build is the recommended build method. 기본적으로 Azure Functions Core Tools는 다음과 같은 func azure functionapp publish 명령을 사용하여 Python 프로젝트를 Azure에 게시할 때 원격 빌드가 필요합니다.By default, the Azure Functions Core Tools requests a remote build when you use the following func azure functionapp publish command to publish your Python project to Azure.

func azure functionapp publish <APP_NAME>

<APP_NAME>을 Azure의 함수 앱 이름으로 바꾸어야 합니다.Remember to replace <APP_NAME> with the name of your function app in Azure.

Visual Studio Code용 Azure Functions 확장 역시 기본적으로 원격 빌드를 요청합니다.The Azure Functions Extension for Visual Studio Code also requests a remote build by default.

로컬 빌드Local build

종속성은 requirements.txt 파일의 내용에 따라 로컬로 가져옵니다.Dependencies are obtained locally based on the contents of the requirements.txt file. 다음 func azure functionapp publish 명령을 사용하여 로컬 빌드로 게시하면 원격 빌드를 차단할 수 있습니다.You can prevent doing a remote build by using the following func azure functionapp publish command to publish with a local build.

func azure functionapp publish <APP_NAME> --build local

<APP_NAME>을 Azure의 함수 앱 이름으로 바꾸어야 합니다.Remember to replace <APP_NAME> with the name of your function app in Azure.

--build local 옵션을 사용하면 requirements.txt 파일에서 프로젝트 종속성을 읽고 해당하는 종속 패키지를 로컬로 다운로드하여 설치합니다.Using the --build local option, project dependencies are read from the requirements.txt file and those dependent packages are downloaded and installed locally. 프로젝트 파일과 종속성은 로컬 컴퓨터에서 Azure로 배포됩니다.Project files and dependencies are deployed from your local computer to Azure. 결과적으로 더 큰 배포 패키지가 Azure에 업로드됩니다.This results in a larger deployment package being uploaded to Azure. 어떤 이유로 Core Tools가 requirements.txt 파일의 종속성이 얻을 수 없는 경우 사용자 지정 종속성 옵션을 사용해야 합니다.If for some reason, dependencies in your requirements.txt file can't be acquired by Core Tools, you must use the custom dependencies option for publishing.

Windows에서 로컬로 개발 하는 경우에는 로컬 빌드를 사용 하지 않는 것이 좋습니다.We don't recommend using local builds when developing locally on Windows.

사용자 지정 종속성Custom dependencies

프로젝트에는 Python 패키지 인덱스에서 종속성이 없는 경우 두 가지 방법으로 프로젝트를 빌드할 수 있습니다.When your project has dependencies not found in the Python Package Index, there are two ways to build the project. 빌드 메서드는 프로젝트를 빌드하는 방법에 따라 달라 집니다.The build method depends on how you build the project.

추가 인덱스 URL을 사용 하 여 원격 빌드Remote build with extra index URL

액세스할 수 있는 사용자 지정 패키지 인덱스에서 패키지를 사용할 수 있는 경우 원격 빌드를 사용 합니다.When your packages are available from an accessible custom package index, use a remote build. 게시 하기 전에 이라는 앱 설정을 만들어야 PIP_EXTRA_INDEX_URL 합니다.Before publishing, make sure to create an app setting named PIP_EXTRA_INDEX_URL. 이 설정의 값은 사용자 지정 패키지 인덱스의 URL입니다.The value for this setting is the URL of your custom package index. 이 설정을 사용 하면 옵션을 사용 하 여 원격 빌드가 실행 되도록 지시할 수 pip install --extra-index-url 있습니다.Using this setting tells the remote build to run pip install using the --extra-index-url option. 자세히 알아보려면 Python pip 설치 설명서를 참조 하세요.To learn more, see the Python pip install documentation.

추가 패키지 인덱스 Url을 사용 하 여 기본 인증 자격 증명을 사용할 수도 있습니다.You can also use basic authentication credentials with your extra package index URLs. 자세히 알아보려면 Python 설명서의 기본 인증 자격 증명 을 참조 하세요.To learn more, see Basic authentication credentials in Python documentation.

로컬 패키지 설치Install local packages

당사의 도구에서 공개적으로 제공하지 않는 패키지를 프로젝트에 사용하는 경우 해당 패키지를 __app__/.python_packages 디렉터리에 배치하면 앱에서 사용할 수 있습니다.If your project uses packages not publicly available to our tools, you can make them available to your app by putting them in the __app__/.python_packages directory. 게시하기 전에, 다음 명령을 실행하여 종속성을 로컬로 설치합니다.Before publishing, run the following command to install the dependencies locally:

pip install  --target="<PROJECT_DIR>/.python_packages/lib/site-packages"  -r requirements.txt

프로젝트 폴더에 종속성을 이미 설치 했으므로 사용자 지정 종속성을 사용 하는 경우 --no-build 게시 옵션을 사용 해야 합니다.When using custom dependencies, you should use the --no-build publishing option, since you have already installed the dependencies into the project folder.

func azure functionapp publish <APP_NAME> --no-build

<APP_NAME>을 Azure의 함수 앱 이름으로 바꾸어야 합니다.Remember to replace <APP_NAME> with the name of your function app in Azure.

단위 테스트Unit Testing

Python으로 작성된 함수는 다른 Python 코드와 마찬가지로 표준 테스트 프레임워크를 사용하여 테스트할 수 있습니다.Functions written in Python can be tested like other Python code using standard testing frameworks. 대부분의 바인딩에서 azure.functions 패키지로 적절한 클래스 인스턴스를 만들어 모의 입력 개체를 만들 수 있습니다.For most bindings, it's possible to create a mock input object by creating an instance of an appropriate class from the azure.functions package. azure.functions 패키지는 즉시 사용할 수 없으므로, 위의 패키지 관리 섹션에서 설명한 대로 requirements.txt 파일을 통해 설치해야 합니다.Since the azure.functions package is not immediately available, be sure to install it via your requirements.txt file as described in the package management section above.

예제로 my_second_function 다음은 HTTP 트리거 함수의 모의 테스트입니다.Take my_second_function as an example, following is a mock test of an HTTP triggered function:

먼저 <project_root>/my_second_function/function.js파일에 만들고이 함수를 http 트리거로 정의 해야 합니다.First we need to create <project_root>/my_second_function/function.json file and define this function as an http trigger.

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

이제 my_second_functionshared_code _second_helper_function 를 구현할 수 있습니다.Now, we can implement the my_second_function and the shared_code.my_second_helper_function.

# <project_root>/my_second_function/__init__.py
import azure.functions as func
import logging

# Use absolute import to resolve shared_code modules
from shared_code import my_second_helper_function

# Define an http trigger which accepts ?value=<int> query parameter
# Double the value and return the result in HttpResponse
def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Executing my_second_function.')

    initial_value: int = int(req.params.get('value'))
    doubled_value: int = my_second_helper_function.double(initial_value)

    return func.HttpResponse(
      body=f"{initial_value} * 2 = {doubled_value}",
      status_code=200
    )
# <project_root>/shared_code/__init__.py
# Empty __init__.py file marks shared_code folder as a Python package
# <project_root>/shared_code/my_second_helper_function.py

def double(value: int) -> int:
  return value * 2

Http 트리거에 대 한 테스트 사례 작성을 시작할 수 있습니다.We can start writing test cases for our http trigger.

# <project_root>/tests/test_my_second_function.py
import unittest

import azure.functions as func
from my_second_function import main

class TestFunction(unittest.TestCase):
    def test_my_second_function(self):
        # Construct a mock HTTP request.
        req = func.HttpRequest(
            method='GET',
            body=None,
            url='/api/my_second_function',
            params={'value': '21'})

        # Call the function.
        resp = main(req)

        # Check the output.
        self.assertEqual(
            resp.get_body(),
            b'21 * 2 = 42',
        )

.venvPython 가상 환경 내에서 즐겨 사용 하는 python 테스트 프레임 워크 (예:)를 설치 pip install pytest 합니다.Inside your .venv Python virtual environment, install your favorite Python test framework (e.g. pip install pytest). 단순히 pytest tests 를 실행 하 여 테스트 결과를 확인 합니다.Simply run pytest tests to check the test result.

임시 파일Temporary files

tempfile.gettempdir() 메서드는 임시 폴더를 반환하며, 이 폴더는 Linux에서 /tmp입니다.The tempfile.gettempdir() method returns a temporary folder, which on Linux is /tmp. 애플리케이션에서는 함수가 실행 중에 만들어서 사용하는 임시 파일을 이 디렉터리에 저장할 수 있습니다.Your application can use this directory to store temporary files generated and used by your functions during execution.

중요

임시 디렉터리에 기록된 파일은 호출 간에 유지되지 않을 수 있습니다.Files written to the temporary directory aren't guaranteed to persist across invocations. 스케일 아웃 도중에 임시 파일은 인스턴스 간에 공유되지 않습니다.During scale out, temporary files aren't shared between instances.

다음은 임시 디렉터리(/tmp)에 명명된 임시 파일을 만드는 예제입니다.The following example creates a named temporary file in the temporary directory (/tmp):

import logging
import azure.functions as func
import tempfile
from os import listdir

#---
   tempFilePath = tempfile.gettempdir()
   fp = tempfile.NamedTemporaryFile()
   fp.write(b'Hello world!')
   filesDirListInTemp = listdir(tempFilePath)

프로젝트 폴더와 다른 별도의 폴더에 테스트를 유지하는 것이 좋습니다.We recommend that you maintain your tests in a folder separate from the project folder. 이렇게 하면 앱에서 테스트 코드를 배포하는 일이 없습니다.This keeps you from deploying test code with your app.

사전 설치 된 라이브러리Preinstalled libraries

Python 함수 런타임과 함께 제공 되는 몇 가지 라이브러리가 있습니다.There are a few libraries come with the Python Functions runtime.

Python 표준 라이브러리Python Standard Library

Python 표준 라이브러리에는 각 Python 배포와 함께 제공 되는 기본 제공 Python 모듈 목록이 포함 되어 있습니다.The Python Standard Library contain a list of built-in Python modules that are shipped with each Python distribution. 이러한 라이브러리의 대부분은 파일 i/o와 같은 시스템 기능에 액세스 하는 데 도움이 됩니다.Most of these libraries help you access system functionality, like file I/O. Windows 시스템에서 이러한 라이브러리는 Python을 사용 하 여 설치 됩니다.On Windows systems, these libraries are installed with Python. Unix 기반 시스템에서 패키지 컬렉션에 의해 제공 됩니다.On the Unix-based systems, they are provided by package collections.

이러한 라이브러리의 전체 목록에 대 한 자세한 내용을 보려면 아래 링크를 방문 하세요.To view the full details of the list of these libraries, please visit the links below:

Azure Functions Python 작업자 종속성Azure Functions Python worker dependencies

함수 Python 작업자에는 특정 라이브러리 집합이 필요 합니다.The Functions Python worker requires a specific set of libraries. 함수에서 이러한 라이브러리를 사용할 수도 있지만 Python 표준의 일부가 아닙니다.You can also use these libraries in your functions, but they aren't a part of the Python standard. 함수가 이러한 라이브러리를 사용 하는 경우 Azure Functions 외부에서 실행 될 때 코드에서 사용 하지 못할 수 있습니다.If your functions rely on any of these libraries, they may not be available to your code when running outside of Azure Functions. Setup.py 파일의 install _ requires 섹션에서 종속성의 자세한 목록을 찾을 수 있습니다.You can find a detailed list of dependencies in the install_requires section in the setup.py file.

참고

함수 앱의 requirements.txt에 항목이 포함 되어 있는 경우 azure-functions-worker 제거 합니다.If your function app's requirements.txt contains an azure-functions-worker entry, remove it. 함수 작업자는 Azure Functions 플랫폼에 의해 자동으로 관리 되며 새로운 기능 및 버그 수정을 사용 하 여 정기적으로 업데이트 합니다.The functions worker is automatically managed by Azure Functions platform, and we regularly update it with new features and bug fixes. requirements.txt에 이전 버전의 작업자를 수동으로 설치 하면 예기치 않은 문제가 발생할 수 있습니다.Manually installing an old version of worker in requirements.txt may cause unexpected issues.

Python 라이브러리 Azure FunctionsAzure Functions Python library

모든 Python worker 업데이트에는 Azure Functions Python 라이브러리 (Azure. 함수)의 새 버전이 포함 되어 있습니다.Every Python worker update includes a new version of Azure Functions Python library (azure.functions). 이 접근 방식을 사용 하면 각 업데이트가 이전 버전과 호환 되므로 Python 함수 앱을 계속 해 서 업데이트할 수 있습니다.This approach makes it easier to continuously update your Python function apps, because each update is backwards-compatible. 이 라이브러리의 릴리스 목록은 azure-함수 PyPi에서 찾을 수 있습니다.A list of releases of this library can be found in azure-functions PyPi.

런타임 라이브러리 버전은 Azure에서 수정 되며 requirements.txt로 재정의할 수 없습니다.The runtime library version is fixed by Azure, and it can't be overridden by requirements.txt. azure-functionsrequirements.txt의 항목은 lint 및 고객 인식에만 해당 됩니다.The azure-functions entry in requirements.txt is only for linting and customer awareness.

런타임에 Python 함수 라이브러리의 실제 버전을 추적 하려면 다음 코드를 사용 합니다.Use the following code to track the actual version of the Python Functions library in your runtime:

getattr(azure.functions, '__version__', '< 1.2.1')

런타임 시스템 라이브러리Runtime system libraries

Python worker Docker 이미지의 사전 설치 된 시스템 라이브러리 목록을 보려면 아래 링크를 따라 이동 하세요.For a list of preinstalled system libraries in Python worker Docker images, please follow the links below:

함수 런타임Functions runtime Debian 버전Debian version Python 버전Python versions
버전 2.xVersion 2.x StretchStretch Python 3.6Python 3.6
Python 3.7Python 3.7
버전 3.xVersion 3.x BusterBuster Python 3.6Python 3.6
Python 3.7Python 3.7
Python 3.8Python 3.8
Python 3.9Python 3.9

크로스-원본 자원 공유Cross-origin resource sharing

Azure Functions는 CORS(원본 간 리소스 공유)를 지원합니다.Azure Functions supports cross-origin resource sharing (CORS). CORS는 포털Azure CLI를 통해 구성됩니다.CORS is configured in the portal and through the Azure CLI. CORS에 허용된 원본 목록은 함수 앱 수준에서 적용됩니다.The CORS allowed origins list applies at the function app level. CORS를 사용하면 응답에 Access-Control-Allow-Origin 헤더가 포함됩니다.With CORS enabled, responses include the Access-Control-Allow-Origin header. 자세한 내용은 크로스-원본 자원 공유(CORS)를 참조하십시오.For more information, see Cross-origin resource sharing.

CORS는 Python 함수 앱을 완벽하게 지원합니다.CORS is fully supported for Python function apps.

알려진 문제 및 FAQKnown issues and FAQ

다음은 일반적인 문제에 대 한 문제 해결 가이드 목록입니다.Following is a list of troubleshooting guides for common issues:

모든 알려진 문제 및 기능 요청은 GitHub 문제 목록을 사용하여 추적됩니다.All known issues and feature requests are tracked using GitHub issues list. 문제가 발생하여 GitHub에서 해당 문제를 찾을 수 없는 경우 새 문제를 열고 해당 문제에 대한 자세한 설명을 제공해 주세요.If you run into a problem and can't find the issue in GitHub, open a new issue and include a detailed description of the problem.

다음 단계Next steps

자세한 내용은 다음 리소스를 참조하세요.For more information, see the following resources:

문제가 있나요? 알려주세요.Having issues? Let us know.