AzureLogicAppsでCosmosDB内のドキュメントに一部変更を加える

[CosmosDB](https://azure.microsoft.com/ja-jp/products/cosmos-db)内の全ドキュメントに対して、タイムスケジュールトリガーで特定のプロパティの値を書き換えるという事をやる為に[AzureLogicApps](https://azure.microsoft.com/ja-jp/products/logic-apps)を使う事にしました！😊

CosmosDBのコンテナ内に格納されているドキュメントの数が多く、AzureFunctionsだとタイムアウトになってしまう気がしたので、LogicAppsでやってみよーと思った感じです。この記事はその際の備忘録&小ネタです。

https://azure.microsoft.com/ja-jp/products/logic-apps

https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-overview

## 実現したい事
CosmosDBに例えば下記のようなデータが格納されていたとします。
```json:before
{
    "id": "hogehoge123456789",
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
}
```
タイムスケジュールトリガーで決まった時刻に、"d"だけ値を0にしたい！
という事をやりたい訳です。
```json:after
{
    "id": "hogehoge123456789",
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 0,
}
```
という事で早速LogicAppsのリソースを作成します！
今回プランは従量課金を選択しました。
![2023-07-21_22h02_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821082/9565cd16-5609-08b7-e31a-75310e48a39a.png)

https://learn.microsoft.com/ja-jp/azure/logic-apps/quickstart-create-example-consumption-workflow

## ワークフローの作成
デザイナー画面からワークフローを作成していきます。

出オチ感満載ですが、最終的にどうなったかというと…
![2023-07-21_22h06_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821082/41d353c8-fc26-3502-a667-0e167ed65992.png)
こうなりました。結局途中でFunctionsを呼んでます。(おい！)

特定のプロパティ値を置き換えるというのがどうしても分からず、そこだけ頼ってます。

一応、以下解説です。
まず、スケジュールトリガーです。

https://learn.microsoft.com/ja-jp/azure/logic-apps/concepts-schedule-automated-recurring-tasks-workflows

次に、CosmosDBコネクタで全ドキュメントを取得します。

https://learn.microsoft.com/ja-jp/azure/connectors/connectors-create-api-cosmos-db?tabs=consumption

https://learn.microsoft.com/ja-jp/connectors/documentdb/

次に`Foreach`の中でAzureFunctionsを追加します。
![2023-07-21_22h27_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821082/0290384f-48b6-e462-2366-d41cb81227c8.png)

以下のドキュメントの[「ロジック アプリのワークフロー内から関数を作成する (従量課金ワークフローのみ)」](https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-azure-functions?tabs=consumption#create-function-designer)のやり方を参考に行います。

https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-azure-functions?tabs=consumption

関数定義エディターで追加したコードは以下の通りです。
```javascript:javascript
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へ戻します。
![2023-07-21_22h44_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821082/b1f7074c-70d7-a2e7-d23c-9997627b1d5f.png)
全て終わったタイミングでSlackに通知を残して完了です。

https://learn.microsoft.com/ja-jp/connectors/slack/

因みに、Slackのプライベートチャンネルへ通知させる場合は、チャンネル名にはチャンネルID(推奨)、そしてチャンネルのインテグレーションからアプリを追加しておく必要があるようです。
![2023-07-21_22h48_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821082/0e922c3d-a6d5-8821-55b9-38a734c36546.png)

## さいごに
LogicAppsだけで完結させられるような気がしますが、ちょっとやり方が分かりませんでした…
とはいえ、一部コードに頼ってしまえばいい。というのは嬉しい発見でした。(いいのか？😅)

https://learn.microsoft.com/ja-jp/azure/logic-apps/quickstart-create-example-consumption-workflow

https://learn.microsoft.com/ja-jp/azure/connectors/connectors-create-api-cosmos-db?tabs=consumption#add-azure-cosmos-db-action

https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-azure-functions?tabs=consumption