仕事やプライベートで調べたことのメモ書きなど(@札幌)

仕事やプライベートで調べたこと、興味ある事のメモ書きです。2016年4月から札幌で働いてます。※このブログは個人によるもので、団体を代表するものではありません。

Azure FunctionsでQueueTriggerパラメータとバインディングのパラメータを連携させる (Python)

課題設定

やりたかったことは以下のこと。

  • QueueTriggerパラメータで情報を受け取り
  • その情報に応じたTable Storageのレコードを読み取る

そもそもpythonでtable storageの入出力バインドする例がほとんど見当たらなかったので少し試行錯誤しました。以下が参考になりました。
github.com

以下の感じで行けることを確認

  • トリガーで渡されるメッセージがjsonだと、{xxxx}のように書いてやることでそのjsonメッセージを参照し、他のバインディング設定に渡す記述をできる

docs.microsoft.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"}