Azure FunctionsでQueueTriggerパラメータとバインディングのパラメータを連携させる (Python)
課題設定
やりたかったことは以下のこと。
- QueueTriggerパラメータで情報を受け取り
- その情報に応じたTable Storageのレコードを読み取る
そもそもpythonでtable storageの入出力バインドする例がほとんど見当たらなかったので少し試行錯誤しました。以下が参考になりました。
github.com
以下の感じで行けることを確認
function.jsonファイルは以下の感じ
{ "scriptFile": "__init__.py", "bindings": [ { "name": "queuemsg", "type": "queueTrigger", "direction": "in", "queueName": "myqueue", "connection": "AzureStorageConnectionStringIn" }, { "name": "tabledata", "type": "table", "tableName": "mytable", "partitionKey": "{partition_id}", "rowKey": "{row_key}", "connection": "AzureStorageConnectionStringIn", "direction": "in" } ] }
__init__.pyは以下の感じ
import logging import azure.functions as func def main(queuemsg: func.QueueMessage, tabledata) -> None: input_msg = queuemsg.get_body().decode('utf-8') logging.info('Python queue trigger function processed a queue item: %s', input_msg) logging.info('tabledata: %s', tabledata)
入力キューに設定するメッセージ
{"partition_id": "mypartition", "row_key": 1}
みたいな感じでいけるはず。で、ただinput bindingできるレコードがない場合には実行ができないのですが、その例外ハンドルを関数側でできないのが気を付けるところ。
binding時にデータを絞り込むような記述をする
partitionKeyやrowKeyを指定するのではなくfilterを指定するようにすると、条件にあったレコードを取得することができる。(複数返ってくるものも扱える) 例えば以下のような記述になります。
function.jsonファイルは以下の感じ
{ "scriptFile": "__init__.py", "bindings": [ { "name": "queuemsg", "type": "queueTrigger", "direction": "in", "queueName": "myqueue", "connection": "AzureStorageConnectionStringIn" }, { "name": "tabledata", "type": "table", "tableName": "mytable", "filter": "name eq '{name_filter}'", "connection": "AzureStorageConnectionStringIn", "direction": "in" } ] }
入力キューに設定するメッセージ
{"name_filter": "test"}