Mengotomatiskan penyebaran sumber daya untuk aplikasi fungsi Anda di Azure Functions

Anda dapat menggunakan file Bicep atau templat Azure Resource Manager untuk mengotomatiskan proses penyebaran aplikasi fungsi ke sumber daya Azure baru atau yang sudah ada. Otomatisasi tersebut menyediakan cara yang bagus untuk dapat mengintegrasikan penyebaran sumber daya Anda dengan kode sumber Anda di DevOps, memulihkan aplikasi fungsi dan sumber daya terkait dari cadangan, atau menyebarkan topologi aplikasi beberapa kali.

Artikel ini memperlihatkan kepada Anda cara mengotomatiskan pembuatan sumber daya dan penyebaran untuk Azure Functions. Bergantung pada pemicu dan pengikatan yang digunakan oleh fungsi Anda, Anda mungkin perlu menyebarkan sumber daya lain, yang berada di luar cakupan artikel ini.

Kode templat tertentu bergantung pada bagaimana aplikasi fungsi Anda dihosting, baik Anda menyebarkan kode atau aplikasi fungsi dalam kontainer, dan sistem operasi yang digunakan oleh aplikasi Anda. Artikel ini mendukung opsi hosting berikut:

Opsi Hosting Jenis penyebaran Untuk mempelajari selengkapnya, lihat...
Paket Konsumsi Azure Functions Kode-saja Paket Konsumsi
Paket Azure Functions Elastic Premium Kode | Wadah Paket premium
Paket Azure Functions Dedicated (App Service) Kode | Wadah Paket khusus
Azure Container Apps Hanya kontainer Hosting Aplikasi Kontainer Azure Functions
Azure Arc Kode | Wadah App Service, Functions, dan Logic Apps pada Azure Arc (Pratinjau)

Sumber daya yang diperlukan

Penyebaran yang dihosting Azure Functions biasanya terdiri dari sumber daya ini:

Sumber daya Persyaratan Referensi sintaks dan properti
Akun penyimpanan Diperlukan Microsoft.Storage/storageAccounts
Komponen Application Insights Disarankan Microsoft.Insights/components
Paket hosting Diperlukan1 Microsoft.Web/serverfarms
Aplikasi fungsi Diperlukan Microsoft.Web/sites

Penyebaran Azure Functions untuk paket Konsumsi biasanya terdiri dari sumber daya ini:

Sumber daya Persyaratan Referensi sintaks dan properti
Akun penyimpanan Diperlukan Microsoft.Storage/storageAccounts
Komponen Application Insights Disarankan Microsoft.Insights/components
Aplikasi fungsi Diperlukan Microsoft.Web/sites

Penyebaran yang dihosting Azure Container Apps biasanya terdiri dari sumber daya ini:

Sumber daya Persyaratan Referensi sintaks dan properti
Akun penyimpanan Diperlukan Microsoft.Storage/storageAccounts
Komponen Application Insights Disarankan Microsoft.Insights/components
Lingkungan terkelola Diperlukan Microsoft.App/managedEnvironments
Aplikasi fungsi Diperlukan Microsoft.Web/sites

Penyebaran yang dihosting Azure Arc biasanya terdiri dari sumber daya ini:

Sumber daya Persyaratan Referensi sintaks dan properti
Akun penyimpanan Diperlukan Microsoft.Storage/storageAccounts
Komponen Application Insights Disarankan Microsoft.Insights/components
Lingkungan App Service Kubernetes Diperlukan Microsoft.ExtendedLocation/customLocations
Aplikasi fungsi Diperlukan Microsoft.Web/sites

1Paket hosting eksplisit tidak diperlukan saat Anda memilih untuk menghosting aplikasi fungsi Anda dalam paket Konsumsi.

Saat Anda menyebarkan beberapa sumber daya dalam satu file Bicep atau templat ARM, urutan pembuatan sumber daya penting. Persyaratan ini adalah hasil dari dependensi antar sumber daya. Untuk dependensi tersebut dependsOn , pastikan untuk menggunakan elemen untuk menentukan dependensi dalam sumber daya dependen. Untuk informasi selengkapnya, lihat Menentukan urutan untuk menyebarkan sumber daya dalam templat ARM atau Dependensi sumber daya di Bicep.

Artikel ini mengasumsikan bahwa Anda memiliki pemahaman dasar tentang membuat file Bicep atau menulis templat Azure Resource Manager, dan contoh ditampilkan sebagai bagian individual untuk sumber daya tertentu. Untuk serangkaian contoh lengkap file Bicep dan templat ARM, lihat contoh penyebaran aplikasi fungsi ini.

Prasyarat

Artikel ini mengasumsikan bahwa Anda telah membuat lingkungan terkelola di Azure Container Apps. Anda memerlukan nama dan ID lingkungan terkelola untuk membuat aplikasi fungsi yang dihosting di Container Apps.

Artikel ini mengasumsikan bahwa Anda telah membuat lokasi kustom dengan dukungan App Service pada kluster Kubernetes dengan dukungan Azure Arc. Anda memerlukan ID lokasi kustom dan ID lingkungan Kubernetes untuk membuat aplikasi fungsi yang dihosting di lokasi kustom Azure Arc.

Membuat akun penyimpanan

Semua aplikasi fungsi memerlukan akun penyimpanan Azure. Anda memerlukan akun tujuan umum yang mendukung blob, tabel, antrean, dan file. Untuk informasi selengkapnya, lihat Persyaratan akun penyimpanan Azure Functions.

Penting

Akun penyimpanan digunakan untuk menyimpan data aplikasi penting, terkadang termasuk kode aplikasi itu sendiri. Anda harus membatasi akses dari aplikasi dan pengguna lain ke akun penyimpanan.

Bagian contoh ini membuat akun penyimpanan v2 tujuan umum Standar:

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2022-05-01",
    "name": "[parameters('storageAccountName')]",
    "location": "[parameters('location')]",
    "kind": "StorageV2",
    "sku": {
      "name": "[parameters('storageAccountType')]"
    },
    "properties": {
      "supportsHttpsTrafficOnly": true,
      "defaultToOAuthAuthentication": true
    }
  }
]

Untuk konteks selengkapnya, lihat file azuredeploy.json lengkap di repositori templat.

Anda perlu mengatur string koneksi akun penyimpanan ini sebagai AzureWebJobsStorage pengaturan aplikasi, yang diperlukan Functions. Templat dalam artikel ini membuat nilai string koneksi ini berdasarkan akun penyimpanan yang dibuat, yang merupakan praktik terbaik. Untuk informasi selengkapnya, lihat Konfigurasi aplikasi.

Mengaktifkan log penyimpanan

Karena akun penyimpanan digunakan untuk data aplikasi fungsi penting, Anda harus memantau akun untuk modifikasi konten tersebut. Untuk memantau akun penyimpanan, Anda perlu mengonfigurasi log sumber daya Azure Monitor untuk Azure Storage. Di bagian contoh ini, ruang kerja Analitik Log bernama myLogAnalytics digunakan sebagai tujuan untuk log ini.

"resources": [
  {
    "type": "Microsoft.Insights/diagnosticSettings",
    "apiVersion": "2021-05-01-preview",
    "scope": "[format('Microsoft.Storage/storageAccounts/{0}/blobServices/default', parameters('storageAccountName'))]",
    "name": "[parameters('storageDataPlaneLogsName')]",
    "properties": {
        "workspaceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('myLogAnalytics'))]",
        "logs": [
          {
            "category": "StorageWrite",
            "enabled": true
          }
        ],
        "metrics": [
          {
            "category": "Transaction",
            "enabled": true
          }
        ]
    }
  }
]

Ruang kerja yang sama ini dapat digunakan untuk sumber daya Application Insights yang ditentukan nanti. Untuk informasi selengkapnya, termasuk cara bekerja dengan log ini, lihat Memantau Azure Storage.

Membuat Application Insights

Application Insights direkomendasikan untuk memantau eksekusi aplikasi fungsi Anda. Di bagian contoh ini, sumber daya Application Insights didefinisikan dengan jenis Microsoft.Insights/components dan jenisnya web:

{
  "type": "Microsoft.Insights/components",
  "apiVersion": "2020-02-02",
  "name": "[variables('applicationInsightsName')]",
  "location": "[parameters('appInsightsLocation')]",
  "tags": {
    "[format('hidden-link:{0}', resourceId('Microsoft.Web/sites', parameters('functionAppName')))]": "Resource"
  },
  "properties": {
    "Application_Type": "web"
  },
  "kind": "web"
},

Untuk konteks selengkapnya, lihat file azuredeploy.json lengkap di repositori templat.

Koneksi harus disediakan ke aplikasi fungsi menggunakan APPLICATIONINSIGHTS_CONNECTION_STRING pengaturan aplikasi. Untuk informasi selengkapnya, lihat Pengaturan aplikasi.

Contoh dalam artikel ini mendapatkan nilai string koneksi untuk instans yang dibuat. Versi yang lebih lama mungkin digunakan APPINSIGHTS_INSTRUMENTATIONKEY untuk mengatur kunci instrumentasi, yang tidak lagi direkomendasikan.

Membuat paket hosting

Aplikasi yang dihosting dalam paket Azure Functions Premium atau paket Khusus (App Service) harus memiliki paket hosting yang ditentukan secara eksplisit.

Paket Premium menawarkan penskalaan yang sama dengan paket Konsumsi tetapi mencakup sumber daya khusus dan kemampuan ekstra. Untuk mempelajari selengkapnya, lihat Paket Azure Functions Premium.

Paket Premium adalah jenis khusus sumber daya serverfarm. Anda dapat menentukannya dengan menggunakan EP1, , EP2atau EP3 untuk Name nilai properti dalam sku properti . Cara Anda menentukan paket hosting Functions bergantung pada apakah aplikasi fungsi Anda berjalan di Windows atau di Linux. Bagian contoh ini membuat EP1 paket:

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "sku": {
      "name": "EP1",
      "tier": "ElasticPremium",
      "family": "EP"
    },
    "kind": "elastic",
    "properties": {
      "maximumElasticWorkerCount": 20
    }
  }
]

Untuk konteks selengkapnya, lihat file azuredeploy.json lengkap di repositori templat.

Untuk informasi selengkapnya tentang objek, sku lihat SkuDefinition atau tinjau contoh templat.

Dalam paket Khusus (App Service), aplikasi fungsi Anda berjalan pada VM khusus pada SKU Dasar, Standar, dan Premium dalam paket App Service, mirip dengan aplikasi web. Untuk informasi selengkapnya, lihat Paket khusus.

Untuk contoh file Bicep/templat Azure Resource Manager, lihat Aplikasi fungsi di paket Azure App Service

Dalam Functions, paket Khusus hanyalah paket App Service reguler, yang ditentukan oleh sumber daya serverfarm. Anda harus memberikan setidaknya nilainya name . Untuk daftar nama paket yang didukung, lihat --sku pengaturan untuk az appservice plan create daftar nilai yang didukung saat ini untuk paket Khusus.

Cara Anda menentukan paket hosting tergantung pada apakah aplikasi fungsi Anda berjalan di Windows atau di Linux:

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "sku": {
      "tier": "Standard",
      "name": "S1",
      "size": "S1",
      "family": "S",
      "capacity": 1
    }
  }
]

Untuk konteks selengkapnya, lihat file azuredeploy.json lengkap di repositori templat.

Membuat paket hosting

Anda tidak perlu secara eksplisit menentukan sumber daya paket hosting Konsumsi. Saat Anda melewati definisi sumber daya ini, paket secara otomatis dibuat atau dipilih per wilayah saat Anda membuat sumber daya aplikasi fungsi itu sendiri.

Anda dapat secara eksplisit menentukan paket Konsumsi sebagai jenis serverfarm sumber daya khusus, yang Anda tentukan menggunakan nilai Dynamic untuk computeMode properti dan sku . Bagian contoh ini menunjukkan kepada Anda cara menentukan paket konsumsi secara eksplisit. Cara Anda menentukan paket hosting bergantung pada apakah aplikasi fungsi Anda berjalan di Windows atau di Linux.

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

Untuk konteks selengkapnya, lihat file azuredeploy.json lengkap di repositori templat.

Lingkungan Kubernetes

Azure Functions dapat disebarkan ke Kubernetes dengan dukungan Azure Arc baik sebagai proyek kode atau aplikasi fungsi dalam kontainer.

Untuk membuat aplikasi dan merencanakan resource, Anda harus sudah membuat lingkungan App Service Kubernetes untuk klaster Kubernetes dengan dukungan Azure Arc. Contoh dalam artikel ini mengasumsikan Anda memiliki ID sumber daya lokasi kustom (customLocationId) dan lingkungan App Service Kubernetes (kubeEnvironmentId) tempat Anda menyebarkan, yang diatur dalam contoh ini:

"parameters": {
  "kubeEnvironmentId" : {
    "type": "string"
  },
  "customLocationId" : {
    "type": "string"
  }
}

Situs dan paket harus mereferensikan lokasi kustom melalui bidang extendedLocation. Seperti yang ditunjukkan dalam contoh terpotong ini, extendedLocation berada di luar properties, sebagai serekan ke kind dan location:

{
  "type": "Microsoft.Web/serverfarms",
  ...
  {
    "extendedLocation": {
      "name": "[parameters('customLocationId')]"
    },
  }
}

Sumber daya rencana harus menggunakan nilai Kubernetes (K1) untuk SKU, kind bidang harus linux,kubernetes, dan reserved properti harus true, karena ini adalah penyebaran Linux. Anda juga harus mengatur extendedLocation dan kubeEnvironmentProfile.id ke ID lokasi kustom dan ID lingkungan Kubernetes, masing-masing, yang mungkin terlihat seperti bagian contoh ini:

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-03-01",
    "name": "[parameters('hostingPlanName')]",
    "location": "[parameters('location')]",
    "kind": "linux,kubernetes",
    "sku": {
      "name": "K1",
      "tier": "Kubernetes"
    },
    "extendedLocation": {
      "name": "[parameters('customLocationId')]"
    },
    "properties": {
      "kubeEnvironmentProfile": {
        "id": "[parameters('kubeEnvironmentId')]"
      },
      "reserved": true
    }
  }
]

Buat aplikasi fungsi

Sumber daya aplikasi fungsi didefinisikan oleh sumber daya jenis Microsoft.Web/sites dan kind yang mencakup functionapp, minimal.

Cara Anda menentukan sumber daya aplikasi fungsi bergantung pada apakah Anda menghosting di Linux atau di Windows:

Untuk daftar pengaturan aplikasi yang diperlukan saat berjalan di Windows, lihat Konfigurasi aplikasi. Untuk contoh file Bicep/templat Azure Resource Manager, lihat aplikasi fungsi yang dihosting di Windows dalam templat paket Konsumsi.

Untuk daftar pengaturan aplikasi yang diperlukan saat berjalan di Windows, lihat Konfigurasi aplikasi.

Catatan

Jika Anda memilih untuk menentukan paket Konsumsi secara opsional, Anda harus mengatur serverFarmId properti pada aplikasi sehingga menunjuk ke ID sumber daya paket. Pastikan bahwa aplikasi fungsi memiliki pengaturan dependsOn yang juga mereferensikan paket tersebut. Jika Anda tidak secara eksplisit menentukan paket, paket akan dibuat untuk Anda.

Atur serverFarmId properti pada aplikasi sehingga menunjuk ke ID sumber daya paket. Pastikan bahwa aplikasi fungsi memiliki pengaturan dependsOn yang juga mereferensikan paket tersebut.

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "location": "[parameters('location')]",
    "kind": "functionapp",
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "siteConfig": {
        "appSettings": [
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "WEBSITE_CONTENTSHARE",
            "value": "[toLower(parameters('functionAppName'))]"
          },
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "FUNCTIONS_WORKER_RUNTIME",
            "value": "node"
          },
          {
            "name": "WEBSITE_NODE_DEFAULT_VERSION",
            "value": "~14"
          }
        ]
      }
    }
  }
]

Untuk contoh menyeluruh lengkap, lihat templat azuredeploy.json ini.

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "location": "[parameters('location')]",
    "kind": "functionapp",
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "siteConfig": {
        "alwaysOn": true,
        "appSettings": [
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "FUNCTIONS_WORKER_RUNTIME",
            "value": "node"
          },
          {
            "name": "WEBSITE_NODE_DEFAULT_VERSION",
            "value": "~14"
          }
        ]
      }
    }
  }
]

Untuk contoh menyeluruh lengkap, lihat templat azuredeploy.json ini.

Sumber penyebaran

File Bicep atau templat ARM Anda dapat secara opsional juga menentukan penyebaran untuk kode fungsi Anda, yang dapat mencakup metode ini:

Sumber penyebaran

File Bicep atau templat ARM Anda dapat secara opsional juga menentukan penyebaran untuk kode fungsi Anda menggunakan paket penyebaran zip.

Untuk berhasil menyebarkan aplikasi Anda dengan menggunakan Azure Resource Manager, penting untuk memahami cara sumber daya disebarkan di Azure. Dalam kebanyakan contoh, konfigurasi tingkat atas diterapkan dengan menggunakan siteConfig. Penting untuk mengatur konfigurasi ini di tingkat atas, karena konfigurasi-konfigurasi ini menyampaikan informasi ke runtime Functions dan mesin penyebaran. Informasi tingkat atas diperlukan sebelum sumber daya anak sourcecontrols/web diterapkan. Meskipun dimungkinkan untuk mengonfigurasi pengaturan ini di sumber daya tingkat config/appSettings anak, dalam beberapa kasus aplikasi fungsi Anda harus disebarkan sebelumconfig/appSettings diterapkan.

Paket penyebaran Zip

Penyebaran Zip adalah cara yang disarankan untuk menyebarkan kode aplikasi fungsi Anda. Secara default, fungsi yang menggunakan penyebaran zip berjalan dalam paket penyebaran itu sendiri. Untuk informasi selengkapnya, termasuk persyaratan untuk paket penyebaran, lihat Penyebaran Zip untuk Azure Functions. Saat menggunakan otomatisasi penyebaran sumber daya, Anda dapat mereferensikan paket penyebaran .zip di templat Bicep atau ARM Anda.

Untuk menggunakan penyebaran zip di templat Anda, atur WEBSITE_RUN_FROM_PACKAGE pengaturan di aplikasi ke 1 dan sertakan /zipDeploy definisi sumber daya.

Untuk paket Konsumsi di Linux, sebagai gantinya atur URI paket penyebaran langsung dalam WEBSITE_RUN_FROM_PACKAGE pengaturan, seperti yang ditunjukkan dalam contoh templat ini.

Contoh ini menambahkan sumber penyebaran zip ke aplikasi yang ada:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "functionAppName": {
      "type": "string",
      "metadata": {
        "description": "The name of the Azure Function app."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location into which the resources should be deployed."
      }
    },
    "packageUri": {
      "type": "string",
      "metadata": {
        "description": "The zip content url."
      }
    }
  },
  "resources": [
    {
      "name": "[concat(parameters('functionAppName'), '/ZipDeploy')]",
      "type": "Microsoft.Web/sites/extensions",
      "apiVersion": "2021-02-01",
      "location": "[parameters('location')]",
      "properties": {
        "packageUri": "[parameters('packageUri')]"
      }
    }
  ]
}

Ingatlah hal-hal berikut saat menyertakan sumber daya penyebaran zip di templat Anda:

  • packageUri harus merupakan lokasi yang dapat diakses oleh Functions. Pertimbangkan untuk menggunakan penyimpanan blob Azure dengan tanda tangan akses bersama (SAS). Setelah SAS kedaluwarsa, Functions tidak dapat lagi mengakses berbagi untuk penyebaran. Saat Anda meregenerasi SAS, ingatlah untuk memperbarui WEBSITE_RUN_FROM_PACKAGE pengaturan dengan nilai URI baru.

  • Saat mengatur WEBSITE_RUN_FROM_PACKAGE ke URI, Anda harus menyinkronkan pemicu secara manual.

  • Pastikan untuk selalu mengatur semua pengaturan aplikasi yang appSettings diperlukan dalam koleksi saat menambahkan atau memperbarui pengaturan. Pengaturan yang ada yang tidak diatur secara eksplisit dihapus oleh pembaruan. Untuk informasi selengkapnya, lihat Konfigurasi aplikasi.

  • Functions tidak mendukung Web Deploy (msdeploy) untuk penyebaran paket. Anda harus menggunakan penyebaran zip dalam alur penyebaran dan otomatisasi Anda. Untuk informasi selengkapnya, lihat Penyebaran Zip untuk Azure Functions.

Build jarak jauh

Proses penyebaran mengasumsikan bahwa file .zip yang Anda gunakan atau penyebaran zip berisi aplikasi yang siap dijalankan. Ini berarti bahwa secara default tidak ada kustomisasi yang dijalankan.

Namun, ada skenario yang mengharuskan Anda membangun kembali aplikasi dari jarak jauh, seperti ketika Anda perlu menarik paket khusus Linux di Python atau aplikasi Node.js yang Anda kembangkan di komputer Windows. Dalam hal ini, Anda dapat mengonfigurasi Functions untuk melakukan build jarak jauh pada kode Anda setelah penyebaran zip.

Cara Anda meminta build jarak jauh tergantung pada sistem operasi yang Anda sebarkan:

Saat aplikasi disebarkan ke Windows, perintah khusus bahasa (seperti dotnet restore untuk aplikasi C# atau npm install untuk aplikasi Node.js) dijalankan.

Untuk mengaktifkan proses build yang sama dengan integrasi berkelanjutan, tambahkan SCM_DO_BUILD_DURING_DEPLOYMENT=true ke pengaturan aplikasi Anda dalam kode penyebaran Anda dan hapus WEBSITE_RUN_FROM_PACKAGE sepenuhnya.

Kontainer Linux

Jika Anda menyebarkan aplikasi fungsi dalam kontainer ke paket Azure Functions Premium atau Dedicated, Anda harus:

Untuk informasi selengkapnya, lihat Konfigurasi aplikasi.

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "location": "[parameters('location')]",
    "kind": "functionapp",
    "dependsOn": [
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "siteConfig": {
        "appSettings": [
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "FUNCTIONS_WORKER_RUNTIME",
            "value": "node"
          },
          {
            "name": "WEBSITE_NODE_DEFAULT_VERSION",
            "value": "~14"
          },
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "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"
      }
    }
  }
]

Saat menyebarkan fungsi dalam kontainer ke Azure Container Apps, templat Anda harus:

  • Atur kind bidang ke nilai functionapp,linux,container,azurecontainerapps.
  • Atur managedEnvironmentId properti situs ke URI yang sepenuhnya memenuhi syarat dari lingkungan Aplikasi Kontainer.
  • Tambahkan tautan sumber daya di kumpulan situs dependsOn saat membuat Microsoft.App/managedEnvironments sumber daya secara bersamaan dengan situs.

Definisi aplikasi fungsi kontainer yang disebarkan dari registri kontainer privat ke lingkungan Container Apps yang ada mungkin terlihat seperti contoh ini:

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "kind": "functionapp,linux,container,azurecontainerapps",
    "location": "[parameters('location')]",
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[parameters('hostingPlanName')]",
      "siteConfig": {
        "linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag",
        "appSettings": [
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          }
        ],
      },
      "managedEnvironmentId": "[parameters('managedEnvironmentId')]"
    }
  }
]

Saat menyebarkan fungsi ke Azure Arc, nilai yang Anda tetapkan untuk kind bidang sumber daya aplikasi fungsi bergantung pada jenis penyebaran:

Jenis penyebaran kind nilai bidang
Penyebaran khusus kode functionapp,linux,kubernetes
Penyebaran kontainer functionapp,linux,kubernetes,container

Anda juga harus mengatur seperti yang customLocationId Anda lakukan untuk sumber daya paket hosting.

Definisi aplikasi fungsi dalam kontainer, menggunakan gambar mulai cepat .NET 6, mungkin terlihat seperti contoh ini:

"resources": [
  {
    "type": "Microsoft.Web/sites",
    "apiVersion": "2022-03-01",
    "name": "[parameters('functionAppName')]",
    "kind": "kubernetes,functionapp,linux,container",
    "location": "[parameters('location')]",
    "extendedLocation": {
      "name": "[parameters('customLocationId')]"
    },
    "dependsOn": [
      "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
      "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
      "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    ],
    "properties": {
      "serverFarmId": "[parameters('hostingPlanName')]",
      "siteConfig": {
        "linuxFxVersion": "DOCKER|mcr.microsoft.com/azure-functions/4-dotnet-isolated6.0-appservice-quickstart",
        "appSettings": [
          {
            "name": "FUNCTIONS_EXTENSION_VERSION",
            "value": "~4"
          },
          {
            "name": "AzureWebJobsStorage",
            "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
          },
          {
            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
            "value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
          }
        ],
        "alwaysOn": true
      }
    }
  }
]

Konfigurasi aplikasi

Functions menyediakan opsi berikut untuk mengonfigurasi aplikasi fungsi Anda di Azure:

Konfigurasi Properti Microsoft.Web/sites
Pengaturan situs siteConfig
Pengaturan aplikasi siteConfig.appSettings koleksi

Pengaturan situs berikut diperlukan pada siteConfig properti :

Pengaturan aplikasi ini diperlukan (atau disarankan) untuk sistem operasi dan opsi hosting tertentu:

Pengaturan aplikasi ini diperlukan untuk penyebaran kontainer:

Pengaturan ini hanya diperlukan saat menyebarkan dari registri kontainer privat:

Ingatlah pertimbangan ini saat bekerja dengan pengaturan situs dan aplikasi menggunakan file Bicep atau templat ARM:

  • Ada pertimbangan penting ketika Anda harus mengatur WEBSITE_CONTENTSHARE dalam penyebaran otomatis. Untuk panduan terperinci, lihat referensinya WEBSITE_CONTENTSHARE .
  • Anda harus selalu menentukan pengaturan aplikasi Anda sebagai kumpulan sumber daya yang siteConfig/appSettingsMicrosoft.Web/sites dibuat, seperti yang dilakukan dalam contoh dalam artikel ini. Ini memastikan bahwa pengaturan yang perlu dijalankan aplikasi fungsi Anda tersedia pada startup awal.

  • Saat menambahkan atau memperbarui pengaturan aplikasi menggunakan templat, pastikan Anda menyertakan semua pengaturan yang ada dengan pembaruan. Anda harus melakukan ini karena panggilan REST API pembaruan yang mendasar menggantikan seluruh /config/appsettings sumber daya. Jika Anda menghapus pengaturan yang ada, aplikasi fungsi Anda tidak akan berjalan. Untuk memperbarui pengaturan aplikasi individual secara terprogram, Anda dapat menggunakan Azure CLI, Azure PowerShell, atau portal Azure untuk membuat perubahan ini. Untuk informasi selengkapnya, harap lihat Bekerja dengan pengaturan aplikasi.

Penyebaran slot

Functions memungkinkan Anda menyebarkan versi kode yang berbeda ke titik akhir unik di aplikasi fungsi Anda. Ini memudahkan untuk mengembangkan, memvalidasi, dan menyebarkan pembaruan fungsi tanpa memengaruhi fungsi yang berjalan dalam produksi. Slot penyebaran adalah fitur Azure App Service. Jumlah slot yang tersedia tergantung pada paket hosting Anda. Untuk informasi selengkapnya, lihat Fungsi slot penyebaran Azure Functions .

Sumber daya slot didefinisikan dengan cara yang sama seperti sumber daya aplikasi fungsi (Microsoft.Web/sites), tetapi sebagai gantinya Microsoft.Web/sites/slots Anda menggunakan pengidentifikasi sumber daya. Untuk contoh penyebaran (dalam templat Bicep dan ARM) yang membuat produksi dan slot penahapan dalam paket Premium, lihat Aplikasi Fungsi Azure dengan Slot Penyebaran.

Untuk mempelajari tentang cara melakukan pertukaran dengan menggunakan templat, lihat Mengotomatiskan dengan templat Resource Manager.

Ingatlah pertimbangan berikut saat bekerja dengan penyebaran slot:

  • Jangan secara eksplisit mengatur WEBSITE_CONTENTSHARE pengaturan dalam definisi slot penyebaran. Pengaturan ini dibuat untuk Anda ketika aplikasi dibuat di slot penyebaran.

  • Ketika Anda menukar slot, beberapa pengaturan aplikasi dianggap "lengket", karena mereka tetap dengan slot dan tidak dengan kode yang ditukar. Anda dapat menentukan pengaturan slot seperti itu dengan menyertakan "slotSetting":true dalam definisi pengaturan aplikasi tertentu di templat Anda. Untuk informasi selengkapnya, lihat Mengelola pengaturan.

Penyebaran aman

Anda dapat membuat aplikasi fungsi dalam penyebaran di mana satu atau beberapa sumber daya telah diamankan dengan mengintegrasikan dengan jaringan virtual. Integrasi jaringan virtual untuk aplikasi fungsi Anda ditentukan oleh Microsoft.Web/sites/networkConfig sumber daya. Integrasi ini tergantung pada aplikasi fungsi yang dirujuk dan sumber daya jaringan virtual. Aplikasi fungsi Anda mungkin juga bergantung pada sumber daya jaringan privat lainnya, seperti titik akhir dan rute privat. Untuk informasi selengkapnya, lihat Opsi jaringan Azure Functions.

Saat membuat penyebaran yang menggunakan akun penyimpanan aman, Anda harus secara eksplisit mengatur WEBSITE_CONTENTSHARE pengaturan dan membuat sumber daya berbagi file bernama dalam pengaturan ini. Pastikan Anda membuat sumber daya menggunakan nilai , seperti yang Microsoft.Storage/storageAccounts/fileServices/shares ditunjukkan dalam contoh ini (file Bicep templat|ARM).WEBSITE_CONTENTSHARE Anda juga harus mengatur properti vnetContentShareEnabled situs ke true.

Catatan

Ketika pengaturan ini bukan bagian dari penyebaran yang menggunakan akun penyimpanan aman, Anda akan melihat kesalahan ini selama validasi penyebaran: Could not access storage account using provided connection string.

Proyek-proyek ini menyediakan contoh templat Bicep dan ARM tentang cara menyebarkan aplikasi fungsi Anda di jaringan virtual, termasuk dengan pembatasan akses jaringan:

Skenario terbatas Deskripsi
Membuat aplikasi fungsi dengan integrasi jaringan virtual Aplikasi fungsi Anda dibuat di jaringan virtual dengan akses penuh ke sumber daya di jaringan tersebut. Akses masuk dan keluar ke aplikasi fungsi Anda tidak dibatasi. Untuk informasi lebih lanjut, lihat Integrasi jaringan virtual.
Membuat aplikasi fungsi yang mengakses akun penyimpanan aman Aplikasi fungsi yang Anda buat menggunakan akun penyimpanan aman, yang diakses Functions dengan menggunakan titik akhir privat. Untuk informasi selengkapnya, lihat Membatasi akun penyimpanan Anda ke jaringan virtual.
Membuat aplikasi fungsi dan akun penyimpanan yang keduanya menggunakan titik akhir privat Aplikasi fungsi yang Anda buat hanya dapat diakses dengan menggunakan titik akhir privat, dan menggunakan titik akhir privat untuk mengakses sumber daya penyimpanan. Untuk informasi selengkapnya, lihat Titik akhir privat.

Pengaturan jaringan terbatas

Anda mungkin juga perlu menggunakan pengaturan ini saat aplikasi fungsi Anda memiliki pembatasan jaringan:

Pengaturan Nilai Deskripsi
WEBSITE_CONTENTOVERVNET 1 Pengaturan aplikasi yang memungkinkan aplikasi fungsi Anda untuk menskalakan saat akun penyimpanan dibatasi ke jaringan virtual. Untuk informasi selengkapnya, lihat Membatasi akun penyimpanan Anda ke jaringan virtual.
vnetrouteallenabled 1 Pengaturan situs yang memaksa semua lalu lintas dari aplikasi fungsi untuk menggunakan jaringan virtual. Untuk informasi selengkapnya, lihat Integrasi jaringan virtual regional. Pengaturan situs ini menggantikan pengaturan WEBSITE_VNET_ROUTE_ALLaplikasi .

Pertimbangan untuk pembatasan jaringan

Saat Membatasi akses ke akun penyimpanan melalui titik akhir privat, Anda tidak dapat mengakses akun penyimpanan melalui portal atau perangkat apa pun di luar jaringan virtual. Anda dapat memberikan akses ke alamat IP aman atau jaringan virtual Anda di akun penyimpanan dengan Mengelola aturan akses jaringan default.

Buat templat Anda

Para ahli dengan templat Bicep atau ARM dapat secara manual mengkodekan penyebaran mereka menggunakan editor teks sederhana. Bagi kita semua, ada beberapa cara untuk mempermudah proses pengembangan:

  • Visual Studio Code: Ada ekstensi yang tersedia untuk membantu Anda bekerja dengan file Bicep dan templat ARM. Anda dapat menggunakan alat-alat ini untuk membantu memastikan bahwa kode Anda benar, dan mereka memberikan beberapa validasi dasar.

  • portal Azure: Saat Anda membuat aplikasi fungsi dan sumber daya terkait di portal, layar Tinjau + buat akhir memiliki tautan Unduh templat untuk otomatisasi.

    Tautan unduh templat dari proses pembuatan Azure Functions di portal Azure.

    Tautan ini menunjukkan templat ARM yang dihasilkan berdasarkan opsi yang Anda pilih di portal. Meskipun templat ini bisa sedikit kompleks saat Anda membuat aplikasi fungsi dengan banyak sumber daya baru, templat ini dapat memberikan referensi yang baik tentang tampilan templat ARM Anda.

Memvalidasi templat Anda

Saat Anda membuat file templat penyebaran secara manual, penting untuk memvalidasi templat Anda sebelum penyebaran. Semua metode penyebaran memvalidasi sintaks templat Anda dan memunculkan pesan kesalahan seperti yang validation failed ditunjukkan dalam contoh berformat JSON berikut:

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

Metode berikut dapat digunakan untuk memvalidasi templat Anda sebelum penyebaran:

Tugas penyebaran grup sumber daya Azure v2 berikut dengan deploymentMode: 'Validation' menginstruksikan Azure Pipelines untuk memvalidasi templat.

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

Anda juga dapat membuat grup sumber daya pengujian untuk menemukan kesalahan pra-penerbangan dan penyebaran .

Menerapkan templat Anda

Anda bisa menggunakan salah satu cara berikut untuk menyebarkan file Bicep dan templat Anda:

Tombol Sebarkan ke Azure

Catatan

Saat ini, metode ini tidak mendukung penyebaran file Bicep jarak jauh.

Ganti <url-encoded-path-to-azuredeploy-json> dengan versi URL yang dikodekan dari jalur mentah file azuredeploy.json Anda di GitHub.

Berikut adalah contoh yang menggunakan markdown:

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

Berikut adalah contoh yang menggunakan 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>

Menyebarkan menggunakan PowerShell

Perintah PowerShell berikut membuat grup sumber daya dan menyebarkan file Bicep/templat ARM yang membuat aplikasi fungsi dengan sumber daya yang diperlukan. Untuk berjalan secara lokal, Anda harus menginstal Azure PowerShell. Jalankan Connect-AzAccount untuk masuk.

# 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 azuredeploy.json  -Verbose

Untuk menguji penyebaran ini, Anda dapat menggunakan templat seperti ini yang membuat aplikasi fungsi pada Windows dalam paket Konsumsi.

Langkah berikutnya

Pelajari selengkapnya tentang cara mengembangkan dan mengonfigurasi Azure Functions.