Azure Functionsの構成
Azure functionの各関数は、function.jsonとセットで定義されます。
MyFunctionApp/
├── Function1/
│ ├── function.json
│ └── index.js
├── Function2/
│ ├── function.json
│ └── index.js
└── shared/
└── utils.js
Azure functionsのfunction.json
Azure functionsは、どのタイミングで関数を発火させるかという「トリガー」の設定と、データの入力、処理、出力などをまとめた「バインド」を設定されている必要があります。これは、function.jsonに定義してあります。(JavaScript/PowerShell/Python/TypeScriptの場合)
以下はfunction.jsonの一例です。
{
"bindings": [
{
"type": "queueTrigger",
"direction": "in",
"name": "order",
"queueName": "myqueue-items",
"connection": "MY_STORAGE_ACCT_APP_SETTING"
},
{
"type": "table",
"direction": "out",
"name": "$return",
"tableName": "outTable",
"connection": "MY_TABLE_STORAGE_ACCT_APP_SETTING"
}
]
}
まず、directionはデータの方向を示しています。inの場合は、関数にデータを入力する方向で、outは関数からデータを出力する方向です。つまり入力と出力の方向の情報を記しています。myqueue-itemsにキューメッセージが入力された場合に、queueTriggerという関数が発火します。そして、処理をしてoutTableというテーブルに情報を入れ込むということです。"name": "$return",
という表現からも返り値がテーブルい直接書き込まれることがわかります。
処理の関数について、javascriptでは以下のような処理を行います。orderはキューのデータです。orderの情報をもとに、orderを処理していることがわかります。
Azure functionsの処理ファイル
今回はjavascriptで処理を行います。関数のロジック自体は非常にシンプルです。
関数のパラメータ
context: Azure Functions ランタイムから提供されるコンテキストオブジェクトで、関数の実行環境に関する情報や、バインディングへのアクセスなどを提供します。
order: 関数のトリガーとなったキューメッセージの内容です。この場合、order オブジェクトはキューから直接受け取ったデータを表します。
処理の流れ
PartitionKeyとRowKeyの設定: order オブジェクトに PartitionKey と RowKey を設定します。これらは、Azure Table Storageでのデータのパーティショニングと一意性の確保に使用されます。
PartitionKey は、データを分割するためのキーで、関連するデータを同じパーティションに格納することでアクセスの効率を上げることができます。ここでは "Orders" という静的な値が使用されており、すべての注文が同じパーティションに格納されることを意味します。
RowKey は、パーティション内でのデータの一意性を保証するキーです。generateRandomId 関数を呼び出して生成される一意のIDが設定されます。これにより、各注文が識別可能になります。
データのバインディングへの設定: context.bindings.order = order; により、処理された order オブジェクトが指定されたバインディング(このコードからは出力バインディングであることが推測されます)に設定されます。この操作により、order オブジェクトは自動的に指定されたストレージに保存される準備が整います。
module.exports = async function (context, order) {
order.PartitionKey = "Orders";
order.RowKey = generateRandomId();
context.bindings.order = order;
};
function generateRandomId() {
return Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
}
そんな感じです。つまり、Azure Functionsではデータの流れと関数の発動タイミングを処理する関数とセットで定義することがミソです。