つい最近AzuriteにTable ServiceのPreviewが追加されたようです。
これが何を意味するかと言うと、Durable FunctionsのOrchestration関数の開始や停止などのアクションが格納、処理できるようになったため、AzuriteをバックエンドにDurable Functionsでアプリケーションを開発できるようになったってことですヤッター!
今までは例えばmacOSでDurable Functionsを使った開発をする場合は、 local.setting.json
に有効なStorage Accountの接続情報を記述して、アプリケーションは手元で、各アクションの履歴はAzure上のTableにみたいな流れにすれば開発は出来ていました。
それがこれからはAzuriteをローカルで動かして、接続情報をローカルに向けるだけで開発が出来るようになります。
今まで出来なかったよねの話やIssueの話は
こちらの記事を見てみると良いです。
試してみる
まずは現状把握として Azure Storage Explorer でローカルに何も立っていない、アクセス出来ないよねを確認してみます。
Listには載っていますが、クリックしても接続エラーが出るだけです。
ということでAzure Storage Explorerから手元が見えるようにAzuriteを起動してみます。 AzuriteはnpmやDockerHub、GitHubなどで提供されています。 今回はDockerHubで提供されているlatestを使って試してみます。
$ docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 mcr.microsoft.com/azure-storage/azurite Azurite Blob service is starting at http://0.0.0.0:10000 Azurite Blob service is successfully listening at http://0.0.0.0:10000 Azurite Queue service is starting at http://0.0.0.0:10001 Azurite Queue service is successfully listening at http://0.0.0.0:10001 Azurite Table service is starting at http://0.0.0.0:10002 Azurite Table service is successfully listening at http://0.0.0.0:10002
こんな感じで立ち上げたら10002番ポートでTable Serviceが立ち上がってるみたいですね。
この状態でAzure Storage ExplorerでRefresh Allしてみると接続出来るのが確認できると思います。 接続が確認できたら手元で適当にDurable Functionsのアプリケーションを立ててみましょう。
とりあえず手っ取り早く動かしたいので以下の物を作りました
- func new で JavaScript のアプリケーションを作る
- npm i durable-functions でDurable Functions動かせるようにしておく
- func new で Durable Functions orchestrator, Durable Functions activity, Durable Functions HTTP starterの3つを作る
これで最低限動くものが出来ましたが、このステップの他に必要なことがあります。
この記事の先頭で言及していた local.settings.json
の書き換えです。
ローカルに接続するための接続情報を記述する必要があるので、以下のように設定します。
{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "node", "AzureWebJobsStorage": "UseDevelopmentStorage=true" } }
詳しい接続文字列についてはDocsを参照してください。
ローカルでの Azure Storage の開発に Azurite エミュレーターを使用する | Microsoft Docs
この状態でスタートをしてみると
$ func start Azure Functions Core Tools Core Tools Version: 3.0.3477 Commit hash: 5fbb9a76fc00e4168f2cc90d6ff0afe5373afc6d (64-bit) Function Runtime Version: 3.0.15584.0 [2021-05-26T09:15:12.228Z] Cannot create directory for shared memory usage: /dev/shm/AzureFunctions [2021-05-26T09:15:12.229Z] System.IO.FileSystem: Access to the path '/dev/shm/AzureFunctions' is denied. Operation not permitted. Functions: DurableFunctionsHttpStart: [POST,GET] http://localhost:7071/api/orchestrators/{functionName} DurableFunctionsOrchestratorJS: orchestrationTrigger Hello: activityTrigger
待受が始まるので、HttpTriggerからOrchestratorを呼び出してみます。
$ curl http://localhost:7071/api/orchestrators/DurableFunctionsOrchestratorJS
では返ったきたStatusGetのURLを見てみましょう
$ curl http://localhost:7071/api/orchestrators/DurableFunctionsOrchestratorJS { "id": "fcd4eb831b964f278f621807ebffff21", "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/fcd4eb831b964f278f621807ebffff21?taskHub=TestHubName&connection=Storage&code=6/k4Nwo5z8gCWp9fygP2WPAiM78w9BgmzMvxEHZa4C3CnhdXVkW2fA==", "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/fcd4eb831b964f278f621807ebffff21/raiseEvent/{eventName}?taskHub=TestHubName&connection=Storage&code=6/k4Nwo5z8gCWp9fygP2WPAiM78w9BgmzMvxEHZa4C3CnhdXVkW2fA==", "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/fcd4eb831b964f278f621807ebffff21/terminate?reason={text}&taskHub=TestHubName&connection=Storage&code=6/k4Nwo5z8gCWp9fygP2WPAiM78w9BgmzMvxEHZa4C3CnhdXVkW2fA==", "rewindPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/fcd4eb831b964f278f621807ebffff21/rewind?reason={text}&taskHub=TestHubName&connection=Storage&code=6/k4Nwo5z8gCWp9fygP2WPAiM78w9BgmzMvxEHZa4C3CnhdXVkW2fA==", "purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/fcd4eb831b964f278f621807ebffff21?taskHub=TestHubName&connection=Storage&code=6/k4Nwo5z8gCWp9fygP2WPAiM78w9BgmzMvxEHZa4C3CnhdXVkW2fA==" }% # $ curl "http://localhost:7071/runtime/webhooks/durabletask/instances/fcd4eb831b964f278f621807ebffff21?taskHub=TestHubName&connection=Storage&code=6/k4Nwo5z8gCWp9fygP2WPAiM78w9BgmzMvxEHZa4C3CnhdXVkW2fA==" {"name":"DurableFunctionsOrchestratorJS","instanceId":"fcd4eb831b964f278f621807ebffff21","runtimeStatus":"Completed","input":null,"customStatus":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2021-05-26T09:23:44Z","lastUpdatedTime":"2021-05-26T09:23:44Z"}%
動作が確認できました。
またAzure Storage Explorerを確かめてみると
Dockerに立てたEmulatorが使われていることが確認できました、素晴らしい。
この様にAzuriteのアップデートによりmacOSでもローカル環境でDurable Functionsのストレス無い開発が出来るようになりました。 Dev環境として一個アカウントを払い出すのが面倒…けれども自分のマシンはmacだし…みたいな悩みを抱えていた人にとっては素晴らしいアップデートだと感じています。