はじめに
本記事は、AzureFunctions
のうちQueue Storage
のバインドを利用してAzureFunctions
を連鎖させることを目指します。
概要としては以下の通りです。
- HTTP リクエストで起動した
AzureFunctions
がQueueStorage
にメッセージをenqueue
-
Queue
へのenqueue
をトリガーに別のAzureFunctions
を起動する
図示するとこんな感じです。
- User が curl を叩く
- ②の
AzureFunction
が起動 -
Queue Storage
にメッセージがenqueue
-
enqueue
を trigger に③のAzureFunctions
が起動
前提
- VSCode などを利用して
AzureFunctions
の作成・デプロイができる - ②と③の
AzureFunctions
は同一リージョン・同一Storage Account
に紐づいている
準備・実装
準備:① Queue Storage
Queue Storage
に「+Queue」ボタンからpiyo
というQueue
を作ります。
実装:② AzureFunctions
VSCode から HTTP Trigger のAzureFunctions
を作成し、自動生成されたコードに対して修正していきます。
追加するのは下部の5項目、"type", "direction", "name", "queueName", "connection"
です。
(VSCode ならば、add binding
でも追加できます)
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "queue",
"direction": "out",
"name": "fuga1",
"queueName": "piyo",
"connection": "AzureWebJobsStorage"
}
]
}
以下に簡単に追加項目の説明をします。はまりやすい設定は、name
です。
このname
がPython
プログラム上で受け取る引数名になります。
(最初はここがわからなくて、関数の実行ログも出力が遅いのでエラーの原因の特定に時間がかかりました)
項目名 | 定数 | パラメータ | 説明 |
---|---|---|---|
type | 〇 | queue |
binding の種類 |
direction | 〇 | out |
binding の方向。出力のためout
|
name | fuga1 |
Python の実行関数で受け取る際の引数の名前
|
|
queueName | piyo | 上記のステップで作成したQueue の名前 |
|
connection | 〇 | AzureWebJobsStorage | 今回は同一のStorage Account のため定数。 |
次に、Python
のコード本体です。
ここで、main 関数の引数にfuga1
を入れます。すなわち、function.json
と同じ名前を指定します。
注意 name
に_
などの記号を入れると動かなくなります。
import logging
import azure.functions as func
def main(req: func.HttpRequest, fuga1: func.Out[str]) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
# パラメータの取得
name = req.params.get('name')
# queueに入れる
fuga1.set(name)
# 返り値(自動生成の場合はもうちょっと長いけどここは関係ないので省略)
return func.HttpResponse("\n".join(return_list))
実装:③ AzureFunctions
②のときと同様に VSCode から、今度はQueue Trigger
の関数を自動生成します。
今回は入力のbinding
のみです。
queueName
にはQueue Storage
のpiyo
を指定します。
name
はfuga2
にしています。このname
はAzureFunctions
ごとに固有に決めることができるからです。
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "fuga2",
"type": "queueTrigger",
"direction": "in",
"queueName": "piyo",
"connection": "AzureWebJobsStorage"
}
]
}
次に、Python
のコード本体です。
main 関数の引数のみfunction.json
で指定した変数名fuga2
に修正します。
import logging
import azure.functions as func
def main(fuga2: func.QueueMessage) -> None:
logging.info('Python queue trigger function processed a queue item: %s',
fuga2.get_body().decode('utf-8'))
実行例
ローカルの curl から叩くと、動いていることがログからわかります。
まずは、HTTP リクエストで②のAzureFunctions
が起動し、
③のAzureFunctions
がQueue
をトリガーにして起動しています。
Queue
にメッセージが入ってから2秒後にAzureFunctions
が動いているのがわかりますね。
(関数名には目を瞑ってください)
おわりに
AzureFunctions
のQueueTrigger
で連鎖できることが分かりました。
実際に動くサービスを作成する場合はQueue
の名前を上手に生成したり、複数個のout bindings
を利用したりすることでAzureFunctions
をいい感じに連鎖できそうですね。