CosmosDB内の全ドキュメントに対して、タイムスケジュールトリガーで特定のプロパティの値を書き換えるという事をやる為にAzureLogicAppsを使う事にしました!😊
CosmosDBのコンテナ内に格納されているドキュメントの数が多く、AzureFunctionsだとタイムアウトになってしまう気がしたので、LogicAppsでやってみよーと思った感じです。この記事はその際の備忘録&小ネタです。
実現したい事
CosmosDBに例えば下記のようなデータが格納されていたとします。
{
"id": "hogehoge123456789",
"a": 1,
"b": 2,
"c": 3,
"d": 4,
}
タイムスケジュールトリガーで決まった時刻に、"d"だけ値を0にしたい!
という事をやりたい訳です。
{
"id": "hogehoge123456789",
"a": 1,
"b": 2,
"c": 3,
"d": 0,
}
という事で早速LogicAppsのリソースを作成します!
今回プランは従量課金を選択しました。
ワークフローの作成
デザイナー画面からワークフローを作成していきます。
出オチ感満載ですが、最終的にどうなったかというと…
こうなりました。結局途中でFunctionsを呼んでます。(おい!)
特定のプロパティ値を置き換えるというのがどうしても分からず、そこだけ頼ってます。
一応、以下解説です。
まず、スケジュールトリガーです。
次に、CosmosDBコネクタで全ドキュメントを取得します。
次にForeach
の中でAzureFunctionsを追加します。
以下のドキュメントの「ロジック アプリのワークフロー内から関数を作成する (従量課金ワークフローのみ)」のやり方を参考に行います。
関数定義エディターで追加したコードは以下の通りです。
module.exports = function (context, data) {
const input = data.body
// 'd'というプロパティがあるかチェック
if (input.hasOwnProperty('d')) {
//あれば0に置き換える
input.d = 0;
}
context.res = {
body: input
};
context.done();
};
最後にFunctionsから返ってきたデータをCosmosDBへ戻します。
全て終わったタイミングでSlackに通知を残して完了です。
因みに、Slackのプライベートチャンネルへ通知させる場合は、チャンネル名にはチャンネルID(推奨)、そしてチャンネルのインテグレーションからアプリを追加しておく必要があるようです。
さいごに
LogicAppsだけで完結させられるような気がしますが、ちょっとやり方が分かりませんでした…
とはいえ、一部コードに頼ってしまえばいい。というのは嬉しい発見でした。(いいのか?😅)