Azure OpenAI Service ワークショップに参加したので復習してみる(リソースの作成)

# はじめに
12/11に開催された「Azure OpenAI Service ワークショップ」に参加しました。
当日はARM テンプレートが用意されており、Azureリソースを一括で作成しておりました。
そこで復習をかねて1から作成してみることにしました。

参加したワークショップの内容👇

https://hack-everything.connpass.com/event/301552/

# この記事でやること
当日は盛りだくさんの内容でした。

そこで1記事目は、CosmosDBのChange Feedを使ったAzure AI Searchへのインデックスの作成までを記事にしようとしていたのですが、普段使わない言語(Python)とリソース(CosmosDB)の作成が思った以上に大変でした。。。

ので、この記事では、PythonでのAzure Functionsローカル実行とCosmosDBの設定についてを備忘録として残します。

# Pythonを使ってのAzure Functionsローカル実行


今回はまった大きな原因はAzure Functions Core Toolsのバージョンがおそらく良くなかったことです。
そこで以下のGitHubのissueに習い、現在のバージョンをアンインストールし、最新のAzure Functions Core Toolsをインストールすることでエラーを消すことができました。

https://github.com/Azure/azure-functions-core-tools/issues/3242

こちらの公式ドキュメントにあるインストーラーから取得したAzure Functions Core Toolsを使って、この公式ドキュメント通りに作成していればここまではまることはなかったのではと後悔です…

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Cisolated-process%2Cnode-v4%2Cpython-v2%2Chttp-trigger%2Ccontainer-apps&pivots=programming-language-python

以下の記事に沿って進めることで、ローカル実行のできるHTTP Triggerの作成までできました。
(下の記事ではTimer Triggerを作っていますが、HTTP Triggerを選択します。)

https://qiita.com/fsd-takizawa/items/bece94313b4c256c0a81


PythonのテンプレートではCosmosDB Triggerが見当たらなかったため、一度HTTP Triggerを作成した後に、CosmosDB Triggerに書き換えることにしました。
(参考記事にはCosmos DB Triggerがあるので自分の環境がいけないかも…)



# CosmosDBのリソース作成とコンテナ作成

CosmosDBに関しては、私がまったく理解していなかったためにはまってしまいました。

ので、リソースの作成方法を1から記録します。

リソースの作成でAzure Cosmos DBを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/d2e0db4d-12d5-1b47-0081-c41ae294177f.png)

今回はAPIオプションはコア(SQL) - 推奨を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/4ec4bcd8-0f87-39a2-620c-60f9438f2eb7.png)

今回はハンズオンのリソースと同じ内容になるように、この内容で作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/8d33750e-1db2-18f6-dd58-6cc0a9e83287.png)

各項目の詳しい説明

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-integrate-store-unstructured-data-cosmosdb?tabs=csharp

作成したCosmosDBのリソースに飛び、データエクスプローラーを選択してコンテナを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/f623719f-7261-3146-6fe5-82c6c7094e62.png)

コンテナの内容は以下の通り
Conteiner idが「任意の名前のもの(監視対象コンテナ)」と「leases(リースコンテナ)」の2つが必要です。
(以降登場するFunctionsの引数の`create_lease_container_if_not_exists=False`を`True`に変えれば、リースコンテナはいらないかもしれない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/4248e656-570b-e1a9-adf2-03c6b83ddd02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/6e4fd833-3dc7-220e-0893-1308fa447e31.png)


https://learn.microsoft.com/ja-jp/azure/cosmos-db/nosql/change-feed-processor?tabs=dotnet



# CosmosDBトリガーの書き方

```python
@app.cosmos_db_trigger(arg_name="items",
                       connection="COSMOS_CONNECTION",
                       database_name=COSMOS_DATABASE_NAME, 
                       container_name=COSMOS_CONTAINER_NAME, 
                       create_lease_container_if_not_exists=False,
                       feed_poll_delay=5000,
                       lease_container_name="leases")
```

リースコンテナがなんなのかわかっておらず、ずっと沼ってました😇

ここで引数にも注意が必要だったのですが、`connection="COSMOS_CONNECTION"`の`COSMOS_CONNECTION`だけはlocal.settings.jsonにかく必要があります。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-cosmosdb-v2-trigger?tabs=python-v2%2Cisolated-process%2Cextensionv4%2Cnodejs-v4&pivots=programming-language-python

# おわりに
公式ドキュメントをちゃんと読んで、理解してリソースを作らないとだめですね。