Azure Functions の関数アプリのリソース デプロイを自動化
Bicep ファイルまたは Azure Resource Manager テンプレートを使用して、新規または既存の Azure リソースへの関数アプリのデプロイ プロセスを自動化できます。 このような自動化には、DevOps でリソースのデプロイをソース コードと統合したり、関数アプリと関連リソースをバックアップから復元したり、アプリのトポロジを複数回デプロイしたりできる素晴らしい方法が用意されています。
この記事では、Azure Functions のリソース作成とデプロイを自動化する方法を紹介します。 関数で使用されるトリガーとバインドによっては、他のリソースをデプロイする必要がある場合もありますが、その内容はこの記事では触れていません。
具体的なテンプレート コードは、関数アプリがどのようにホストされているか、コードがデプロイされているかコンテナー化された関数アプリであるか、アプリで使用されているオペレーティング システムなどによって異なります。 この記事では、次のホスティング オプションをサポートしています。
ホスティング オプション | デプロイの種類 | 詳細については、次を参照してください。 |
---|---|---|
Azure Functions 従量課金プラン | コードのみ | 従量課金プラン |
Azure Functions の Elastic Premium プラン | コード | コンテナー | Premium プラン |
Azure Functions 専用 (App Service) プラン | コード | コンテナー | 専用プラン |
Azure Container Apps | コンテナーのみ | Azure Functions の Container Apps ホスティング |
Azure Arc | コード | コンテナー | Azure Arc の App Service、Functions、および Logic Apps (プレビュー) |
必要なリソース
Azure Functions でホストされているデプロイは通常、次のリソースで構成されています。
リソース | 要件 | 構文とプロパティの参照 |
---|---|---|
ストレージ アカウント | 必須 | Microsoft.Storage/storageAccounts |
Application Insights コンポーネント | 推奨 | Microsoft.Insights/components |
ホスティング プラン | 必須1 | Microsoft.Web/serverfarms |
関数アプリ | 必須 | Microsoft.Web/sites |
重要課金プラン向けの Azure Functions のデプロイは通常、次のリソースで構成されています。
リソース | 要件 | 構文とプロパティの参照 |
---|---|---|
ストレージ アカウント | 必須 | Microsoft.Storage/storageAccounts |
Application Insights コンポーネント | 推奨 | Microsoft.Insights/components |
関数アプリ | 必須 | Microsoft.Web/sites |
Azure Container Apps でホストされているデプロイは通常、次のリソースで構成されています。
リソース | 要件 | 構文とプロパティの参照 |
---|---|---|
ストレージ アカウント | 必須 | Microsoft.Storage/storageAccounts |
Application Insights コンポーネント | 推奨 | Microsoft.Insights/components |
マネージド環境 | 必須 | Microsoft.App/managedEnvironments |
関数アプリ | 必須 | Microsoft.Web/sites |
Azure Arc でホストされているデプロイは通常、次のリソースで構成されています。
リソース | 要件 | 構文とプロパティの参照 |
---|---|---|
ストレージ アカウント | 必須 | Microsoft.Storage/storageAccounts |
Application Insights コンポーネント | 推奨 | Microsoft.Insights/components |
App Service Kubernetes 環境 | 必須 | Microsoft.ExtendedLocation/customLocations |
関数アプリ | 必須 | Microsoft.Web/sites |
1関数アプリを従量課金プランでホストすることを選択した場合、明示的なホスティング プランは必要ありません。
1 つの Bicep ファイルまたは ARM テンプレートに複数のリソースをデプロイする場合、リソースの作成順序が重要です。 この要件は、リソース間の依存関係の結果です。 このような依存関係では、必ず dependsOn
要素を使用して依存リソースの依存関係を定義してください。 詳細については、「ARM テンプレートでのリソース デプロイ順序の定義」または「Bicep でのリソース依存関係」を参照してください。
この記事では、Bicep ファイルの作成または Azure Resource Manager テンプレートの作成に関する基本的な理解があることを前提としており、特定のリソース向けの個別セクションとして例を示しています。 完全な Bicep ファイルと ARM テンプレートの幅広い例については、これらの関数アプリのデプロイ例に関する記事を参照してください。
前提条件
この記事では、Azure Container Apps でマネージド環境を既に作成していることを前提としています。 Container Apps でホストされる関数アプリを作成するには、マネージド環境の名前と ID の両方が必要です。
この記事では、App Service 対応のカスタムの場所を Azure Arc 対応 Kubernetes クラスター上に既に作成していることを前提としています。 Azure Arc のカスタムの場所でホストされる関数アプリを作成するには、カスタムの場所 ID と Kubernetes 環境 ID の両方が必要です。
ストレージ アカウントの作成
すべての関数アプリに Azure ストレージ アカウントが必要です。 必要なのは BLOB、テーブル、キュー、およびファイルをサポートする汎用アカウントです。 詳細については、Azure Functions ストレージ アカウント要件に関するページをご覧ください。
重要
ストレージ アカウントは、アプリケーション コード自体を含む重要なアプリ データを格納するために使用されます。 他のアプリやユーザーからのアクセスをストレージ アカウントに制限する必要があります。
次の例のセクションでは、Standard 汎用 v2 ストレージ アカウントを作成しています。
"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
}
}
]
詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。
このストレージ アカウントの接続文字列を AzureWebJobsStorage
アプリ設定として設定する必要があります。これは Functions で必要です。 この記事のテンプレートでは、作成したストレージ アカウントに基づいてこの接続文字列の値を作成します。これがベスト プラクティスです。 詳細については、アプリケーションの構成 に関する記事をご覧ください。
ストレージ ログを有効にする
ストレージ アカウントは重要な関数アプリ データに使用されるため、そのコンテンツが変更されているかアカウントを監視する必要があります。 ストレージ アカウントを監視するには、Azure Storage の Azure Monitor リソース ログを構成する必要があります。 この例のセクションでは、myLogAnalytics
という名前の Log Analytics ワークスペースがこれらのログの宛先として使用されています。
"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
}
]
}
}
]
この同じワークスペースは、後で定義する Application Insights リソースに使用できます。 これらのログの操作方法などの詳細については、「Azure ストレージの監視」を参照してください。
Application Insights の作成
Application Insights は、関数アプリの実行を監視するために推奨されます。 次の例のセクションでは、Application Insights リソースは、タイプが Microsoft.Insights/components
、サブタイプが 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"
},
詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。
接続は、APPLICATIONINSIGHTS_CONNECTION_STRING
アプリケーション設定を使用して関数アプリに指定する必要があります。 詳細については、アプリケーション設定に関する記事を参照してください。
この記事の例では、作成したインスタンスの接続文字列の値を取得します。 以前のバージョンでは、代わりに APPINSIGHTS_INSTRUMENTATIONKEY
を使用してインストルメンテーション キーを設定する場合がありますが、これは推奨されません。
ホスティング プランの作成
Azure Functions の Premium プランまたは 専用 (App Service) プランでホストされるアプリでは、ホスティング プランを明示的に定義する必要があります。
Premium プランでは、従量課金プランと同じスケーリングが提供されますが、専用リソースとその他の機能が含まれています。 詳細については、「Azure Functions の Premium プラン」を参照してください。
Premium プランは、特殊なタイプの serverfarm
リソースです。 これは、sku
プロパティで Name
プロパティの EP1
、EP2
、EP3
のいずれかの値を使用して指定できます。 Functions ホスティング プランを定義する方法は、関数アプリを Windows 上または Linux 上で実行する場合によって異なります。 次の例のセクションでは EP1
プランを作成します。
"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
}
}
]
詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。
sku
オブジェクトに関する詳細については、SkuDefinition
を参照するか、テンプレートの例を確認してください。
専用 (App Service) プランでは、関数アプリは、Web アプリと同様に、App Service プランの Basic、Standard、および Premium SKU の専用 VM 上で実行されます。 詳細については、専用プランに関するページを参照してください。
Bicep ファイルおよび Azure Resource Manager テンプレートのサンプルについては、Azure App Service プランの関数アプリに関するページをご覧ください
Functions では、Dedicated プランは、serverfarm
リソースによって定義される通常の App Service プランです。 少なくとも name
個の値を指定する必要があります。 サポートされているプラン名の一覧については、専用プランで現在サポートされている値の一覧で az appservice plan create
の --sku
設定を参照してください。
ホスティング プランを定義する方法は、関数アプリを Windows 上または 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
}
}
]
詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。
ホスティング プランの作成
従量課金ホスティング プランのリソースを明示的に定義する必要はありません。 このリソース定義をスキップする場合は、関数アプリのリソース自体を作成したときに、プランがリージョンごとに自動的に作成または選択されます。
serverfarm
リソースの特別なタイプとして従量課金プランを明示的に定義できます。これには、computeMode
プロパティと sku
プロパティ向けの値 Dynamic
を使用して指定します。 このセクションの例は、従量課金プランを明示的に定義する方法を示しています。 ホスティング プランを定義する方法は、関数アプリを Windows 上または 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"
}
}
]
詳細な内容については、テンプレート リポジトリの完全な azuredeploy.json ファイルを参照してください。
Kubernetes 環境
Azure Functions は、コード プロジェクトまたはコンテナー化された関数アプリとして Azure Arc 対応 Kubernetes にデプロイできます。
アプリを作成し、リソースを計画するには、Azure Arc 対応 Kubernetes クラスター用の App Service Kubernetes 環境 をあらかじめ作成しておく必要があります。 この記事の例では、デプロイ先のカスタムの場所 (customLocationId
) と App Service Kubernetes 環境 (kubeEnvironmentId
) のリソース ID があることを前提としています。これは、次の例の設定です。
"parameters": {
"kubeEnvironmentId" : {
"type": "string"
},
"customLocationId" : {
"type": "string"
}
}
サイトとプランの両方で、extendedLocation
フィールドを使用してカスタムの場所を参照する必要があります。 次の抜粋した例で示すように、extendedLocation
は properties
の外側に位置し、kind
と location
のピアになります。
{
"type": "Microsoft.Web/serverfarms",
...
{
"extendedLocation": {
"name": "[parameters('customLocationId')]"
},
}
}
プラン リソースは Linux デプロイであるため、SKU
に Kubernetes (K1
) の値を使用し、kind
フィールドは linux,kubernetes
に、reserved
プロパティは true
にする必要があります。 また、extendedLocation
と kubeEnvironmentProfile.id
をそれぞれカスタムの場所 ID と Kubernetes 環境 ID に設定する必要があります。これらは、次の例のセクションのように見えます。
"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
}
}
]
Function App の作成
関数アプリ リソースは、少なくとも functionapp
を含むタイプ Microsoft.Web/sites
とタイプ kind
のリソースによって定義されます。
関数アプリ リソースを定義する方法は、Linux 上または Windows 上でホストする場合によって異なります。
Windows 上で実行する場合に必要なアプリケーション設定の一覧については、「アプリケーションの構成」を参照してください。 Bicep ファイルおよび Azure Resource Manager テンプレートのサンプルについては、「従量課金プランの Windows でホストされる関数アプリ」テンプレートを参照してください。
Windows 上で実行する場合に必要なアプリケーション設定の一覧については、「アプリケーションの構成」を参照してください。
Note
従量課金プランをオプションで定義することを選択する場合は、アプリで serverFarmId
プロパティを設定して、それがプランのリソース ID を指すようにする必要があります。 同様に、そのプランを参照する dependsOn
設定が関数アプリに含まれていることを確認してください。 明示的にプランを定義していない場合は、ユーザー向けのプランが作成されます。
プランのリソース ID を参照するようにアプリの serverFarmId
プロパティを設定します。 同様に、そのプランを参照する dependsOn
設定が関数アプリに含まれていることを確認してください。
"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"
}
]
}
}
}
]
完全なエンドツーエンドの例については、この azuredeploy.json テンプレートを参照してください。
"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"
}
]
}
}
}
]
完全なエンドツーエンドの例については、この azuredeploy.json テンプレートを参照してください。
デプロイ ソース
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 展開ソースを追加します。
{
"$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')]"
}
}
]
}
テンプレートに zip 展開リソースを含める場合は、次の点に注意してください。
- Linux の従量課金プランは
WEBSITE_RUN_FROM_PACKAGE = 1
をサポートしていません。 代わりに、WEBSITE_RUN_FROM_PACKAGE
設定で展開パッケージの URI を直接設定する必要があります。 詳細については、WEBSITE_RUN_FROM_PACKAGE を参照してください。 テンプレートの例については、「従量課金プランの Linux でホストされる関数アプリ」を参照してください。
packageUri
は、Functions でアクセスできる場所である必要があります。 Shared Access Signature (SAS) を使用した Azure Blob Storage の使用を検討してください。 SAS の有効期限が切れると、Functions はデプロイのために共有にアクセスできなくなります。 SAS を再生成する場合は、WEBSITE_RUN_FROM_PACKAGE
設定を新しい URI 値で更新することを忘れないでください。WEBSITE_RUN_FROM_PACKAGE
を URI に設定する場合は、トリガーを手動で同期する必要があります。設定を追加または更新する場合は、常に
appSettings
コレクションに必要なアプリケーション設定をすべて設定してください。 明示的に設定されていない既存の設定は、更新によって削除されます。 詳細については、アプリケーションの構成 に関する記事をご覧ください。Functions はパッケージのデプロイの Web デプロイ (msdeploy) をサポートしていません。 代わりに、デプロイ パイプラインと自動化で zip 展開を使用する必要があります。 詳細については、「Azure Functions の zip デプロイ」を参照してください。
リモート ビルド
展開プロセスでは、使用または zip 展開する .zip ファイルにはすぐに実行できる状態のアプリが含まれるものと想定されています。 つまり、既定では、カスタマイズは実行されません。
ただし、Python や Windows コンピューターで開発した Node.js アプリで Linux 固有のパッケージをプルする必要がある場合など、リモートでアプリを再構築する必要があるシナリオもあります。 この場合、zip 展開後にコードのリモート構築を実行するように Functions を構成できます。
リモート ビルドを要求する方法は、デプロイ先のオペレーティング システムによって異なります。
Linux コンテナー
コンテナー化された関数アプリを Azure Functions Premium プランまたは専用プランにデプロイする場合、次の手順が必要です。
linuxFxVersion
サイト設定にコンテナー イメージの識別子を設定します。- プライベート レジストリからコンテナーを取得する場合に必要な
DOCKER_REGISTRY_SERVER_*
設定を設定します。 WEBSITES_ENABLE_APP_SERVICE_STORAGE
アプリケーション設定をfalse
に設定します。
詳細については、アプリケーションの構成 に関する記事をご覧ください。
"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"
}
}
}
]
コンテナー化された関数を Azure Container Apps にデプロイする場合は、次のテンプレートが必要です。
kind
フィールドをfunctionapp,linux,container,azurecontainerapps
の値に設定します。managedEnvironmentId
サイト プロパティに、Container Apps 環境の完全修飾 URI を設定します。- サイトと同時に
Microsoft.App/managedEnvironments
リソースを作成する場合、サイトのdependsOn
コレクションにリソース リンクを追加します。
プライベート コンテナー レジストリから既存の Container Apps 環境にデプロイされるコンテナー化関数アプリの定義は、次の例のようになります。
"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')]"
}
}
]
Azure Arc に関数をデプロイする場合、関数アプリ リソースの kind
フィールドに設定する値は、デプロイのタイプによって異なります。
デプロイの種類 | kind フィールド値 |
---|---|
コードのみのデプロイ | functionapp,linux,kubernetes |
コンテナーのデプロイ | functionapp,linux,kubernetes,container |
ホスティング プラン リソースで行ったように、customLocationId
も設定する必要があります。
.NET 6 クイックスタート イメージを使用してコンテナー化された関数アプリの定義は、次の例のようになります。
"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
}
}
}
]
アプリケーション構成
Functions には、Azure で関数アプリを構成するための次のようなオプションがあります。
構成 | Microsoft.Web/sites プロパティ |
---|---|
サイトの設定 | siteConfig |
アプリケーションの設定 | siteConfig.appSettings コレクション |
siteConfig
プロパティには、次のサイト設定が必要です。
これらのアプリケーション設定は、特定のオペレーティング システムとホスティング オプションに必須 (または推奨) です。
次のアプリケーション設定は、コンテナーのデプロイに必要です。
次の設定は、プライベート コンテナー レジストリからデプロイする場合にのみ必要です。
Bicep ファイルや ARM テンプレートを使用してサイトやアプリケーションの設定を行う場合は、次の点に注意してください。
- 自動デプロイで
WEBSITE_CONTENTSHARE
を使用する必要がある場合に重要な考慮事項があります。 詳しいガイダンスについては、WEBSITE_CONTENTSHARE
リファレンスを参照してください。
- コンテナー デプロイの場合、アプリのコンテンツはコンテナー自体で提供されるため、
WEBSITES_ENABLE_APP_SERVICE_STORAGE
をfalse
にも設定します。
この記事の例で実行されているように、アプリケーション設定は常に、作成される
Microsoft.Web/sites
リソースのsiteConfig/appSettings
コレクションとして定義する必要があります。 これにより、関数アプリの実行に必要な設定が初期起動時に利用できるようになります。テンプレートを使用してアプリケーション設定を追加または更新する場合は、既存のすべての設定を更新に含めるようにしてください。 基礎となる更新 REST API 呼び出しは
/config/appsettings
リソース全体を置き換えるため、これを行う必要があります。 既存の設定を削除すると、関数アプリは実行されません。 個々のアプリケーション設定をプログラムを使用して更新するには、代わりに Azure CLI、Azure PowerShell、Azure portal を使用してこれらを変更できます。 詳細については、アプリケーション設定の操作に関する記事を参照してください。
スロットのデプロイ
Functions を使用すると、異なるバージョンのコードを関数アプリ内の固有のエンドポイントにデプロイできます。 これにより、運用環境で実行中の関数に影響を与えることなく、関数の更新の開発、検証、デプロイが簡略化されます。 デプロイ スロットは、Azure App Service の機能です。 使用できるスロットの数は、ホスティング プランによって異なります。 詳細については、「Azure Functions のデプロイ スロット」関数を参照してください。
スロット リソースは関数アプリ リソース (Microsoft.Web/sites
) と同じように定義しますが、代わりに Microsoft.Web/sites/slots
リソース識別子を使用します。 Premium プランに運用環境スロットとステージング スロットの両方を作成するデプロイの例 (Bicep と ARM のテンプレートの両方) については、「デプロイ スロットを使用した Azure Function App」を参照してください。
テンプレートを使用してスワップを実行する方法については、「Resource Manager テンプレートで自動化する」を参照してください。
スロットのデプロイをを行う場合は、次の考慮事項に留意してください。
デプロイ スロットの定義で
WEBSITE_CONTENTSHARE
設定を明示的に設定しないでください。 この設定は、アプリがデプロイ スロットで作成されると自動的に生成されます。スロットを入れ替えると、いくつかのアプリケーション設定は "粘着性" とみなされ、入れ替えるコードではなくスロットに保持されます。 このような "スロット設定" は、テンプレートの特定のアプリケーション設定定義に
"slotSetting":true
を含めることで定義できます。 詳細については、設定の管理に関するページを参照してください。
セキュリティで保護された展開
仮想ネットワークと統合することで、1 つ以上のリソースがセキュリティ保護されたデプロイで関数アプリを作成できます。 関数アプリの仮想ネットワーク統合は、Microsoft.Web/sites/networkConfig
リソースで定義されます。 この統合は、参照される関数アプリと仮想ネットワーク リソースの両方に依存します。 お使いの関数アプリが、プライベート エンドポイントやルートなど、他のプライベート ネットワーク リソースに依存する場合もあります。 詳細については、「Azure Functions のネットワーク オプション」をご覧ください。
セキュリティ保護されたストレージ アカウントを使用するデプロイを作成するとき、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 の両方のテンプレートを例示しています。
制限付きシナリオ | 説明 |
---|---|
仮想ネットワーク統合を使用した関数アプリの作成 | 関数アプリは仮想ネットワーク内に作成され、そのネットワーク内のリソースにフル アクセスできます。 関数アプリの受信アクセスや送信アクセスは制限されません。 詳細については、仮想ネットワーク統合に関する記事を参照してください。 |
セキュリティで保護されたストレージ アカウントにアクセスする関数アプリの作成 | 作成した関数アプリは、セキュリティで保護されたストレージ アカウントを使用します。これは、プライベート エンドポイントを使用して Functions でアクセスします。 詳細については、「ストレージ アカウントを仮想ネットワークに制限する」を参照してください。 |
いずれもプライベート エンドポイントを使用する関数アプリとストレージ アカウントの作成 | 作成した関数アプリは、プライベート エンドポイントを使用することでのみアクセスでき、プライベート エンドポイントを使用してストレージ リソースにアクセスします。 詳細については、プライベート エンドポイントに関する記事を参照してください。 |
制限付きネットワーク設定
関数アプリにネットワーク制限がある場合にも、次のような設定が必要になる場合があります。
設定 | 値 | 説明 |
---|---|---|
WEBSITE_CONTENTOVERVNET |
1 |
ストレージ アカウントを仮想ネットワークに制限している場合に、関数アプリをスケーリングできるアプリケーション設定。 詳細については、「ストレージ アカウントを仮想ネットワークに制限する」を参照してください。 |
vnetrouteallenabled |
1 |
関数アプリからのすべてのトラフィックに強制的に仮想ネットワークを使用させるサイト設定。 詳細については、リージョン仮想ネットワーク統合に関する記事を参照してください。 このサイト設定は、アプリケーション設定 WEBSITE_VNET_ROUTE_ALL に優先します。 |
ネットワークの制限に対する考慮事項
プライベート エンドポイントを通じてストレージ アカウントへのアクセスを制限している場合、ポータルや仮想ネットワーク外のデバイスからストレージ アカウントにアクセスすることはできません。 既定のネットワーク アクセス ルールを管理することで、セキュリティで保護された IP アドレスまたはストレージ アカウントの仮想ネットワークにアクセス権を付与できます。
テンプレートを作成する
Bicep または ARM のテンプレートを持つ専門家は、シンプルなテキスト エディターを使用してデプロイを手動でコード化できます。 それ以外の人には、次のように開発プロセスを簡略化する方法があります。
Visual Studio Code: Bicep ファイルと ARM テンプレートの両方で作業するのに役立つ拡張機能を利用できます。 これらのツールを使用することで、コードが正しいかどうかを確認することができ、基本検証を行うことができます。
Azure portal: ポータルで関数アプリと関連リソースを作成する場合、最後の [確認と作成] 画面には、[オートメーション用のテンプレートをダウンロードする] リンクがあります。
このリンクには、ポータルで選択したオプションに基づいて生成された 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 にデプロイ] ボタン
注意
この方法では、現在 Bicep ファイルのデプロイはサポートされていません。
<url-encoded-path-to-azuredeploy-json>
を、GitHub の azuredeploy.json
ファイルの生のパスのエンコードされた URL で置き換えます。
マークダウンを使用する例を次に示します。
[![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 がインストールされている必要があります。 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 azuredeploy.json -Verbose
このデプロイをテストするには、従量課金プランで Windows 上に関数アプリを作成するこのようなテンプレートを使用できます。
次のステップ
Azure Functions を開発および構成する方法について学習します。