Azure Functionsをローカル環境でテストする際にAzureWebJobsStorageがなくてエラーになる時の対処方

2021/04/03に公開

なんの記事か

$ func start

を実行した結果

Missing value for AzureWebJobsStorage in local.settings.json. This is required for all triggers other than httptrigger, kafkatrigger. You can run 'func azure functionapp fetch-app-settings <functionAppName>' or specify a connection string in local.settings.json.

となった場合の対処方法

なんのエラーか

httptriggerとkafkatrigger以外のAzureFunctionsは、動作するためににAzureStorageが必要なので、使用できるAzureStorageが無いとエラーになる。

対応方法

対応方法は大きくわけて2種類

  1. Azure上に本物のStorageを作る
  2. ローカル環境でStorageを動かす

ここでは、2の方法を説明します。
どうせなら全部ローカルで動かしたいので。

DockerでAzure Storageを動かそう

ローカルでStorageを動かすには、たぶんdockerを使うのが楽です。

$ docker run -p 10000:10000 -p 10001:10001 mcr.microsoft.com/azure-storage/azurite

FunctionsからローカルのStorageを参照するように設定しよう

local.settings.jsonAzureWebJobsStorageを下記のように設定しよう

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node"
  }
}

動かそう

$ func start

補足

"AzureWebJobsStorage": "UseDevelopmentStorage=true",

を設定すると、下記と同じ動作をするようです。Storageをlocalhost以外で動かしている場合はIPアドレス部分を書き換えると動きます。

"AzureWebJobsStorage": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10001/devstoreaccount1;"

参考 : https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite?tabs=visual-studio#http-connection-strings

サンプル(TimerTrigger)

https://github.com/k-ibaraki/azure-functions-local-sample

参考にするべき公式マニュアル

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=macos,csharp,bash
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-app-settings
https://docs.microsoft.com/ja-jp/azure/storage/common/storage-configure-connection-string
https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite

Discussion