Azure Functions에 대한 Zip 배포

이 문서에서는 .zip(압축) 파일에서 Azure에 함수 앱 프로젝트 파일을 배포하는 방법을 설명합니다. Azure CLI를 사용하고 REST API를 사용하여 푸시 배포를 수행하는 방법을 알아봅니다. Azure Functions Core Tools도 Azure에 로컬 프로젝트를 게시할 때 이러한 배치 API를 사용합니다.

또한 Zip 배포는 배포 패키지에서 함수를 쉽게 실행할 수 있는 방법입니다. 자세한 내용은 Azure의 패키지 파일에서 함수 실행을 참조하세요.

Azure Functions에는 Azure App Service에서 제공하는 전체 범위의 지속적인 배포 및 통합 옵션이 포함됩니다. 자세한 내용은 Azure Functions에 대한 연속 배포를 참조하세요.

개발 속도를 높이기 위해 .zip 파일에서 함수 앱 프로젝트 파일을 직접 배포하는 것이 더 쉬울 수 있습니다. .zip 배포 API는 .zip 파일의 내용을 가져와 함수 앱의 wwwroot 폴더로 추출합니다. 이 .zip 파일 배포는 다음을 포함하여 지속적인 통합 기반 배포를 지원하는 동일한 Kudu 서비스를 사용합니다.

  • 이전 배포의 남은 파일 삭제.
  • 배포 스크립트 실행을 포함한 배포 사용자 지정.
  • 배포 로그.
  • 소비 계획 함수 앱에서 함수 트리거 동기화.

자세한 내용은 .zip 배포 참조를 참조하세요.

배포 .zip 파일 요구 사항

푸시 배포에 사용할 .zip 파일에는 함수를 실행하는 데 필요한 모든 파일이 포함되어야 합니다.

Important

.zip 배포를 사용할 경우 .zip 파일에 없는 기존 배포의 모든 파일이 함수 앱에서 삭제됩니다.

특정 함수 앱의 모든 기능에 대한 코드는 호스트 구성 파일이 포함된 루트 프로젝트 폴더에 있습니다. host.json 파일은 런타임별 구성을 포함하며 함수 앱의 루트 폴더에 있습니다. bin 폴더에는 함수 앱에 필요한 패키지 및 기타 라이브러리 파일이 포함되어 있습니다. 함수 앱에 필요한 특정 폴더 구조는 언어에 따라 달라집니다.

함수 앱의 모든 함수는 동일한 언어 스택을 공유해야 합니다.

함수 앱에는 wwwroot 디렉터리의 파일 및 폴더가 모두 포함됩니다. .zip 파일 배포에는 디렉터리 자체가 아닌 wwwroot 디렉터리의 콘텐츠가 포함됩니다. C# 클래스 라이브러리 프로젝트를 배포하는 경우 .zip 패키지의 bin 하위 폴더에 컴파일된 라이브러리 파일 및 종속성을 포함시켜야 합니다.

로컬 컴퓨터에서 개발하는 경우 기본 제공 .zip 압축 기능이나 타사 도구를 사용하여 함수 앱 프로젝트 폴더의 .zip 파일을 수동으로 만들 수 있습니다.

Azure CLI를 사용하여 배포

Azure CLI를 사용하여 푸시 배포를 트리거할 수 있습니다. az functionapp deployment source config-zip 명령을 사용하여 함수 앱에 .zip 파일을 푸시 배포합니다. 이 명령을 사용하려면 Azure CLI 버전 2.0.21 이상을 사용해야 합니다. 사용 중인 Azure CLI 버전을 확인하려면 az --version 명령을 사용합니다.

다음 명령에서 <zip_file_path> 자리 표시자를 .zip 파일 위치의 경로로 바꿉니다. 또한 <app_name>을 함수 앱의 고유한 이름으로 바꾸고 <resource_group>을 리소스 그룹의 이름으로 바꿉니다.

az functionapp deployment source config-zip -g <resource_group> -n \
<app_name> --src <zip_file_path>

이 명령은 다운로드한 .zip 파일의 프로젝트 파일을 Azure의 함수 앱에 배포합니다. 그런 다음, 앱을 다시 시작합니다. 이 함수 앱에 대한 배포 목록을 보려면 REST API를 사용해야 합니다.

로컬 컴퓨터에서 Azure CLI를 사용하는 경우 <zip_file_path>는 컴퓨터에 있는 .zip 파일의 경로입니다. Azure Cloud Shell에서 Azure CLI를 실행할 수도 있습니다. Cloud Shell을 사용할 경우 먼저 Cloud Shell과 연결된 Azure Files 계정에 배포 .zip 파일을 업로드해야 합니다. 이 경우 <zip_file_path>는 Cloud Shell 계정에서 사용하는 스토리지 위치입니다. 자세한 내용은 Azure Cloud Shell에서 파일 유지를 참조하세요.

REST API를 사용하여 ZIP 파일 배포

배포 서비스 REST API를 사용하여 .zip 파일을 Azure의 앱에 배포할 수 있습니다. 배포하려면 POST 요청을 https://<app_name>.scm.azurewebsites.net/api/zipdeploy에 보냅니다. POST 요청은 메시지 본문에 .zip 파일을 포함해야 합니다. 앱에 대한 배포 자격 증명은 HTTP 기본 인증을 사용하여 요청으로 제공됩니다. 자세한 내용은 .zip 푸시 배포 참조를 참조하세요.

HTTP BASIC 인증의 경우 App Service 배포 자격 증명이 필요합니다. 배포 자격 증명을 설정하는 방법을 알아보려면 사용자 수준 자격 증명 설정 및 다시 설정을 참조하세요.

cURL 사용

다음 예제에서는 cURL 도구를 사용하여 .zip 파일을 배포합니다. <deployment_user>, <zip_file_path><app_name> 자리 표시자를 바꿉니다. cURL에서 프롬프트가 표시되면 암호를 입력합니다.

curl -X POST -u <deployment_user> --data-binary "@<zip_file_path>" https://<app_name>.scm.azurewebsites.net/api/zipdeploy

이 요청은 업로드된 .zip 파일에서 푸시 배포를 트리거합니다. 다음 cURL 예제에 표시된 대로 https://<app_name>.scm.azurewebsites.net/api/deployments 엔드포인트를 사용하여 현재 및 과거 배포를 검토할 수 있습니다. 다시 <app_name>을 앱의 이름으로 바꾸고 <deployment_user>를 배포 자격 증명의 사용자 이름으로 바꿉니다.

curl -u <deployment_user> https://<app_name>.scm.azurewebsites.net/api/deployments

비동기 zip 배포

동기적으로 배포하는 동안 연결 시간 제한과 관련된 오류가 발생할 수 있습니다. URL에 ?isAsync=true를 추가하여 비동기적으로 배포합니다. zip 파일이 폴링 가능한 배포 상태 URL을 가리키는 Location 헤더와 함께 업로드되는 즉시 응답을 받게 됩니다. Location 헤더에 제공된 URL을 폴링할 때, 프로세스가 진행되는 동안 HTTP 202(수락됨) 응답이 수신되고 보관이 확장되고 배포가 성공적으로 완료되면 HTTP 200(OK) 응답을 받게 됩니다.

Microsoft Entra 인증

zip 배포에 HTTP BASIC 인증을 사용하는 방식 대신 Microsoft Entra ID를 사용할 수 있습니다. SCM 사이트에 대해 HTTP BASIC 인증을 사용하지 않도록 설정한 경우 Microsoft Entra ID가 필요할 수 있습니다.

배포를 수행하는 사용자 또는 서비스 주체에 대한 유효한 Microsoft Entra 액세스 토큰이 필요합니다. Azure CLI의 az account get-access-token 명령을 사용하여 액세스 토큰을 검색할 수 있습니다. 액세스 토큰은 HTTP POST 요청의 인증 헤더에 사용됩니다.

curl -X POST \
    --data-binary "@<zip_file_path>" \
    -H "Authorization: Bearer <access_token>" \
    "https://<app_name>.scm.azurewebsites.net/api/zipdeploy"

PowerShell 사용

다음 예제에서는 Publish-AzWebapp을 사용하여 .zip 파일을 업로드합니다. <group-name>, <app-name><zip-file-path> 자리 표시자를 바꿉니다.

Publish-AzWebapp -ResourceGroupName <group-name> -Name <app-name> -ArchivePath <zip-file-path>

이 요청은 업로드된 .zip 파일에서 푸시 배포를 트리거합니다.

현재 및 과거 배포를 검토하려면 다음 명령을 실행합니다. 다시 <deployment-user>, <deployment-password><app-name> 자리 표시자를 바꿉니다.

$username = "<deployment-user>"
$password = "<deployment-password>"
$apiUrl = "https://<app-name>.scm.azurewebsites.net/api/deployments"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET

ARM 템플릿을 사용하여 배포

ZipDeploy ARM 템플릿 확장을 사용하여 .zip 파일을 함수 앱에 푸시할 수 있습니다.

예제 ZipDeploy ARM 템플릿

이 템플릿은 프로덕션 및 스테이징 슬롯을 모두 포함하고 둘 중 하나에 배포합니다. 일반적으로 이 템플릿을 사용하여 스테이징 슬롯에 배포한 다음, 전환하여 프로덕션 슬롯에서 실행되는 새 zip 패키지를 가져옵니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "appServiceName": {
      "type": "string"
    },
    "deployToProduction": {
      "type": "bool",
      "defaultValue": false
    },
    "slot": {
      "type": "string",
      "defaultValue": "staging"
    },
    "packageUri": {
      "type": "secureString"
    }
  },
  "resources": [
    {
      "condition": "[parameters('deployToProduction')]",
      "type": "Microsoft.Web/sites/extensions",
      "apiVersion": "2021-02-01",
      "name": "[format('{0}/ZipDeploy', parameters('appServiceName'))]",
      "properties": {
        "packageUri": "[parameters('packageUri')]",
        "appOffline": true
      }
    },
    {
      "condition": "[not(parameters('deployToProduction'))]",
      "type": "Microsoft.Web/sites/slots/extensions",
      "apiVersion": "2021-02-01",
      "name": "[format('{0}/{1}/ZipDeploy', parameters('appServiceName'), parameters('slot'))]",
      "properties": {
        "packageUri": "[parameters('packageUri')]",
        "appOffline": true
      }
    }
  ]
}

초기 배포의 경우 프로덕션 슬롯에 직접 배포합니다. 자세한 내용은 슬롯 배포를 참조하세요.

배포 패키지에서 함수 실행

배포 패키지 파일에서 직접 함수를 실행하도록 선택할 수도 있습니다. 이 방법은 패키지에서 함수 앱의 wwwroot 디렉터리로 파일을 복사하는 배포 단계를 건너뜁니다. 대신, 패키지 파일은 Functions 런타임에 의해 탑재되고 wwwroot 디렉터리의 내용은 읽기 전용이 됩니다.

Zip 배치는 이 기능과 통합되어 있으며 함수 앱 설정 WEBSITE_RUN_FROM_PACKAGE을 값 1로 설정하여 활성화할 수 있습니다. 자세한 내용은 배포 패키지 파일에서 함수 실행을 참조하세요.

배포 사용자 지정

배포 프로세스에서는 푸시하는 .zip 파일에 실행 준비 앱이 포함되어 있다고 가정합니다. 기본적으로 사용자 지정은 실행되지 않습니다. 지속적인 통합을 사용하여 가져오는 동일한 빌드 프로세스를 사용하도록 설정하려면 애플리케이션 설정에 다음을 추가합니다.

SCM_DO_BUILD_DURING_DEPLOYMENT=true

.zip 푸시 배포를 사용하는 경우 이 설정은 기본적으로 false입니다. 지속적인 통합 배포에 대한 기본값은 true입니다. true로 설정하면 배포 중에 배포 관련 설정이 사용됩니다. 이러한 설정은 .zip 파일의 루트에 있는 앱 설정으로 구성하거나 .deployment 구성 파일에서 구성할 수 있습니다. 자세한 내용은 배포 참조의 리포지토리 및 배포 관련 설정을 참조하세요.

함수 앱 파일 다운로드

Azure Portal 편집기를 사용해 함수를 만들었다면 다음 방법 중 하나로 기존 함수 앱 프로젝트를 .zip 파일로 다운로드할 수 있습니다.

  • Azure Portal에서:

    1. Azure Portal에 로그인하고 함수 앱으로 이동합니다.

    2. 개요 탭에서 앱 콘텐츠 다운로드를 선택합니다. 다운로드 옵션을 선택한 다음, 다운로드를 선택합니다.

      함수 앱 프로젝트 다운로드

      .zip 푸시 배포를 사용하여 함수 앱에 다시 게시하려면 다운로드한 .zip 파일 형식이 필요합니다. 포털 다운로드는 Visual Studio에서 직접 함수 앱을 여는 데 필요한 파일을 추가할 수도 있습니다.

  • REST API 사용:

    다음과 같은 배포 GET API를 사용하여 <function_app> 프로젝트에서 파일 다운로드:

    https://<function_app>.scm.azurewebsites.net/api/zip/site/wwwroot/
    

    /site/wwwroot/를 포함하면 zip 파일에 전체 사이트가 아닌 함수 앱 프로젝트 파일만이 포함되도록 합니다. Azure에 로그인하지 않은 경우 이를 묻는 메시지가 나타납니다.

GitHub 리포지토리에서도 .zip 파일을 다운로드할 수 있습니다. GitHub 리포지토리를 .zip 파일로 다운로드할 경우 GitHub에서는 분기에 대한 추가 폴더 수준을 추가합니다. 이 추가 폴더 수준은 GitHub에서 다운로드한 대로 직접 .zip 파일을 배포할 수 없음을 의미합니다. GitHub 리포지토리를 사용하여 함수 앱을 유지 관리하려는 경우 지속적인 통합을 사용하여 앱을 배포해야 합니다.

다음 단계