다음을 통해 공유


Azure Functions에서 함수 애플리케이션에 대한 리소스 배포 자동화

함수 앱 배포를 자동화하려면 Bicep 파일 또는 ARM 템플릿(Azure Resource Manager 템플릿)을 사용합니다. 배포하는 동안 기존 Azure 리소스를 사용하거나 새 리소스를 만들 수 있습니다.

IaC(인프라)와 CI/CD(지속적인 통합 및 배포) 모두 배포 자동화를 사용하면 프로덕션 앱에 다음과 같은 이점을 얻을 수 있습니다.

  • 일관성: 코드에서 인프라를 정의하여 환경 간에 일관된 배포를 보장합니다.
  • 버전 제어: 프로젝트 코드와 함께 소스 제어에서 인프라 및 애플리케이션 구성에 대한 변경 내용을 추적합니다.
  • 자동화: 배포를 자동화하여 수동 오류를 줄이고 릴리스 프로세스를 단축합니다.
  • 확장성: 개발, 테스트 및 프로덕션과 같은 여러 환경에 대한 인프라를 쉽게 복제합니다.
  • 재해 복구: 오류 후 또는 마이그레이션 중에 인프라를 신속하게 다시 만듭니다.

이 문서에서는 Azure Functions Azure 리소스 만들기 및 배포 구성을 자동화하는 방법을 보여 줍니다. 프로젝트 코드의 지속적인 배포에 대한 자세한 내용은 Azure Functions 참조하세요.

필요한 Azure 리소스를 만드는 템플릿 코드는 함수 앱에 대해 원하는 호스팅 옵션에 따라 달라집니다. 이 문서에서 지원하는 호스팅 옵션은 다음과 같습니다.

호스팅 옵션 배포 유형 샘플 템플릿
Flex 사용량 플랜 Code-only Bicep
ARM 템플릿
Terraform
프리미엄 계획 코드 | 컨테이너 Bicep
ARM 템플릿
전용 플랜 코드 | 컨테이너 Bicep
ARM 템플릿
Azure Container Apps Container-only Bicep
소비 계획(레거시) Code-only Bicep
ARM 템플릿

새 서버리스 함수 앱의 경우 Flex 소비 계획을 사용합니다.
소비 플랜은 레거시 호스팅 플랜입니다. 기존 앱의 경우 Flex 소비 계획으로 마이그레이션합니다.

문서 맨 위에 있는 호스팅 계획을 선택해야 합니다.

Important

Linux에서 사용량 요금제를 사용 중이며 여전히 지원 종료된 v3 런타임을 실행 중인 Function 앱은 2026년 9월 30일 이후부터 더 이상 실행되지 않습니다. 서비스 중단을 방지하려면 앱을 v4 런타임으로 마이그레이션합니다.

소비 계획에서 Linux에서 함수 앱을 호스트하는 옵션은 2028년 9월 30일에 사용 중지됩니다. Linux 사용 계획은 새로운 기능 또는 언어 버전을 가져오지 않습니다. 소비 계획에서 Windows 실행되는 앱은 현재 영향을 받지 않습니다. 앱을 Flex 사용 플랜으로 마이그레이션을 종료일 이전에 완료하세요.

이 문서를 사용할 때는 다음 사항을 염두에 두어야 합니다.

  • 예제는 특정 리소스에 대한 개별 섹션으로 표시됩니다. 전체 Bicep 파일 및 ARM 템플릿 예제의 광범위한 집합은 다음 함수 앱 배포 예제를 참조하세요.
  • 예제는 특정 리소스에 대한 개별 섹션으로 표시됩니다.

필수 리소스

Azure Functions 호스팅 배포에 대해 다음 리소스를 만들거나 구성해야 합니다.

Resource Requirement 구문 및 속성 참조
스토리지 계정 Required Microsoft. Storage/storageAccounts
Application Insights 구성 요소 Recommended Microsoft.Insights/components*
호스팅 계획 Required Microsoft.Web/서버팜
함수 앱 Required Microsoft. 웹/사이트

Azure Functions 호스팅 배포에 대해 다음 리소스를 만들거나 구성해야 합니다.

Resource Requirement 구문 및 속성 참조
스토리지 계정 Required Microsoft. Storage/storageAccounts
Application Insights 구성 요소 Recommended Microsoft.Insights/컴포넌트*
함수 앱 Required Microsoft. 웹/사이트

Azure Container Apps 호스팅 배포는 일반적으로 다음 리소스로 구성됩니다.

Resource Requirement 구문 및 속성 참조
스토리지 계정 Required Microsoft. Storage/storageAccounts
Application Insights 구성 요소 Recommended Microsoft.Insights/components*
관리되는 환경 Required Microsoft.App/managedEnvironments
함수 앱 Required Microsoft. 웹/사이트

*Application Insights 인스턴스에서 사용할 수 있는 Log Analytics 작업 영역이 아직 없는 경우 이 리소스도 만들어야 합니다.

단일 Bicep 파일 또는 ARM 템플릿에 여러 리소스를 배포하는 경우 리소스를 만드는 순서가 중요합니다. 이 요구 사항은 리소스 간의 종속성으로 인해 발생합니다. 이러한 종속성의 경우 dependsOn 요소를 사용하여 종속 리소스의 종속성을 정의해야 합니다. 자세한 내용은 ARM 템플릿에서 리소스 배포 순서 정의 또는 Bicep의 리소스 종속성 변경 중 하나를 참조하세요.

Prerequisites

  • 이러한 예제는 기존 리소스 그룹의 컨텍스트에서 작동합니다.
  • Application Insights 및 스토리지 로그 모두 기존 Azure Log Analytics 작업 영역이 필요합니다. 서비스 간에 작업 영역을 공유할 수 있습니다. 성능을 향상시키려면 각 지역에 작업 영역을 만듭니다. Log Analytics 작업 영역을 만드는 방법에 대한 예제는 Log Analytics 작업 영역 만들기 참조하세요. Azure Portal의 작업 영역 페이지에서 설정 > 속성 > 리소스 ID 아래에 있는 정규화된 작업 영역 리소스 ID를 찾을 수 있습니다.
  • 이 문서에서는 Azure Container Apps에서 관리되는 환경을 이미 만들었다고 가정합니다. Container Apps에서 호스트되는 함수 앱을 만들려면 관리 환경의 이름과 ID가 모두 필요합니다.

스토리지 계정 만들기

모든 함수 앱에는 Azure 스토리지 계정이 필요합니다. Blob, 테이블, 큐 및 파일을 지원하는 범용 계정이 필요합니다. 자세한 내용은 Azure Functions 스토리지 계정 요구 사항 참조하세요.

Important

스토리지 계정은 중요한 앱 데이터를 저장하는 데 사용되며, 이러한 중요 앱 데이터에 애플리케이션 코드 자체가 포함되는 경우도 있습니다. 다른 앱 및 사용자의 액세스를 스토리지 계정으로 제한해야 합니다.

이 예제 섹션에서는 표준 범용 v2 스토리지 계정을 만듭니다.

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
  properties: {
    supportsHttpsTrafficOnly: true
    defaultToOAuthAuthentication: true
    allowBlobPublicAccess: false
    minimumTlsVersion: 'TLS1_2'
  }
}

자세한 컨텍스트는 템플릿 리포지토리의 전체 main.bicep 파일을 참조하세요.

자세한 컨텍스트는 샘플 리포지토리의 전체 storage-PrivateEndpoint.bicep 파일을 참조하세요.

함수 앱은 이 스토리지 계정에 연결해야 합니다. 설정을 사용하여 이 연결을 구성합니다 AzureWebJobsStorage . 자세한 내용은 애플리케이션 구성을 참조하세요.

Tip

보안을 강화하려면 스토리지 계정 속성에 추가하고 allowSharedKeyAccess: false 연결 문자열 대신 관리 ID 기반 연결을 사용합니다. 이 문서의 Flex 소비 계획 예제에서는 ID 기반 설정 및 시스템 할당 관리 ID를 포함하여 AzureWebJobsStorage__* 이 방법을 사용합니다. 자세한 내용은 신원을 사용하여 호스트 스토리지에 연결하기를 참조하세요.

Tip

보안을 강화하려면 스토리지 계정으로 allowSharedKeyAccess 설정하고 false 연결 문자열 대신 관리 ID 기반 연결을 사용합니다. 자세한 내용은 ID를 사용하여 호스트 스토리지에 연결하는 방법을 참조하세요.

Important

Elastic Premium 및 소비 계획은 콘텐츠 공유에 Azure Files를 사용하며, Azure Files는 현재 관리 ID 기반 연결을 지원하지 않습니다. 이 제한으로 인해 이러한 플랜에는 스토리지 계정에 대한 공유 키 액세스가 필요하므로 allowSharedKeyAccessfalse으로 설정하지 마십시오. 연결 문자열을 사용해야 하는 경우 키를 직접 저장하는 대신 Azure Key Vault에 저장하고 앱 설정에서 Key Vault 참조 를 사용합니다. Azure Files 종속성을 제거하려면 Azure Files 없이 앱 만들기를 참조하세요.

배포 컨테이너

Flex Consumption 계획에서 실행되는 앱에 배포하려면 Azure Blob Storage의 컨테이너를 배포 원본으로 사용해야 합니다. 기본 스토리지 계정을 사용하거나 별도의 스토리지 계정을 지정할 수 있습니다. 자세한 내용은 배포 설정 구성을 참조하세요.

배포에 사용되는 특정 컨테이너를 포함하여 앱을 만들 때 이 배포 계정을 구성해야 합니다. 배포 구성에 대한 자세한 내용은 배포 원본을 참조하세요.

이 예제에서는 스토리지 계정에서 컨테이너를 만드는 방법을 보여 줍니다.

}

// Azure Functions Flex Consumption
module functionApp 'br/public:avm/res/web/site:0.16.0' = {
  name: 'functionapp'
  scope: rg
  params: {
    kind: 'functionapp,linux'
    name: functionAppName_resolved
    location: location
    tags: union(tags, { 'azd-service-name': 'api' })
    serverFarmResourceId: appServicePlan.outputs.resourceId
    managedIdentities: {
      systemAssigned: true
    }
    functionAppConfig: {
      deployment: {
        storage: {
          type: 'blobContainer'
          value: '${storage.outputs.primaryBlobEndpoint}${deploymentStorageContainerName}'
          authentication: {
            type: 'SystemAssignedIdentity'
          }

이 예제에서는 스토리지 계정에 AVM 사용하여 스토리지 계정과 함께 Blob Storage 컨테이너를 만드는 방법을 보여 줍니다. 컨텍스트의 코드 조각은 이 배포 예제 참조하세요.

앱 자체를 사용하여 다른 배포 설정을 구성합니다.

스토리지 로그 사용

스토리지 계정은 중요한 함수 앱 데이터에 사용되므로 계정에서 해당 콘텐츠의 수정을 모니터링합니다. 스토리지 계정을 모니터링하려면 Azure Storage에 대한 Azure Monitor 리소스 로그를 구성합니다. 이 예제 섹션에서는 myLogAnalytics이라는 Log Analytics 작업 영역을 이러한 로그의 대상으로 사용합니다.

resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2023-05-01' existing = {
  name:'default'
  parent:storageAccountName
}

resource storageDataPlaneLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: '${storageAccountName}-logs'
  scope: blobService
  properties: {
    workspaceId: myLogAnalytics.id
    logs: [
      {
        category: 'StorageWrite'
        enabled: true
      }
    ]
    metrics: [
      {
        category: 'Transaction'
        enabled: true
      }
    ]
  }
}

나중에 정의된 Application Insights 리소스에 대해 동일한 작업 영역을 사용할 수 있습니다. 이러한 로그를 사용하는 방법을 포함하여 자세한 내용은 모니터링 Azure Storage 참조하세요.

Application Insights 만들기

Application Insights를 사용하여 함수 앱 실행을 모니터링합니다. 이제 Application Insights에는 공유할 수 있는 Azure Log Analytics 작업 영역이 필요합니다. 이러한 예제에서는 기존 작업 영역을 사용하고 있으며 작업 영역에 대한 정규화된 리소스 ID를 가지고 있다고 가정합니다. 자세한 내용은 Azure Log Analytics 작업 영역 참조하세요.

이 예제 섹션에서는 형식 Microsoft.Insights/components 및 종류를 web사용하여 Application Insights 리소스를 정의합니다.

resource applicationInsight 'Microsoft.Insights/components@2020-02-02' = {
  name: applicationInsightsName
  location: appInsightsLocation
  tags: tags
  kind: 'web'
  properties: {
    Application_Type: 'web'
    WorkspaceResourceId: '<FULLY_QUALIFIED_RESOURCE_ID>'
  }
}

자세한 컨텍스트는 템플릿 리포지토리의 전체 main.bicep 파일을 참조하세요.

애플리케이션 설정을 사용하여 APPLICATIONINSIGHTS_CONNECTION_STRING 함수 앱에 대한 연결을 제공해야 합니다. 자세한 내용은 애플리케이션 구성을 참조하세요.

이 문서의 예제에서는 만든 인스턴스에 대한 연결 문자열 값을 가져옵니다. 이전 버전에서는 APPINSIGHTS_INSTRUMENTATIONKEY를 대신 사용하여 계측 키를 설정할 수 있었지만 이 키는 더 이상 권장되지 않습니다.

호스팅 계획 만들기

Azure Functions Flex 소비 계획, 프리미엄 플랜 또는 전용(App Service) 계획에서 호스트되는 앱에 대한 호스팅 계획을 명시적으로 정의해야 합니다.

Flex Consumption는 사용량 서버리스 청구 모델을 사용하는 요금을 지불하는 Linux 기반 호스팅 요금제 입니다. 이 요금제는 프라이빗 네트워킹, 인스턴스 메모리 크기 선택 및 향상된 관리 ID 지원을 지원합니다.

Flex Comsuption 사용량은 특별한 유형의 serverfarm 리소스입니다. FC1Name 값을 가진 sku 속성의 tier 속성 값에 FlexConsumption(을)를 사용하여 지정할 수 있습니다.

이 예제 섹션에서는 유연 소비 계획을 만듭니다.

  scaleAndConcurrency: {
    maximumInstanceCount: maximumInstanceCount
    instanceMemoryMB: instanceMemoryMB
  }
  runtime: { 
    name: functionAppRuntime
    version: functionAppRuntimeVersion
  }
}
siteConfig: {
  alwaysOn: false
}
configs: [{
  name: 'appsettings'
  properties:{

이 예제에서는 app Service 계획에 AVM 사용합니다. 컨텍스트의 코드 조각은 이 배포 예제 참조하세요.

Flex Consumption 요금제는 현재 Linux만 지원하므로 reserved 속성도 true(으)로 설정해야 합니다.

프리미엄 계획은 소비 계획과 동일한 크기 조정을 제공하지만, 전용 리소스 및 추가 기능을 포함합니다. 자세한 내용은 Azure Functions Premium Plan 참조하세요.

프리미엄 계획은 특수한 유형의 serverfarm 리소스입니다. 이는 EP1 속성의 EP2 속성 값에 대해 EP3, Name 또는 sku을 사용하여 지정할 수 있습니다. Functions 호스팅 계획을 정의하는 방법은 함수 앱이 Windows 또는 Linux에서 실행되는지에 따라 달라집니다. 이 예제 섹션에서는 EP1 플랜을 만듭니다.

resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: hostingPlanName
  location: location
  sku: {
    name: 'EP1'
    tier: 'ElasticPremium'
    family: 'EP'
  }
  kind: 'elastic'
  properties: {
    maximumElasticWorkerCount: 20
  }
}

자세한 컨텍스트는 템플릿 리포지토리의 전체 main.bicep 파일을 참조하세요.

sku 개체에 대한 자세한 내용은 SkuDefinition을 참조하거나 예제 템플릿을 검토하세요.

전용(App Service) 계획에서 함수 앱은 웹앱과 유사하게 App Service 계획의 기본, 표준 및 프리미엄 SKU의 전용 가상 머신에서 실행됩니다. 자세한 내용은 전용 계획을 참조하세요.

샘플 Bicep 파일 및 Azure Resource Manager 템플릿을 보려면 Azure App Service 계획의 Function App을 참조하세요.

Functions에서 전용 계획은 serverfarm 리소스로 정의되는 일반 App Service 계획일 뿐입니다. 최소한 name 값을 제공해야 합니다. 지원되는 플랜 이름 목록은 전용 플랜에 지원되는 현재 값 목록에 대한 --skuaz appservice plan create 설정을 참조하세요.

호스팅 계획을 정의하는 방법은 함수 앱이 Windows 또는 Linux에서 실행되는지에 따라 달라집니다.

resource hostingPlanName 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: hostingPlanName
  location: location
  sku: {
    tier: 'Standard'
    name: 'S1'
    size: 'S1'
    family: 'S'
    capacity: 1
  }
}

자세한 컨텍스트는 템플릿 리포지토리의 전체 main.bicep 파일을 참조하세요.

호스팅 계획 만들기

사용량 호스팅 계획 리소스는 명시적으로 정의할 필요가 없습니다. 이 리소스 정의를 건너뛰면 함수 앱 리소스 자체를 만들 때 포털에서 지역별로 계획을 자동으로 만들거나 선택합니다.

소비 계획을 특수한 유형의 serverfarm 리소스로 명시적으로 정의할 수 있습니다. computeModesku 속성을 Dynamic로 설정합니다. 이 예제 섹션에서는 사용량 플랜을 명시적으로 정의하는 방법을 보여줍니다. 호스팅 계획을 정의하는 방법은 함수 앱이 Windows 또는 Linux에서 실행되는지에 따라 달라집니다.

resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: hostingPlanName
  location: location
  sku: {
    name: 'Y1'
    tier: 'Dynamic'
    size: 'Y1'
    family: 'Y'
    capacity: 0
  }
  properties: {
    computeMode: 'Dynamic'
  }
}

자세한 컨텍스트는 템플릿 리포지토리의 전체 main.bicep 파일을 참조하세요.

함수 앱 만들기

함수 앱 리소스를 Microsoft.Web/sites 유형의 리소스로 정의하고, kind 속성에 functionapp를 포함시킵니다.

함수 앱 리소스를 정의하는 방법은 Linux 또는 Windows에서 호스팅하는지 여부에 따라 달라집니다.

Windows 실행할 때 필요한 애플리케이션 설정 목록은 Application 구성 참조하세요. 샘플 Bicep 파일 또는 Azure Resource Manager 템플릿은 소비 계획 템플릿에서 Windows에서 호스트되는 함수 앱을 참조하세요.

Windows 실행할 때 필요한 애플리케이션 설정 목록은 Application 구성 참조하세요.

Flex Consumption는 Bicep 및 ARM 템플릿 배포에 사용되는 많은 표준 애플리케이션 설정 및 사이트 구성 속성을 대체합니다. 자세한 내용은 애플리케이션 구성을 참조하세요.

        AzureWebJobsStorage__blobServiceUri: 'https://${storage.outputs.name}.blob.${environment().suffixes.storage}'
        AzureWebJobsStorage__queueServiceUri: 'https://${storage.outputs.name}.queue.${environment().suffixes.storage}'
        AzureWebJobsStorage__tableServiceUri: 'https://${storage.outputs.name}.table.${environment().suffixes.storage}'

        // Application Insights settings are always included
        APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.outputs.connectionString
        APPLICATIONINSIGHTS_AUTHENTICATION_STRING: 'Authorization=AAD'
    }
    }]
  }
}

// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
  name: 'rbacAssignments'
  scope: rg
  params: {
    storageAccountName: storage.outputs.name
    appInsightsName: applicationInsights.outputs.name
    managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
    userIdentityPrincipalId: principalId
    allowUserIdentityPrincipal: !empty(principalId)
  }
}

// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString

이 예제에서는 함수 앱에 AVM 사용합니다. 컨텍스트의 코드 조각은 이 배포 예제 참조하세요.

Note

필요에 따라 사용량 플랜을 정의하도록 선택하는 경우 플랜의 리소스 ID를 가리키도록 앱에서 serverFarmId 속성을 설정해야 합니다. 함수 앱에 계획도 참조하는 dependsOn 설정이 있는지 확인합니다. 플랜을 명시적으로 정의하지 않은 경우 플랜을 만듭니다.

플랜의 리소스 ID를 가리키도록 앱에서 serverFarmId 속성을 설정합니다. 함수 앱에 계획도 참조하는 dependsOn 설정이 있는지 확인합니다.

resource functionAppName_resource 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlanName.id
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'WEBSITE_CONTENTSHARE'
          value: toLower(functionAppName)
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~20'
        }
      ]
    }
  }
}

전체 엔드 투 엔드 예제는 이 main.bicep 파일 참조하세요.

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlan.id
    siteConfig: {
      alwaysOn: true
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~20'
        }
      ]
    }
  }
}

전체 엔드 투 엔드 예제는 이 main.bicep 파일 참조하세요.

배포 소스

linuxFxVersion 사이트 설정을 사용하여 만들 때 앱에 배포할 특정 Linux 컨테이너를 요청합니다. 프라이빗 리포지토리의 이미지에 액세스하려면 더 많은 설정이 필요합니다. 자세한 내용은 애플리케이션 구성을 참조하세요.

Important

사용자 고유의 컨테이너를 만들 때 컨테이너의 기본 이미지를 지원되는 최신 기본 이미지로 업데이트해야 합니다. Azure Functions 지원되는 기본 이미지는 언어별로 다릅니다. Azure Functions 기본 이미지 리포지토리 참조하세요.

Functions 팀은 이러한 기본 이미지에 대한 월별 업데이트를 게시하기 위해 최선을 다하고 있습니다. 정기 업데이트에는 Functions 런타임 및 언어 모두에 대한 최신 부 버전 업데이트 및 보안 수정 사항이 포함됩니다. 정기적으로 최신 기본 이미지에서 컨테이너를 업데이트하고 업데이트된 버전의 컨테이너를 다시 배포해야 합니다. 자세한 내용은 사용자 지정 컨테이너 유지 관리를 참조하세요.

Bicep 파일 또는 ARM 템플릿은 필요에 따라 함수 코드에 대한 배포를 정의할 수도 있습니다. 이 배포에는 다음 방법이 포함될 수 있습니다.

Flex 소비 계획은 배포 컨테이너라고 하는 Blob Storage 컨테이너의 압축 패키지 파일에 프로젝트 코드를 유지 관리합니다. 배포에 사용되는 스토리지 계정과 컨테이너를 모두 구성할 수 있습니다. 자세한 내용은 배포를 참조 하세요.

배포 컨테이너에 코드 패키지를 게시하려면 하나의 배포 를 사용해야 합니다. ARM 템플릿 또는 Bicep 배포 중에 확장을 사용하는 /onedeploy 이 단계를 수행할 수 있습니다. 대신 패키지를 컨테이너에 직접 업로드하도록 선택하면 패키지가 자동으로 배포되지 않습니다.

배포 컨테이너

의 사이트 설정에서 배포에 사용되는 특정 스토리지 계정, 컨테이너, 인증 방법 및 자격 증명을 요소 안에 설정합니다. 앱을 만들 때 컨테이너 및 애플리케이션 설정이 있어야 합니다. 스토리지 컨테이너를 만드는 방법의 예는 배포 컨테이너를 참조하세요.

이 예제에서는 시스템 할당 관리 ID를 사용하여 지정된 Blob Storage 컨테이너에 액세스합니다. 이 컨테이너는 배포의 다른 위치에서 만들어집니다.

// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
  name: 'rbacAssignments'
  scope: rg
  params: {
    storageAccountName: storage.outputs.name
    appInsightsName: applicationInsights.outputs.name
    managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
    userIdentityPrincipalId: principalId
    allowUserIdentityPrincipal: !empty(principalId)
  }
}

// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString

이 예제에서는 함수 앱에 AVM 사용합니다. 컨텍스트의 코드 조각은 이 배포 예제 참조하세요.

관리 ID를 사용하는 경우 다음 예제와 같이 ID를 사용하여 함수 앱이 스토리지 계정에 액세스할 수 있도록 설정해야 합니다.

module storageRoleAssignment_User 'br/public:avm/ptn/authorization/resource-role-assignment:0.1.2' = if (allowUserIdentityPrincipal && !empty(userIdentityPrincipalId)) {
  name: 'storageRoleAssignment-User-${uniqueString(storageAccount.id, userIdentityPrincipalId)}'
  params: {
    resourceId: storageAccount.id
    roleDefinitionId: roleDefinitions.storageBlobDataOwner
    principalId: userIdentityPrincipalId
    principalType: 'User'
    description: 'Storage Blob Data Owner role for user identity (development/testing)'
    roleName: 'Storage Blob Data Owner'
  }
}

이 예제에서는 리소스 범위 역할 할당에 AVM 사용합니다. 컨텍스트의 코드 조각은 이 배포 예제 참조하세요.

이 예제에서는 할당하는 역할에 대한 GUID 값을 알아야 합니다. 친숙한 역할 이름에 대해 이 ID 값을 가져오려면 다음 예제와 같이 az role definition list 명령을 사용합니다.

az role definition list --output tsv --query "[?roleName=='Storage Blob Data Owner'].{name:name}"

연결 문자열을 관리 ID 대신 사용하는 경우, authentication.typeStorageAccountConnectionString로 설정하고, 배포 스토리지 계정 연결 문자열이 포함된 애플리케이션 설정의 이름을 authentication.storageAccountConnectionStringName로 설정합니다.

배포 패키지

Flex 소비 계획은 코드 프로젝트를 배포하는 데 하나의 배포 를 사용합니다. 코드 패키지 자체는 다른 Functions 호스팅 계획에서 zip 배포에 사용하는 패키지와 동일합니다. 그러나 패키지 파일의 이름은 .이어야 released-package.zip합니다.

템플릿에 하나의 배포 패키지를 포함하려면 배포 패키지가 포함된 원격 URL에 대한 /onedeploy 리소스 정의를 사용합니다. Functions 호스트는 이 원격 패키지 원본과 배포 컨테이너 모두에 액세스할 수 있어야 합니다.

이 예제에서는 기존 앱에 하나의 배포 원본을 추가합니다.

@description('The name of the function app.')
param functionAppName string

@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location

@description('The zip content URL for released-package.zip.')
param packageUri string

resource functionAppName_OneDeploy 'Microsoft.Web/sites/extensions@2022-09-01' = {
  name: '${functionAppName}/onedeploy'
  location: location
  properties: {
    packageUri: packageUri
    remoteBuild: false 
  }
}

Bicep 파일 또는 ARM 템플릿은 필요에 따라 zip 배포 패키지를 사용하여 함수 코드에 대한 배포를 정의할 수도 있습니다.

Azure Resource Manager를 사용하여 애플리케이션을 성공적으로 배포하려면 Azure에서 리소스를 배포하는 방법을 이해해야 합니다. 대부분의 예제에서는 .를 사용하여 siteConfig최상위 구성을 적용합니다. 이러한 구성은 Functions 런타임 및 배포 엔진에 정보를 전달하므로 최상위 수준으로 설정합니다. 배포 엔진은 자식 sourcecontrols/web 리소스를 적용하기 전에 최상위 정보가 필요합니다. 자식 수준 config/appSettings 리소스에서 이러한 설정을 구성할 수 있지만 경우에 따라 함수 앱을 배포 해야 config/appSettings 있습니다.

Zip 배포 패키지

Zip 배포는 함수 앱 코드를 배포하는 권장 방법입니다. 기본적으로 zip 배포를 사용하는 함수는 배포 패키지 자체에서 실행됩니다. 배포 패키지에 대한 요구 사항을 비롯한 자세한 내용은 Azure Functions용 Zip 배포를 참조하세요. 리소스 배포 자동화를 사용하는 경우 Bicep 또는 ARM 템플릿에서 .zip 배포 패키지를 참조할 수 있습니다.

템플릿에서 zip 배포를 사용하려면 앱의 WEBSITE_RUN_FROM_PACKAGE 설정을 1로 설정하고 /zipDeploy 리소스 정의를 포함합니다.

Linux 사용 플랜에서는 대신 WEBSITE_RUN_FROM_PACKAGE설정에 배포 패키지의 URI를 직접 지정하며, 이 예제 템플릿에서처럼 구성합니다.

다음 예제에서는 zip 배포 원본을 기존 앱에 추가합니다.

@description('The name of the function app.')
param functionAppName string

@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location

@description('The zip content url.')
param packageUri string

resource functionAppName_ZipDeploy 'Microsoft.Web/sites/extensions@2024-04-01' = {
  name: '${functionAppName}/ZipDeploy'
  location: location
  properties: {
    packageUri: packageUri
  }
}

템플릿에 zip 배포 리소스를 포함할 때는 다음 사항을 고려해야 합니다.

  • 함수 packageUri 가 액세스할 수 있는 위치여야 합니다. SAS(공유 액세스 서명)와 함께 Azure Blob Storage를 사용하는 것이 좋습니다. SAS가 만료되면 배포를 위해 Functions에서 더 이상 공유에 액세스할 수 없습니다. SAS를 다시 생성하는 경우 WEBSITE_RUN_FROM_PACKAGE 설정을 새 URI 값으로 업데이트해야 합니다.

  • WEBSITE_RUN_FROM_PACKAGE을(를) URI로 설정할 때는 트리거를 수동으로 동기화해야 합니다.

  • 설정을 추가하거나 업데이트할 때 컬렉션의 appSettings 모든 필수 애플리케이션 설정을 항상 설정합니다. 업데이트는 명시적으로 설정하지 않은 기존 설정을 제거합니다. 자세한 내용은 애플리케이션 구성을 참조하세요.

  • Functions는 패키지 배포에 대한 웹 배포(msdeploy)를 지원하지 않습니다. 대신 배포 파이프라인 및 자동화에서 zip 배포를 사용해야 합니다. 자세한 내용은 Azure Functions의 Zip 배포를 참조하세요.

원격 빌드

배포 프로세스에서는 사용하는 .zip 파일 또는 zip 배포에 즉시 실행 가능한 앱이 포함되어 있다고 가정합니다. 이 가정은 기본적으로 사용자 지정이 실행되지 않음을 의미합니다.

일부 시나리오에서는 앱을 원격으로 다시 빌드해야 합니다. 한 가지 예는 Windows 컴퓨터에서 개발한 Python 또는 Node.js 앱에 Linux 관련 패키지를 포함해야 하는 경우입니다. 이 경우 zip 배포 후 코드에서 원격 빌드를 수행하도록 Functions를 구성할 수 있습니다.

원격 빌드를 요청하는 방법은 배포하는 운영 체제에 따라 달라집니다.

Windows에 앱을 배포할 때 배포 프로세스는 C# 앱 또는 dotnet restore Node.js 앱과 같은 npm install 언어별 명령을 실행합니다.

지속적인 통합을 통해 얻을 수 있는 동일한 빌드 프로세스를 사용하도록 설정하려면, 배포 코드의 애플리케이션 설정에 SCM_DO_BUILD_DURING_DEPLOYMENT=true를 추가하고, WEBSITE_RUN_FROM_PACKAGE 설정을 완전히 제거하세요.

Linux 컨테이너

Azure Functions Premium 또는 Dedicated 플랜에 containerized 함수 앱 배포하는 경우 다음을 수행해야 합니다.

일부 설정이 누락된 경우 다음 HTTP/500 오류로 애플리케이션 프로비저닝이 실패할 수 있습니다.

Function app provisioning failed.

자세한 내용은 애플리케이션 구성을 참조하세요.

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    serverFarmId: hostingPlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'node'
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~20'
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_URL'
          value: dockerRegistryUrl
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_USERNAME'
          value: dockerRegistryUsername
        }
        {
          name: 'DOCKER_REGISTRY_SERVER_PASSWORD'
          value: dockerRegistryPassword
        }
        {
          name: 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'
          value: 'false'
        }
      ]
      linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
    }
  }
  dependsOn: [
    storageAccount
  ]
}

Azure Container Apps에 컨테이너화된 함수를 배포하는 경우 템플릿은 다음을 충족해야 합니다.

  • kind 필드를 functionapp,linux,container,azurecontainerapps 값으로 설정합니다.
  • managedEnvironmentId 사이트 속성을 Container Apps 환경의 정규화된 URI로 설정합니다.
  • 사이트와 동시에 dependsOn 리소스를 만들 때 사이트의 Microsoft.App/managedEnvironments 컬렉션에 리소스 링크를 추가합니다.

프라이빗 컨테이너 레지스트리에서 기존 Container Apps 환경으로 배포된 컨테이너화된 함수 앱의 정의는 다음 예제와 같습니다.

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  kind: 'functionapp,linux,container,azurecontainerapps'
  location: location
  properties: {
    serverFarmId: hostingPlanName
    siteConfig: {
      linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
      appSettings: [
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsightsName.properties.ConnectionString
        }
      ]
    }
    managedEnvironmentId: managedEnvironmentId
  }
  dependsOn: [
    storageAccount
    hostingPlan
  ]
}

애플리케이션 구성

Flex 소비 계획에서는 두 가지 유형의 속성을 사용하여 Azure 함수 앱을 구성합니다.

Configuration Microsoft.Web/sites 속성
애플리케이션 구성 functionAppConfig
애플리케이션 설정 siteConfig.appSettings 컬렉션

애플리케이션 구성을 다음에서 관리합니다.functionAppConfig

Behavior functionAppConfig에서 설정
상시 준비된 인스턴스 scaleAndConcurrency.alwaysReady
배포 원본 deployment
인스턴스 크기 scaleAndConcurrency.instanceMemoryMB
HTTP 트리거 동시성 scaleAndConcurrency.triggers.http.perInstanceConcurrency
언어 실행 환경 runtime.name
언어 버전 runtime.version
최대 인스턴스 수 scaleAndConcurrency.maximumInstanceCount
사이트 업데이트 전략 siteUpdateStrategy.type

Flex Consumption 요금제는 다음과 같은 애플리케이션 설정도 지원합니다.

함수는 Azure 함수 앱을 구성하기 위한 다음 옵션을 제공합니다.

Configuration Microsoft.Web/sites 속성
사이트 설정 siteConfig
애플리케이션 설정 siteConfig.appSettings 컬렉션

이러한 사이트 설정은 siteConfig 속성에 필요합니다.

이러한 사이트 설정은 관리 ID를 사용하여 Azure Container Registry 인스턴스에서 이미지를 가져오는 경우에만 필요합니다.

다음 애플리케이션 설정은 특정 운영 체제 및 호스팅 옵션에 필요하거나 권장됩니다.

다음 애플리케이션 설정은 컨테이너 배포에 필요합니다.

다음 설정은 프라이빗 컨테이너 레지스트리에서 배포하는 경우에만 필요합니다.

Bicep 파일 또는 ARM 템플릿을 사용하여 사이트 및 애플리케이션 설정을 사용할 때는 다음 사항을 염두에 두어야 합니다.

  • 선택적 alwaysReady 설정에는 하나 이상의 {name,instanceCount} 개체 배열이 포함되며, 각 함수별 배율 그룹에 하나씩 포함됩니다. 이러한 스케일 그룹은 항시 준비된 스케일 결정을 내립니다. 이 예제에서는 그룹화되지 않은 트리거 형식인 http 그룹 및 helloworld라는 단일 함수 모두에 대해 항상 준비된 개수를 설정합니다.
      alwaysReady: [
        {
          name: 'http'
          instanceCount: 2
        }
        {
          name: 'function:helloworld'
          instanceCount: 1
        }
      ]
    
  • 자동화된 배포에서 WEBSITE_CONTENTSHARE를 언제 설정해야 할지 고려하십시오. 자세한 지침은 WEBSITE_CONTENTSHARE 참조를 참조하세요.
  • 이 문서의 예제와 같이 애플리케이션 설정을 항상 작성 중인 리소스의 Microsoft.Web/sites 컬렉션으로 정의합니다. 이 정의는 함수 앱을 실행하는 데 필요한 설정을 초기 시작 시 사용할 수 있도록 보장합니다.

  • 템플릿을 사용하여 애플리케이션 설정을 추가하거나 업데이트하는 경우 업데이트에 모든 기존 설정을 포함해야 합니다. 기본 업데이트 REST API 호출에서 전체 /config/appsettings 리소스를 대체하므로 이 작업을 수행해야 합니다. 기존 설정을 제거하면 함수 앱이 실행되지 않습니다. 개별 애플리케이션 설정을 프로그래밍 방식으로 업데이트하려면 대신 Azure CLI, Azure PowerShell 또는 Azure 포털을 사용하여 이러한 변경을 수행할 수 있습니다. 자세한 내용은 애플리케이션 설정 작업을 참조하세요.

  • 가능한 경우, AzureWebJobsStorage 연결을 포함하여 다른 Azure 서비스에 대한 관리 ID 기반 연결을 사용합니다. 자세한 내용은 ID 기반 연결 구성을 참조하세요.

슬롯 배포

Functions를 사용하면 다양한 버전의 코드를 함수 앱의 고유한 엔드포인트에 배포할 수 있습니다. 이 옵션을 사용하면 프로덕션에서 실행되는 함수에 영향을 주지 않고 함수 업데이트를 더 쉽게 개발하고, 유효성 검사를 하고 및 배포할 수 있습니다. 배포 슬롯은 Azure App Service 기능입니다. 사용 가능한 슬롯 수는 호스팅 계획에 따라 달라집니다. 자세한 내용은 Azure Functions 배포 슬롯 참조하세요.

함수 앱 리소스()Microsoft.Web/sites와 동일한 방식으로 슬롯 리소스를 정의하지만 대신 리소스 식별자를 사용합니다 Microsoft.Web/sites/slots . 프리미엄 계획에서 프로덕션 슬롯과 스테이징 슬롯을 모두 만드는 배포(Bicep 및 ARM 템플릿 둘 다)에 대한 예제는 Azure 배포 슬롯이 있는 함수 앱 참조하세요.

템플릿을 사용하여 슬롯을 교환하는 방법에 대한 자세한 내용은 Resource Manager 템플릿으로 자동화를 참조하세요.

슬롯 배포 작업을 사용하는 경우 다음 고려 사항에 유의하세요.

  • 배포 슬롯 정의에서 WEBSITE_CONTENTSHARE 설정을 명시적으로 설정하지 않습니다. 배포 슬롯의 앱 만들기 프로세스는 이 설정을 생성합니다.

  • 슬롯을 교환하는 경우 일부 애플리케이션 설정은 교환되는 코드가 아니라 슬롯에 유지된다는 점에서 "고정"된 설정으로 간주됩니다. 템플릿의 특정 애플리케이션 설정 정의에 포함 "slotSetting":true 시켜 이러한 슬롯 설정을 정의할 수 있습니다. 자세한 내용은 설정 관리를 참조하세요.

보안 배포

가상 네트워크와 통합하여 하나 이상의 리소스를 보호하는 배포에서 함수 앱을 만들 수 있습니다. 리소스는 Microsoft.Web/sites/networkConfig 함수 앱에 대한 가상 네트워크 통합을 정의합니다. 이 통합은 참조되는 함수 앱과 가상 네트워크 리소스에 따라 달라집니다. 함수 앱은 프라이빗 엔드포인트 및 경로와 같은 다른 프라이빗 네트워킹 리소스를 사용할 수도 있습니다. 자세한 내용은 Azure Functions 네트워킹 옵션 참조하세요.

이러한 프로젝트는 네트워크 액세스 제한을 포함하여 가상 네트워크에 함수 앱을 배포하는 방법에 대한 Bicep 기반 예제를 제공합니다.

보안 스토리지 계정을 사용하는 배포를 만들 때 설정을 명시적으로 설정하고 WEBSITE_CONTENTSHARE 이 설정에 명명된 파일 공유 리소스를 만들어야 합니다. 반드시 이 예제 (ARM 템플릿|Bicep 파일)에 표시된 대로 WEBSITE_CONTENTSHARE의 값을 사용하여 Microsoft.Storage/storageAccounts/fileServices/shares 리소스를 생성해야 합니다. 또한 사이트 속성을 vnetContentShareEnabled true로 설정해야 합니다.

Note

이러한 설정이 보안 스토리지 계정을 사용하는 배포의 일부가 아닌 경우 배포 유효성 검사 중에 Could not access storage account using provided connection string 오류가 표시됩니다.

이러한 프로젝트는 네트워크 액세스 제한을 포함하여 가상 네트워크에 함수 앱을 배포하는 방법에 대한 Bicep 및 ARM 템플릿 예제를 모두 제공합니다.

제한된 시나리오 Description
가상 네트워크 통합을 사용하여 함수 앱 만들기 해당 네트워크의 리소스에 대한 모든 권한이 있는 가상 네트워크에서 함수 앱을 만듭니다. 함수 앱에 대한 인바운드 및 아웃바운드 액세스는 제한되지 않습니다. 자세한 내용은 가상 네트워크 통합을 참조하세요.
보안 스토리지 계정에 액세스하는 함수 앱을 만듭니다 만든 함수 앱은 Functions에서 프라이빗 엔드포인트를 사용하여 액세스하는 보안 스토리지 계정을 사용합니다. 자세한 내용은 스토리지 계정을 가상 네트워크로 제한을 참조하세요.
모두 프라이빗 엔드포인트를 사용하는 함수 앱 및 스토리지 계정을 만듭니다 만든 함수 앱은 프라이빗 엔드포인트를 통해서만 액세스할 수 있으며, 프라이빗 엔드포인트를 사용하여 스토리지 리소스에 액세스합니다. 자세한 내용은 프라이빗 엔드포인트를 참조하세요.

제한된 네트워크 설정

함수 앱에 네트워크 제한이 있는 경우 다음 설정을 사용해야 할 수도 있습니다.

Setting Value Description
WEBSITE_CONTENTOVERVNET 1 스토리지 계정이 가상 네트워크로 제한되면 함수 앱의 크기를 조정할 수 있도록 하는 애플리케이션 설정입니다. 자세한 내용은 스토리지 계정을 가상 네트워크로 제한을 참조하세요.
vnetrouteallenabled 1 함수 앱의 모든 트래픽에서 가상 네트워크를 사용하도록 강제하는 사이트 설정입니다. 자세한 내용은 지역 가상 네트워크 통합을 참조하세요. 이 사이트 설정은 WEBSITE_VNET_ROUTE_ALL 애플리케이션 설정을 대체합니다.

네트워크 제한에 대한 고려 사항

프라이빗 엔드포인트를 통해 스토리지 계정에 대한 액세스를 제한하는 경우 포털 또는 가상 네트워크 외부의 디바이스를 통해 스토리지 계정에 액세스할 수 없습니다. 기본 네트워크 액세스 규칙을 관리하여 스토리지 계정의 보안 IP 주소 또는 가상 네트워크에 대한 액세스 권한을 부여할 수 있습니다.

함수 액세스 키

호스트 수준 함수 액세스 키를 Azure 리소스로 정의합니다. 이 방법을 사용하면 ARM 템플릿 및 Bicep 파일에서 호스트 키를 만들고 관리할 수 있습니다. 호스트 키는 Microsoft.Web/sites/host/functionKeys 형식의 리소스로 정의됩니다. 다음 예제에서는 함수 앱을 만들 때 명명된 my_custom_key 호스트 수준 액세스 키를 만듭니다.

resource functionKey 'Microsoft.Web/sites/host/functionKeys@2022-09-01' = {
  name: '${parameters('name')}/default/my_custom_key'
  properties: {
    name: 'my_custom_key'
  }
  dependsOn: [
    resourceId('Microsoft.Web/Sites', parameters('name'))
  ]
}

이 예제에서 name 매개 변수는 새 함수 앱의 이름입니다. 새 함수 앱을 사용하여 키가 생성되도록 하려면 dependsOn 설정을 포함해야 합니다. 마지막으로 호스트 키의 개체는 특정 키를 설정하는 데 사용할 수 있는 속성이 포함될 수 있습니다.

value 속성을 설정하지 않으면 리소스를 만들 때 함수가 자동으로 새 키를 생성하는 것이 좋습니다. 액세스 키에 대한 자세한 내용과 액세스 키 작업 시의 보안 모범 사례는 Azure Functions에서 액세스 키 사용하기를 참조하세요.

템플릿 만들기

Bicep 또는 ARM 템플릿을 사용하는 전문가는 간단한 텍스트 편집기를 사용하여 배포를 수동으로 코딩할 수 있습니다. 나머지의 경우 몇 가지 옵션을 통해 개발 프로세스를 더 쉽게 수행할 수 있습니다.

  • Visual Studio Code: Bicep 파일ARM 템플릿을 모두 사용하는 데 도움이 되는 확장을 사용할 수 있습니다. 이러한 도구를 사용하여 코드가 올바른지 확인합니다. 몇 가지 기본적인 유효성 검사를 제공합니다.

  • Azure 포털: 포털에서 함수 앱 및 관련 리소스를 생성할 때 최종 리뷰 + 만들기 화면에는 자동화용 템플릿 다운로드 링크가 있습니다.

    Azure 포털의 Azure Functions 생성 프로세스에서 템플릿 링크를 다운로드합니다.

    이 링크는 포털에서 선택한 옵션에 따라 생성된 ARM 템플릿을 보여줍니다. 이 템플릿은 많은 새 리소스가 있는 함수 앱을 만들 때 약간 복잡해 보일 수 있습니다. 그러나 ARM 템플릿의 모양에 대한 좋은 참조를 제공할 수 있습니다.

템플릿 유효성 검사

배포 템플릿 파일을 수동으로 만드는 경우 배포하기 전에 템플릿의 유효성을 검사해야 합니다. 모든 배포 메서드는 템플릿 구문의 유효성을 검사하고, 다음 JSON 형식 예제와 같이 validation failed 오류 메시지를 발생시킵니다.

{"error":{"code":"InvalidTemplate","message":"Deployment template validation failed: 'The resource 'Microsoft.Web/sites/func-xyz' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.","additionalInfo":[{"type":"TemplateViolation","info":{"lineNumber":0,"linePosition":0,"path":""}}]}}

배포하기 전에 템플릿의 유효성을 검사하려면 다음 방법을 사용합니다.

다음 Azure 리소스 그룹 배포 v2 작업deploymentMode: 'Validation' 템플릿의 유효성을 검사하도록 Azure Pipelines 지시합니다.

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    subscriptionId: # Required subscription ID
    action: 'Create Or Update Resource Group'
    resourceGroupName: # Required resource group name
    location: # Required when action == Create Or Update Resource Group
    templateLocation: 'Linked artifact'
    csmFile: # Required when  TemplateLocation == Linked Artifact
    csmParametersFile: # Optional
    deploymentMode: 'Validation'

테스트 리소스 그룹을 만들어 실행 전배포 오류를 찾을 수도 있습니다.

템플릿 배포

다음 방법 중 어느 것을 사용하여 Bicep 파일 및 템플릿을 배포합니다.

Azure로 배포 버튼

Note

이 메서드는 현재 Bicep 파일 배포를 지원하지 않습니다.

<url-encoded-path-to-azuredeploy-json>을 GitHub에 있는 파일의 원본 경로를 azuredeploy.json 버전으로 바꿉니다.

markdown을 사용하는 예는 다음과 같습니다.

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

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을 사용하여 배포

다음 PowerShell 명령은 리소스 그룹을 만들고 필요한 리소스를 사용하여 함수 앱을 만드는 Bicep 파일 또는 ARM 템플릿을 배포합니다. 명령을 로컬로 실행하려면 Azure PowerShell 이 설치되어 있어야 합니다. Azure에 로그인하려면 먼저 실행 Connect-AzAccount합니다.

# 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'

# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile main.bicep  -Verbose

이 배포를 테스트하려면, Windows에서 소비 계획으로 함수 앱을 만드는 이와 같은 템플릿을 사용하세요.

다음 단계

Azure Functions 개발하고 구성하는 방법에 대해 자세히 알아봅니다.