Mengotomatiskan penyebaran sumber daya untuk aplikasi fungsi Anda di Azure Functions

Anda dapat menggunakan templat Azure Resource Manager untuk menyebarkan aplikasi fungsi. Artikel ini menguraikan sumber daya dan parameter yang diperlukan untuk melakukannya. Anda mungkin perlu menyebarkan sumber daya lainnya, bergantung pada pemicu dan pengikatan di aplikasi fungsi Anda.

Untuk informasi selengkapnya tentang membuat templat, lihat Menulis templat Azure Resource Manager.

Untuk templat sampel, lihat:

Sumber daya yang diperlukan

Penyebaran Azure Functions biasanya terdiri dari sumber daya ini:

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

1 Paket hosting hanya diperlukan ketika Anda memilih untuk menjalankan aplikasi fungsi Anda pada paket Premium atau pada paket App Service.

Tip

Meskipun tidak diperlukan, sangat disarankan agar Anda mengonfigurasi Application Insights untuk aplikasi Anda.

Akun penyimpanan

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

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

Anda juga harus menentukan properti AzureWebJobsStorage sebagai setelan aplikasi di konfigurasi situs. Jika aplikasi fungsi tidak menggunakan Application Insights untuk pemantauan, aplikasi tersebut juga harus menentukan AzureWebJobsDashboard sebagai pengaturan aplikasi.

Runtime Azure Functions menggunakan string koneksi AzureWebJobsStorage untuk membuat antrean internal. Saat Application Insights tidak diaktifkan, runtime menggunakan string koneksi AzureWebJobsDashboard untuk masuk ke penyimpanan Azure Table dan memberi daya tab Monitor di portal.

Properti ini ditentukan dalam koleksi appSettings di objek siteConfig:

"appSettings": [
    {
        "name": "AzureWebJobsStorage",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
    },
    {
        "name": "AzureWebJobsDashboard",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
    }
]

Application Insights

Application Insights disarankan untuk memantau aplikasi fungsi Anda. Sumber daya Application Insights didefinisikan dengan jenis Microsoft.Insights/components dan jenis 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')]"
            }
        },

Selain itu, kunci instrumentasi perlu diberikan ke aplikasi fungsi menggunakan pengaturan aplikasi APPINSIGHTS_INSTRUMENTATIONKEY. Properti ini ditentukan dalam koleksi appSettings dalam objek siteConfig:

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

Paket hosting

Definisi paket hosting bervariasi, dan bisa menjadi salah satu dari yang berikut ini:

Aplikasi Fungsi

Sumber daya aplikasi fungsi didefinisikan dengan menggunakan sumber daya jenis Microsoft.Web/sites dan jenis 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'))]"
    ]
}

Penting

Jika Anda secara eksplisit mendefinisikan paket hosting, item tambahan akan diperlukan dalam array dependsOn: "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]"

Aplikasi fungsi harus menyertakan pengaturan aplikasi berikut:

Nama pengaturan Deskripsi Contoh nilai
AzureWebJobsStorage String koneksi ke akun penyimpanan yang digunakan runtime Functions untuk antrean internal Lihat Akun Storage
FUNCTIONS_EXTENSION_VERSION Versi runtime Azure Functions ~4
FUNCTIONS_WORKER_RUNTIME Tumpukan bahasa yang akan digunakan untuk fungsi dalam aplikasi ini dotnet, node, java, python, atau powershell
WEBSITE_NODE_DEFAULT_VERSION Hanya diperlukan jika menggunakan tumpukan bahasa node pada Windows, menentukan versi yang akan digunakan ~14

Properti ini ditentukan dalam koleksi appSettings di properti siteConfig:

"properties": {
    "siteConfig": {
        "appSettings": [
            {
                "name": "AzureWebJobsStorage",
                "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]"
            },
            {
                "name": "FUNCTIONS_WORKER_RUNTIME",
                "value": "node"
            },
            {
                "name": "WEBSITE_NODE_DEFAULT_VERSION",
                "value": "~14"
            },
            {
                "name": "FUNCTIONS_EXTENSION_VERSION",
                "value": "~4"
            }
        ]
    }
}

Sebarkan pada paket Konsumsi

Paket Konsumsi secara otomatis mengalokasikan daya komputasi saat kode Anda berjalan, menskalakan seperlunya untuk menangani beban, lalu menskalakan saat kode tidak berjalan. Anda tidak perlu membayar VM menganggur, dan Anda tidak perlu memesan kapasitas terlebih dahulu. Untuk mempelajari selengkapnya, lihat Skala dan hosting Azure Functions.

Untuk contoh templat Azure Resource Manager, lihat Aplikasi fungsi pada paket Konsumsi.

Membuat paket Konsumsi

Paket Konsumsi tidak perlu didefinisikan. Ketika tidak ditentukan, secara otomatis paket akan dibuat atau dipilih berdasarkan per wilayah saat Anda membuat sumber daya aplikasi fungsi tersebut.

Paket Pemakaian adalah jenis spesial sumber daya serverfarm. Anda bisa menentukannya dengan menggunakan nilai Dynamic untuk properti computeMode dan sku, sebagai berikut:

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

Membuat aplikasi fungsi

Ketika menentukan paket Pemakaian secara eksplisit, Anda harus mengatur properti serverFarmId di aplikasi sehingga mengarah ke ID sumber daya dari paket tersebut. Pastikan bahwa aplikasi fungsi memiliki pengaturan dependsOn yang juga mereferensikan paket tersebut.

Pengaturan yang diperlukan oleh aplikasi fungsi yang berjalan dalam paket Konsumsi berbeda antara Windows dan Linux.

Pada Windows, paket Pemakaian memerlukan dua pengaturan lainnya dalam konfigurasi situs: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING dan WEBSITE_CONTENTSHARE. Properti ini mengonfigurasi akun penyimpanan tempat kode dan konfigurasi aplikasi fungsi disimpan.

Untuk sampel templat Azure Resource Manager, lihat Aplikasi Fungsi Azure yang Dihosting di Paket Pemakaian Windows.

{
  "type": "Microsoft.Web/sites",
  "apiVersion": "2021-02-01",
  "name": "[parameters('functionAppName')]",
  "location": "[parameters('location')]",
  "kind": "functionapp",
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Insights/components', variables('applicationInsightsName'))]"
  ],
  "properties": {
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
    "siteConfig": {
      "appSettings": [
        {
          "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
          "value": "[reference(resourceId('microsoft.insights/components', variables('applicationInsightsName')), '2015-05-01').InstrumentationKey]"
        },
        {
          "name": "AzureWebJobsStorage",
          "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]"
        },
        {
          "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
          "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-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"
        }
      ]
    }
  }
}

Penting

Tidak perlu mengatur pengaturan WEBSITE_CONTENTSHARE dalam slot penyebaran. Pengaturan ini dibuat untuk Anda ketika aplikasi dibuat di slot penyebaran.

Sebarkan pada paket Premium

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.

Membuat paket Premium

Paket Konsumsi adalah jenis khusus sumber daya "serverfarm". Anda dapat menentukannya dengan menggunakan EP1, EP2, atau EP3 untuk nilai properti Name dalam sku sebagai berikut:

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

Membuat aplikasi fungsi

Untuk aplikasi fungsi pada paket Premium, Anda perlu mengatur properti serverFarmId di aplikasi agar mengarah ke ID sumber daya paket tersebut. Anda harus memastikan bahwa aplikasi fungsi memiliki pengaturan dependsOn untuk paket juga.

Paket Premium memerlukan pengaturan lain dalam konfigurasi situs: WEBSITE_CONTENTAZUREFILECONNECTIONSTRING dan WEBSITE_CONTENTSHARE. Properti ini mengonfigurasi akun penyimpanan tempat kode aplikasi fungsi dan konfigurasi disimpan, yang digunakan untuk skala dinamis.

Untuk sampel templat Azure Resource Manager, lihat Aplikasi Fungsi Azure yang Dihosting di Paket Premium.

Pengaturan yang diperlukan oleh aplikasi fungsi yang berjalan dalam paket Premium berbeda antara Windows dan Linux.

{
  "type": "Microsoft.Web/sites",
  "apiVersion": "2021-02-01",
  "name": "[parameters('functionAppName')]",
  "location": "[parameters('location')]",
  "kind": "functionapp",
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Insights/components', variables('applicationInsightsName'))]"
  ],
  "properties": {
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
    "siteConfig": {
      "appSettings": [
        {
          "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
          "value": "[reference(resourceId('microsoft.insights/components', variables('applicationInsightsName')), '2015-05-01').InstrumentationKey]"
        },
        {
          "name": "AzureWebJobsStorage",
          "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]"
        },
        {
          "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
          "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-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"
        }
      ]
    }
  }
}

Penting

Tidak perlu mengubah pengaturan WEBSITE_CONTENTSHARE karena dibuat untuk Anda saat situs pertama kali dibuat.

Sebarkan pada paket App Service

Dalam paket App Service, aplikasi fungsi Anda berjalan pada VM khusus pada SKU Dasar, Standar, dan Premium, mirip dengan aplikasi web. Untuk detail tentang cara kerja paket App Service, lihat gambaran mendalam paket Azure App Service.

Untuk sampel templat Azure Resource Manager, lihat Aplikasi fungsi pada paket Azure App Service.

Membuat Paket App Service

Paket App Service ditentukan oleh sumber daya "serverfarm". Anda dapat menentukan SKU sebagai berikut:

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

Membuat aplikasi fungsi

Untuk aplikasi fungsi pada paket Khusus, Anda harus mengatur properti serverFarmId pada aplikasi agar menunjuk ke ID sumber daya paket tersebut. Pastikan bahwa aplikasi fungsi memiliki pengaturan dependsOn yang juga mereferensikan paket tersebut.

Pada paket App Service, Anda harus mengaktifkan pengaturan "alwaysOn": true di konfigurasi situs agar aplikasi fungsi Anda berjalan dengan benar. Pada paket App Service, runtime fungsi menganggur setelah beberapa menit tidak aktif, jadi hanya pemicu HTTP yang akan "membangunkan" fungsi Anda.

Pengaturan WEBSITE_CONTENTAZUREFILECONNECTIONSTRING dan WEBSITE_CONTENTSHARE tidak didukung pada paket Khusus.

Untuk sampel templat Azure Resource Manager, lihat Aplikasi Fungsi Azure yang Dihosting di Paket Khusus.

Pengaturan yang diperlukan oleh aplikasi fungsi yang berjalan dalam paket Khusus berbeda antara Windows dan Linux.

{
  "type": "Microsoft.Web/sites",
  "apiVersion": "2021-02-01",
  "name": "[parameters('functionAppName')]",
  "location": "[parameters('location')]",
  "kind": "functionapp",
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Insights/components', variables('applicationInsightsName'))]"
  ],
  "properties": {
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]",
    "siteConfig": {
      "alwaysOn": true,
      "appSettings": [
        {
          "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
          "value": "[reference(resourceId('microsoft.insights/components', variables('applicationInsightsName')), '2015-05-01').InstrumentationKey]"
        },
        {
          "name": "AzureWebJobsStorage",
          "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]"
        },
        {
          "name": "FUNCTIONS_EXTENSION_VERSION",
          "value": "~4"
        },
        {
          "name": "FUNCTIONS_WORKER_RUNTIME",
          "value": "node"
        },
        {
          "name": "WEBSITE_NODE_DEFAULT_VERSION",
          "value": "~14"
        }
      ]
    }
  }
}

Gambar Kontainer Kustom

Jika Anda menyebarkan gambar kontainer kustom, Anda harus menentukannya dengan linuxFxVersion dan menyertakan konfigurasi yang memungkinkan gambar Anda ditarik, seperti di Aplikasi Web untuk Kontainer. Selain itu, atur WEBSITES_ENABLE_APP_SERVICE_STORAGE ke false, karena konten aplikasi Anda disediakan dalam kontainer itu sendiri:

{
    "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'),'2019-06-01').keys[0].value)]"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "~14"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                },
                {
                    "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"
        }
    }
}

Sebarkan ke Azure Arc

Azure Functions dapat disebarkan ke Kubernetes dengan dukungan Azure Arc. Proses ini sebagian besar mengikuti penyebaran ke paket App Service, dengan beberapa perbedaan yang perlu diperhatikan.

Untuk membuat aplikasi dan merencanakan resource, Anda harus sudah membuat lingkungan App Service Kubernetes untuk klaster Kubernetes dengan dukungan Azure Arc. Contoh-contoh ini mengasumsikan bahwa kamu memiliki ID sumber daya dari lokasi kustom dan lingkungan App Service Kubernetes yang Anda sebarkan. Untuk sebagian besar templat, Anda dapat menyediakannya sebagai parameter.

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

Situs dan paket harus mereferensikan lokasi kustom melalui bidang extendedLocation. Blok ini terletak di luar properties, peer ke kind dan location:

{
    "extendedLocation": {
        "type": "customlocation",
        "name": "[parameters('customLocationId')]"
    },
}

Sumber daya paket harus menggunakan SKU Kubernetes (K1), dan bidang kind seharusnya "linux,kubernetes". Dalam properties, reserved harus "benar", dan kubeEnvironmentProfile.id harus diatur ke ID sumber daya lingkungan App Service Kubernetes. Paket contoh mungkin terlihat seperti berikut ini:

{
    "type": "Microsoft.Web/serverfarms",
    "name": "[variables('hostingPlanName')]",
    "location": "[parameters('location')]",
    "apiVersion": "2020-12-01",
    "kind": "linux,kubernetes",
    "sku": {
        "name": "K1",
        "tier": "Kubernetes"
    },
    "extendedLocation": {
        "type": "customlocation",
        "name": "[parameters('customLocationId')]"
    },
    "properties": {
        "name": "[variables('hostingPlanName')]",
        "location": "[parameters('location')]",
        "workerSizeId": "0",
        "numberOfWorkers": "1",
        "kubeEnvironmentProfile": {
            "id": "[parameters('kubeEnvironmentId')]"
        },
        "reserved": true
    }
}

Sumber daya aplikasi fungsi harus memiliki bidang kind yang diatur ke "functionapp,linux, kubernetes" atau "functionapp,linux,kubernetes,container" tergantung pada apakah Anda ingin menyebarkan melalui kode atau kontainer. Contoh fungsi aplikasi mungkin terlihat seperti berikut ini:

 {
    "apiVersion": "2018-11-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('appName')]",
    "kind": "kubernetes,functionapp,linux,container",
    "location": "[parameters('location')]",
    "extendedLocation": {
        "type": "customlocation",
        "name": "[parameters('customLocationId')]"
    },
    "dependsOn": [
        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[variables('hostingPlanId')]"
    ],
    "properties": {
        "serverFarmId": "[variables('hostingPlanId')]",
        "siteConfig": {
            "linuxFxVersion": "DOCKER|mcr.microsoft.com/azure-functions/dotnet:3.0-appservice-quickstart",
            "appSettings": [
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~3"
                },
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2015-05-01-preview').key1)]"

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

Menyesuaikan penyebaran

Aplikasi fungsi memiliki banyak sumber daya anak yang dapat Anda gunakan dalam penyebaran, termasuk pengaturan aplikasi dan opsi kontrol sumber. Anda juga dapat memilih untuk menghapus sumber daya anak sourcecontrols, dan menggunakan opsi penyebaran yang berbeda.

Penting

Untuk berhasil menyebarkan aplikasi Anda dengan menggunakan Azure Resource Manager, penting untuk memahami cara sumber daya disebarkan di Azure. Dalam contoh berikut, 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 sourcecontrols/web anak diterapkan. Meskipun memungkinkan untuk mengonfigurasi pengaturan ini di sumber daya config/appSettings tingkat turunan, terkadang aplikasi fungsi harus disebarkan sebelumconfig/appSettings diterapkan. Misalnya, saat Anda menggunakan fungsi dengan Logic Apps, fungsi Anda adalah dependensi dari sumber daya lain.

{
  "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": "~3"
            },
            {
                "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'),'2019-06-01').keys[0].value)]",
          "AzureWebJobsDashboard": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountid'),'2019-06-01').keys[0].value)]",
          "FUNCTIONS_EXTENSION_VERSION": "~3",
          "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')]"
          }
     }
  ]
}

Tip

Templat ini menggunakan nilai pengaturan aplikasi Project, yang menetapkan direktori dasar tempat mesin penyebaran Functions (Kudu) mencari kode yang dapat disebarkan. Dalam repositori kami, fungsi kami berada dalam subfolder folder src. Jadi, dalam contoh sebelumnya, kami menetapkan nilai pengaturan aplikasi ke src. Jika fungsi Anda berada di akar repositori Anda, atau jika Anda tidak menyebarkan dari kontrol sumber, Anda dapat menghapus nilai pengaturan aplikasi ini.

Menerapkan templat Anda

Anda bisa menggunakan salah satu cara berikut untuk menyebarkan templat Anda:

Tombol sebarkan ke Azure

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

# 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

Untuk menguji penyebaran ini, Anda dapat menggunakan templat seperti ini yang membuat aplikasi fungsi pada Windows dalam paket Konsumsi. Ganti <function-app-name> dengan nama unik untuk aplikasi fungsi Anda.

Langkah berikutnya

Pelajari selengkapnya tentang cara mengembangkan dan mengonfigurasi Azure Functions.