Azure Cosmos DB - Functionsのトリガーに使用する

# 目的

[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-cosmos-db-triggered-function)

Azure Cosmos DB によってトリガーされる関数を作成する
関数の作成には`VSCode`を使用する

# 監視対象のCosmosDB

![image-20210725162151807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/2703b006-508a-5c2c-8ae6-2a3c8d6010a4.png)

Azure Cosmos DB アカウント：hashimoto-cosmosdb
データベース名：TestDB
コレクション名：TestTable

# 関数の作成



1.トリガーの選択

![image-20210725163620593.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/722dcb4e-5acf-2d02-6c2a-0b7ff3bb1133.png)

2.接続情報の選択
`+ Create new local app setting`で設定を新規作成

![image-20210725163632902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/0b7e211b-776f-c585-c06e-7f6009263ba5.png)

3.監視対象のCosmosDBアカウント名を選択

![image-20210725163642967.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/e70d0154-907c-dec2-83cc-1b4e7a8f0c27.png)

4.監視対象のデータベース名（`TestDB`）を入力

![image-20210725163655154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/f474dbb6-5edb-0bde-22de-bb3a5a0812e4.png)

5.監視対象のコレクション名（`TestTable`）を入力

![image-20210725163708992.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/d1985a4d-275c-a2d2-9937-c861e855ac9d.png)

6.リースを格納するコレクション名（`leases`※デフォルト）を入力

![image-20210725163717413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/5cca7d8b-d62f-a278-5841-0670b8e083fc.png)

7.リースを格納するコレクションが無かった場合に自動生成するかどうかを選択

![image-20210725163725504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/fd6dfc41-bcb6-6ad7-d612-45343f679003.png)

`CosmosTrigger1/function.json`の内容

![image-20210725164056347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/14a18a24-b2e0-d2d9-f4dd-b49b098f9f11.png)

`local.settings.json`の内容
`hashimotocosmosdb_DOCUMENTDB`は、2.接続情報の選択で生成されたもの

![image-20210725163850581.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/3d5ad53f-af31-e772-7b4b-975a6505280b.png)

**※ `local.settings.json`は、ローカル環境での実行/デバッグ用の設定のため、クラウド環境での実行には環境変数の追加が必要**

# 環境変数の追加

1．**CosmosDBの接続文字列**をコピーする　※リースを格納するため書き込み権限が必要

![image-20210725164718662.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/249267a4-b609-a81a-a4d2-450db2b0b57f.png)

## Azure Portalの場合

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/d9018c95-03b8-01d8-59d0-2d454af441f4.png)

1. 該当関数アプリの`構成` - `+ 新しいアプリケーション設定`から、先ほどコピーした **CosmosDBの接続文字列**を名前**CosmosDbConnectionString**で追加する


## VSCodeの場合

[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-add-output-binding-cosmos-db-vs-code?pivots=programming-language-javascript#update-your-function-app-settings)を参考に関数アプリの設定を更新する

1. F1 キーを押してコマンド パレットを開き、コマンド `Azure Functions: Add New Setting...` を検索して実行する
2. 対象の関数アプリを選択します。 プロンプトで、次の情報を入力する
   - **新しいアプリ設定名を入力する**: `CosmosDbConnectionString` 
   - **"CosmosDbConnectionString" の値を入力する**: 先ほどコピーした **CosmosDBの接続文字列**
3. F1 キーをもう一度押してコマンド パレットを開き、コマンド `Azure Functions: Download Remote Settings...` を検索して実行する
4. 前の記事で作成した関数アプリを選択します。 **[すべてはい]** を選択して既存のローカル設定を上書きする
5. 以下のように`local.settings.json`に`CosmosDbConnectionString`が追加される

![image-20210725165705526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ddfd4b17-8e76-4d24-23aa-8f1699f2ce04.png)




# 関数の設定を更新する

### 既存関数の場合

`CosmosTrigger1/function.json`の内容を変更する

![image-20210725170117164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/70f85396-3cc6-6214-430d-d2be98efe4b1.png)


### 新規関数を作成する場合

「2.接続情報の選択」で`local.settings.json`に追加した設定を選択

![image-20210725170637587.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/929b416a-9f74-6864-82c4-0251326d02e8.png)

※`local.settings.json`の`CosmosDbConnectionString`と`hashimotocosmosdb_DOCUMENTDB`は一致しており内容に問題があるわけではない


# 動作確認

コレクションにアイテムを追加

![image-20210725170442067.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c53fd425-ae62-ee21-47d0-f48dc0af6a69.png)


関数ログが出力されることを確認

![image-20210725170519835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/f271832c-e45f-1cce-fb90-7e76b66c4108.png)

※アイテムの追加、更新ではトリガーされるが、削除ではトリガーされない