Azure Functions의 함수 앱에 대한 리소스 배포 자동화Automate resource deployment for your function app in Azure Functions

Azure Resource Manager 템플릿을 사용하여 함수 앱을 배포할 수 있습니다.You can use an Azure Resource Manager template to deploy a function app. 이 문서에서는 이 작업을 수행하는 데 필요한 리소스와 매개 변수를 간략히 설명합니다.This article outlines the required resources and parameters for doing so. 함수 앱의 트리거 및 바인딩에 따라 추가 리소스를 배포해야 할 수 있습니다.You might need to deploy additional resources, depending on the triggers and bindings in your function app.

템플릿을 만드는 더 자세한 내용은 Azure Resource Manager 템플릿 작성하기를 참조하십시오.For more information about creating templates, see Authoring Azure Resource Manager templates.

샘플 템플릿은 다음을 참조하세요.For sample templates, see:

필요한 리소스Required resources

Azure Functions 배포는 일반적으로 다음과 같은 리소스로 구성됩니다.An Azure Functions deployment typically consists of these resources:

리소스Resource 요구 사항Requirement 구문 및 속성 참조Syntax and properties reference
함수 앱A function app 필수Required Microsoft.Web/sitesMicrosoft.Web/sites
Azure 저장소 계정An Azure Storage account 필수Required Microsoft.Storage/storageAccountsMicrosoft.Storage/storageAccounts
애플리케이션 인사이트 구성 요소An Application Insights component OptionalOptional 마이크로소프트.인사이트/구성 요소Microsoft.Insights/components
호스팅 계획A hosting plan 옵션1Optional1 Microsoft.Web/serverfarmsMicrosoft.Web/serverfarms

1개 호스팅 계획은 프리미엄 계획(미리 보기) 또는 앱 서비스 계획에서함수 앱을 실행하도록 선택할 때만 필요합니다.1A hosting plan is only required when you choose to run your function app on a Premium plan (in preview) or on an App Service plan.

필수는 아니지만 앱에 대한 응용 프로그램 인사이트를 구성하는 것이 좋습니다.While not required, it is strongly recommended that you configure Application Insights for your app.

스토리지 계정Storage account

함수 앱에는 Azure Storage 계정이 필요합니다.An Azure storage account is required for a function app. Blob, 테이블, 큐 및 파일을 지원하는 일반 용도의 계정이 있어야 합니다.You need a general purpose account that supports blobs, tables, queues, and files. 자세한 내용은 Azure Functions 스토리지 계정 요구 사항을 참조하세요.For more information, see Azure Functions storage account requirements.

{
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[variables('storageAccountName')]",
    "apiVersion": "2019-04-01",
    "location": "[resourceGroup().location]",
    "kind": "StorageV2",
    "sku": {
        "name": "[parameters('storageAccountType')]"
    }
}

또한 속성 AzureWebJobsStorage가 사이트 구성에서 앱 설정으로 지정되어야 합니다.In addition, the property AzureWebJobsStorage must be specified as an app setting in the site configuration. 함수 앱이 Application Insights를 모니터링에 사용하지 않으면 AzureWebJobsDashboard도 앱 설정으로 지정되어야 합니다.If the function app doesn't use Application Insights for monitoring, it should also specify AzureWebJobsDashboard as an app setting.

Azure Functions 런타임에서는 AzureWebJobsStorage 연결 문자열을 사용하여 내부 큐를 만듭니다.The Azure Functions runtime uses the AzureWebJobsStorage connection string to create internal queues. Application Insights가 활성화되지 않은 경우 런타임은 AzureWebJobsDashboard 연결 문자열을 사용하여 Azure Table Storage에 로그온하고 포털의 모니터 탭에 전원을 공급합니다.When Application Insights is not enabled, the runtime uses the AzureWebJobsDashboard connection string to log to Azure Table storage and power the Monitor tab in the portal.

이러한 속성은 siteConfig 개체의 appSettings 컬렉션에서 지정됩니다.These properties are specified in the appSettings collection in the siteConfig object:

"appSettings": [
    {
        "name": "AzureWebJobsStorage",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
    },
    {
        "name": "AzureWebJobsDashboard",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
    }
]

애플리케이션 정보Application Insights

응용 프로그램 인사이트는 기능 앱을 모니터링하는 데 권장됩니다.Application Insights is recommended for monitoring your function apps. 응용 프로그램 인사이트 리소스는 Microsoft.Insights/구성 요소 유형 및 종류 웹으로정의됩니다.The Application Insights resource is defined with the type Microsoft.Insights/components and the kind web:

        {
            "apiVersion": "2015-05-01",
            "name": "[variables('appInsightsName')]",
            "type": "Microsoft.Insights/components",
            "kind": "web",
            "location": "[resourceGroup().location]",
            "tags": {
                "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', variables('functionAppName'))]": "Resource"
            },
            "properties": {
                "Application_Type": "web",
                "ApplicationId": "[variables('appInsightsName')]"
            }
        },

또한 계측 키는 응용 프로그램 설정을 사용하여 함수 APPINSIGHTS_INSTRUMENTATIONKEY 앱에 제공되어야 합니다.In addition, the instrumentation key needs to be provided to the function app using the APPINSIGHTS_INSTRUMENTATIONKEY application setting. 이 속성은 개체의 appSettings 컬렉션에 지정됩니다. siteConfigThis property is specified in the appSettings collection in the siteConfig object:

"appSettings": [
    {
        "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
        "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey]"
    }
]

호스팅 계획Hosting plan

호스팅 계획의 정의는 다양하며 다음 중 하나가 될 수 있습니다.The definition of the hosting plan varies, and can be one of the following:

함수 앱Function app

함수 앱 리소스는 Microsoft.Web/sites 및 kind functionapp형식의 리소스를 사용하여 정의됩니다.The function app resource is defined by using a resource of type Microsoft.Web/sites and kind functionapp:

{
    "apiVersion": "2015-08-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
    ]
}

중요

호스팅 계획을 명시적으로 정의하는 경우 dependsOn 배열에 추가 항목이 필요합니다."[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"If you are explicitly defining a hosting plan, an additional item would be needed in the dependsOn array: "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"

함수 앱에는 다음 응용 프로그램 설정이 포함되어야 합니다.A function app must include these application settings:

설정 이름Setting name 설명Description 예제 값Example values
AzureWebJobsStorageAzureWebJobsStorage 함수 런타임이 내부 큐에 사용하는 저장소 계정에 대한 연결 문자열A connection string to a storage account that the Functions runtime uses for internal queueing 저장소 계정 보기See Storage account
FUNCTIONS_EXTENSION_VERSIONFUNCTIONS_EXTENSION_VERSION Azure 함수 런타임 버전The version of the Azure Functions runtime ~2
FUNCTIONS_WORKER_RUNTIMEFUNCTIONS_WORKER_RUNTIME 이 응용 프로그램의 기능에 사용되는 언어 스택The language stack to be used for functions in this app dotnet, node, java, python 또는 powershelldotnet, node, java, python, or powershell
WEBSITE_NODE_DEFAULT_VERSIONWEBSITE_NODE_DEFAULT_VERSION 언어 스택을 node 사용하는 경우에만 사용할 버전을 지정합니다.Only needed if using the node language stack, specifies the version to use 10.14.1

이러한 속성은 appSettings siteConfig 속성의 컬렉션에 지정됩니다.These properties are specified in the appSettings collection in the siteConfig property:

"properties": {
    "siteConfig": {
        "appSettings": [
            {
                "name": "AzureWebJobsStorage",
                "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
            },
            {
                "name": "FUNCTIONS_WORKER_RUNTIME",
                "value": "node"
            },
            {
                "name": "WEBSITE_NODE_DEFAULT_VERSION",
                "value": "10.14.1"
            },
            {
                "name": "FUNCTIONS_EXTENSION_VERSION",
                "value": "~2"
            }
        ]
    }
}

소비 계획에 배포Deploy on Consumption plan

소비 계획은 코드가 실행 중일 때 자동으로 계산 능력을 할당하고, 부하를 처리하기 위해 필요에 따라 확장한 다음 코드가 실행되지 않을 때 확장합니다.The Consumption plan automatically allocates compute power when your code is running, scales out as necessary to handle load, and then scales in when code is not running. 유휴 VM에 대한 비용을 지불할 필요가 없으며 용량을 미리 예약할 필요가 없습니다.You don't have to pay for idle VMs, and you don't have to reserve capacity in advance. 자세한 내용은 Azure Functions 크기 조정 및 호스팅을 참조하세요.To learn more, see Azure Functions scale and hosting.

샘플 Azure Resource Manager 템플릿은 소비 계획의 함수 앱을 참조하세요.For a sample Azure Resource Manager template, see Function app on Consumption plan.

소비 계획 만들기Create a Consumption plan

소비 계획을 정의할 필요는 없습니다.A Consumption plan does not need to be defined. 함수 앱 리소스 자체를 만들 때 지역별로 자동으로 만들어지거나 선택됩니다.One will automatically be created or selected on a per-region basis when you create the function app resource itself.

소비 계획은 "서버 팜" 리소스의 특수 한 유형입니다.The Consumption plan is a special type of "serverfarm" resource. Windows의 경우 Dynamic computeModesku 속성에 대한 값을 사용하여 지정할 수 있습니다.For Windows, you can specify it by using the Dynamic value for the computeMode and sku properties:

{  
   "type":"Microsoft.Web/serverfarms",
   "apiVersion":"2016-09-01",
   "name":"[variables('hostingPlanName')]",
   "location":"[resourceGroup().location]",
   "properties":{  
      "name":"[variables('hostingPlanName')]",
      "computeMode":"Dynamic"
   },
   "sku":{  
      "name":"Y1",
      "tier":"Dynamic",
      "size":"Y1",
      "family":"Y",
      "capacity":0
   }
}

참고

Linux에 대해 소비 계획을 명시적으로 정의할 수 없습니다.The Consumption plan cannot be explicitly defined for Linux. 자동으로 만들어집니다.It will be created automatically.

소비 계획을 명시적으로 정의하는 경우 계획의 리소스 ID를 가리키도록 앱에서 serverFarmId 속성을 설정해야 합니다.If you do explicitly define your Consumption plan, you will need to set the serverFarmId property on the app so that it points to the resource ID of the plan. 함수 앱에도 계획에 대한 dependsOn 설정이 있는지 확인해야 합니다.You should ensure that the function app has a dependsOn setting for the plan as well.

함수 앱 만들기Create a function app

WindowsWindows

Windows에서 사용 계획에는 사이트 구성에서 두 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING 가지 WEBSITE_CONTENTSHARE추가 설정이 필요합니다.On Windows, a Consumption plan requires two additional settings in the site configuration: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING and WEBSITE_CONTENTSHARE. 이러한 속성은 함수 앱 코드와 구성이 저장되는 스토리지 계정 및 파일 경로를 구성합니다.These properties configure the storage account and file path where the function app code and configuration are stored.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTSHARE",
                    "value": "[toLower(variables('functionAppName'))]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        }
    }
}

LinuxLinux

Linux에서 함수 앱은 로 kind 설정되어야 하며 functionapp,linux속성이 reserved 다음으로 true설정되어 있어야 합니다.On Linux, the function app must have its kind set to functionapp,linux, and it must have the reserved property set to true:

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp,linux",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountName'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        },
        "reserved": true
    }
}

프리미엄 플랜에 배포Deploy on Premium plan

프리미엄 플랜은 소비 계획과 동일한 확장을 제공하지만 전용 리소스 및 추가 기능을 포함합니다.The Premium plan offers the same scaling as the Consumption plan but includes dedicated resources and additional capabilities. 자세한 내용은 Azure 기능 프리미엄 플랜을참조하십시오.To learn more, see Azure Functions Premium Plan.

프리미엄 플랜 만들기Create a Premium plan

프리미엄 플랜은 "서버팜" 리소스의 특별한 유형입니다.A Premium plan is a special type of "serverfarm" resource. EP1사용하거나 EP2 EP3 설명 Name sku 개체에서속성 값에 대해 지정할 수 있습니다.You can specify it by using either EP1, EP2, or EP3 for the Name property value in the sku description object.

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "properties": {
        "name": "[parameters('hostingPlanName')]",
        "workerSize": "[parameters('workerSize')]",
        "workerSizeId": "[parameters('workerSizeId')]",
        "numberOfWorkers": "[parameters('numberOfWorkers')]",
        "hostingEnvironment": "[parameters('hostingEnvironment')]",
        "maximumElasticWorkerCount": "20"
    },
    "sku": {
        "Tier": "ElasticPremium",
        "Name": "EP1"
    }
}

함수 앱 만들기Create a function app

프리미엄 계획의 함수 앱에는 이전에 serverFarmId 만든 계획의 리소스 ID로 속성이 설정되어 있어야 합니다.A function app on a Premium plan must have the serverFarmId property set to the resource ID of the plan created earlier. 또한 프리미엄 요금제에는 사이트 구성에서 두 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING 가지 WEBSITE_CONTENTSHARE추가 설정이 필요합니다.In addition, a Premium plan requires two additional settings in the site configuration: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING and WEBSITE_CONTENTSHARE. 이러한 속성은 함수 앱 코드와 구성이 저장되는 스토리지 계정 및 파일 경로를 구성합니다.These properties configure the storage account and file path where the function app code and configuration are stored.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",            
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTSHARE",
                    "value": "[toLower(variables('functionAppName'))]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        }
    }
}

앱 서비스 계획에 배포Deploy on App Service plan

App Service 계획에서 함수 앱은 웹앱과 유사하게 기본, 표준, 프리미엄 SKU의 전용 VM에서 실행됩니다.In the App Service plan, your function app runs on dedicated VMs on Basic, Standard, and Premium SKUs, similar to web apps. App Service 계획의 작동 원리에 대한 자세한 내용은 Azure App Service 계획의 포괄 개요를 참조하세요.For details about how the App Service plan works, see the Azure App Service plans in-depth overview.

샘플 Azure Resource Manager 템플릿은 Azure App Service 계획의 함수 앱을 참조하세요.For a sample Azure Resource Manager template, see Function app on Azure App Service plan.

App Service 플랜 만들기Create an App Service plan

앱 서비스 계획은 "서버 팜" 리소스에 의해 정의됩니다.An App Service plan is defined by a "serverfarm" resource.

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[variables('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "sku": {
        "name": "S1",
        "tier": "Standard",
        "size": "S1",
        "family": "S",
        "capacity": 1
    }
}

Linux에서 앱을 실행하려면 kind 다음을 Linux설정해야 합니다.To run your app on Linux, you must also set the kind to Linux:

{
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2018-02-01",
    "name": "[variables('hostingPlanName')]",
    "location": "[resourceGroup().location]",
    "kind": "Linux",
    "sku": {
        "name": "S1",
        "tier": "Standard",
        "size": "S1",
        "family": "S",
        "capacity": 1
    }
}

함수 앱 만들기Create a function app

앱 서비스 계획의 함수 앱에는 serverFarmId 이전에 만든 계획의 리소스 ID로 속성이 설정되어 있어야 합니다.A function app on an App Service plan must have the serverFarmId property set to the resource ID of the plan created earlier.

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ]
        }
    }
}

Linux 앱에는 아래의 linuxFxVersion siteConfig속성도 포함되어야 합니다.Linux apps should also include a linuxFxVersion property under siteConfig. 코드를 배포하는 경우 이 값은 원하는 런타임 스택에 의해 결정됩니다.If you are just deploying code, the value for this is determined by your desired runtime stack:

스택Stack 예제 값Example value
PythonPython DOCKER|microsoft/azure-functions-python3.6:2.0
JavaScriptJavaScript DOCKER|microsoft/azure-functions-node8:2.0
.NET.NET DOCKER|microsoft/azure-functions-dotnet-core2.0:2.0
{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                }
            ],
            "linuxFxVersion": "DOCKER|microsoft/azure-functions-node8:2.0"
        }
    }
}

사용자 지정 컨테이너 이미지를 배포하는경우 linuxFxVersion 컨테이너용 웹 앱에서와같이 이미지를 끌어당길 수 있는 구성을 지정하고 포함해야 합니다.If you are deploying a custom container image, you must specify it with linuxFxVersion and include configuration that allows your image to be pulled, as in Web App for Containers. 또한 앱 WEBSITES_ENABLE_APP_SERVICE_STORAGE false콘텐츠가 컨테이너 자체에 제공되므로 을 설정합니다.Also, set WEBSITES_ENABLE_APP_SERVICE_STORAGE to false, since your app content is provided in the container itself:

{
    "apiVersion": "2016-03-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('functionAppName')]",
    "location": "[resourceGroup().location]",
    "kind": "functionapp",
    "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    ],
    "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "10.14.1"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                },
                {
                    "name": "DOCKER_REGISTRY_SERVER_URL",
                    "value": "[parameters('dockerRegistryUrl')]"
                },
                {
                    "name": "DOCKER_REGISTRY_SERVER_USERNAME",
                    "value": "[parameters('dockerRegistryUsername')]"
                },
                {
                    "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
                    "value": "[parameters('dockerRegistryPassword')]"
                },
                {
                    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
                    "value": "false"
                }
            ],
            "linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag"
        }
    }
}

배포 사용자 지정Customizing a deployment

함수 앱에는 앱 설정 및 소스 제어 옵션을 포함하여 배포에 사용할 수 있는 자식 리소스가 많이 있습니다.A function app has many child resources that you can use in your deployment, including app settings and source control options. 또한 소스컨트롤 자식 리소스를 제거하고 대신 다른 배포 옵션을 사용하도록 선택할 수도 있습니다.You also might choose to remove the sourcecontrols child resource, and use a different deployment option instead.

중요

Azure Resource Manager를 사용하여 애플리케이션을 성공적으로 배포하려면 Azure에서 리소스가 배포되는 방식을 이해하는 것이 중요합니다.To successfully deploy your application by using Azure Resource Manager, it's important to understand how resources are deployed in Azure. 다음 예제에서는 siteConfig를 사용하여 최상위 수준 구성을 적용합니다.In the following example, top-level configurations are applied by using siteConfig. Functions 런타임 및 배포 엔진에 정보를 전달하기 때문에 최상위 수준에서 이러한 구성을 설정하는 것이 중요합니다.It's important to set these configurations at a top level, because they convey information to the Functions runtime and deployment engine. sourcecontrols/web 자식 리소스를 적용하기 전에 최상위 수준 정보가 필요합니다.Top-level information is required before the child sourcecontrols/web resource is applied. 자식 수준 구성/appSettings 리소스에서 이러한 설정을 구성할 수 있지만 경우에 따라 config/appSettings를 적용하기 전에 함수 앱을 배포해야 합니다.Although it's possible to configure these settings in the child-level config/appSettings resource, in some cases your function app must be deployed before config/appSettings is applied. 예를 들어 Logic Apps에서 함수를 사용하는 경우 함수는 다른 리소스의 종속성입니다.For example, when you are using functions with Logic Apps, your functions are a dependency of another resource.

{
  "apiVersion": "2015-08-01",
  "name": "[parameters('appName')]",
  "type": "Microsoft.Web/sites",
  "kind": "functionapp",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Web/serverfarms', parameters('appName'))]"
  ],
  "properties": {
     "serverFarmId": "[variables('appServicePlanName')]",
     "siteConfig": {
        "alwaysOn": true,
        "appSettings": [
            {
                "name": "FUNCTIONS_EXTENSION_VERSION",
                "value": "~2"
            },
            {
                "name": "Project",
                "value": "src"
            }
        ]
     }
  },
  "resources": [
     {
        "apiVersion": "2015-08-01",
        "name": "appsettings",
        "type": "config",
        "dependsOn": [
          "[resourceId('Microsoft.Web/Sites', parameters('appName'))]",
          "[resourceId('Microsoft.Web/Sites/sourcecontrols', parameters('appName'), 'web')]",
          "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
        ],
        "properties": {
          "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]",
          "AzureWebJobsDashboard": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]",
          "FUNCTIONS_EXTENSION_VERSION": "~2",
          "FUNCTIONS_WORKER_RUNTIME": "dotnet",
          "Project": "src"
        }
     },
     {
          "apiVersion": "2015-08-01",
          "name": "web",
          "type": "sourcecontrols",
          "dependsOn": [
            "[resourceId('Microsoft.Web/sites/', parameters('appName'))]"
          ],
          "properties": {
            "RepoUrl": "[parameters('sourceCodeRepositoryURL')]",
            "branch": "[parameters('sourceCodeBranch')]",
            "IsManualIntegration": "[parameters('sourceCodeManualIntegration')]"
          }
     }
  ]
}

이 템플릿은 프로젝트 앱 설정 값을 사용하여 기능 배포 엔진(Kudu)이 배포 가능한 코드를 찾는 기본 디렉터리를 설정합니다.This template uses the Project app settings value, which sets the base directory in which the Functions deployment engine (Kudu) looks for deployable code. 리포지토리에서 함수는 src 폴더의 하위 폴더에 있습니다.In our repository, our functions are in a subfolder of the src folder. 따라서 앞의 예제에서 앱 설정 값은 src로 설정합니다.So, in the preceding example, we set the app settings value to src. 함수가 리포지토리의 루트에 있거나 소스 제어에서 배포하지 않는 경우 이 앱 설정 값을 제거할 수 있습니다.If your functions are in the root of your repository, or if you are not deploying from source control, you can remove this app settings value.

템플릿 배포Deploy your template

다음 방법 중 하나를 사용하여 템플릿을 배포할 수 있습니다.You can use any of the following ways to deploy your template:

Azure 단추에 배포Deploy to Azure button

<url-encoded-path-to-azuredeploy-json>을 GitHub에 있는 azuredeploy.json 파일의 원시 경로에 대한 URL 인코딩 버전으로 바꿉니다.Replace <url-encoded-path-to-azuredeploy-json> with a URL-encoded version of the raw path of your azuredeploy.json file in GitHub.

markdown을 사용하는 예는 다음과 같습니다.Here is an example that uses markdown:

[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)

HTML을 사용하는 예는 다음과 같습니다.Here is an example that uses HTML:

<a href="https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>" target="_blank"><img src="https://azuredeploy.net/deploybutton.png"></a>

PowerShell을 사용하여 배포Deploy using PowerShell

다음 PowerShell 명령은 리소스 그룹을 만들고 필요한 리소스가 있는 함수 앱을 만드는 템플릿을 배포합니다.The following PowerShell commands create a resource group and deploy a template that create a function app with its required resources. 로컬로 실행하려면 Azure PowerShell이 설치되어 있어야 합니다.To run locally, you must have Azure PowerShell installed. 실행하여 Connect-AzAccount 로그인합니다.Run Connect-AzAccount to sign in.

# Register Resource Providers if they're not already registered
Register-AzResourceProvider -ProviderNamespace "microsoft.web"
Register-AzResourceProvider -ProviderNamespace "microsoft.storage"

# Create a resource group for the function app
New-AzResourceGroup -Name "MyResourceGroup" -Location 'West Europe'

# Create the parameters for the file, which for this template is the function app name.
$TemplateParams = @{"appName" = "<function-app-name>"}

# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile template.json -TemplateParameterObject $TemplateParams -Verbose

이 배포를 테스트하려면 소비 계획에서 Windows에서 함수 앱을 만드는 이 템플릿과 같은 템플릿을 사용할 수 있습니다.To test out this deployment, you can use a template like this one that creates a function app on Windows in a Consumption plan. 함수 <function-app-name> 앱의 고유한 이름으로 바꿉니다.Replace <function-app-name> with a unique name for your function app.

다음 단계Next steps

Azure Functions를 개발하고 구성하는 방법에 대해 자세히 알아봅니다.Learn more about how to develop and configure Azure Functions.