Azure OpenAI Service ワークショップに参加したので復習してみる(データを一括登録するHTTP Trigger)

# はじめに
前回Azure Open AIによって、ベクター化したデータもインデックスに登録できるようになりました。

前回の記事

https://qiita.com/usomaru/items/6c4e9678b41756190ac2

# この記事でやること

下の図の赤枠のところです。
Cosmos DBにデータを登録するFunctionsを作成します。

今回のFunctionsが完成すると、HTTP Triggerを使ってCosmos DBにデータの登録ができ、そこから前回までに実装したCosmos DB Triggerによってインデックスにデータの登録までができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/4613cd74-02cc-7965-f680-f694eba8eaa5.png)


# 関数を追加する

現在のフォルダに関数を追加しようとしたところ、3通りの方法があったのでメモです。(試したのは2通り)

Visual Studio CodeのAzure拡張機能から、Fuctions追加ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/12e25052-fa44-beb6-bb02-c2ff6a454ff3.png)

追加しようとるすと、追加方法が3通りでてきました。
そのうち上の2つを試しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/0c205af5-df3e-bb9a-1778-03df4dc36199.png)

### Add httpTrigger function to an existing fileの場合

今のファイル(function_app.py)にHTTP Triggerのソースコードが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/a0b51b30-1849-2562-099c-fbcd7542cc1e.png)

デバックすると、関数が2つあることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/72656fd5-13e8-72fc-9420-f4dbd1c792ad.png)


### Create New Blueprint fileの場合

blueprint.pyファイルが新たに作成され、そちらのファイルにHTTP Triggerがありました。
blueprint機能というものがあり、この機能を使うと1関数につき1ファイルという感じでファイルを分けられるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/a5320deb-56ca-47f0-d26e-4acdb4067c57.png)

blueprintに関する参考記事👇

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-python?tabs=asgi%2Capplication-level&pivots=python-mode-decorators#blueprints

https://zenn.dev/choshicure/articles/364875750f8888#%E3%83%96%E3%83%AB%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B

function_app.pyの方に以下追加と書かれているところを足してあげます。

```python:function_app.py
from blueprint import blueprint # 追加

app = func.FunctionApp()

app.register_functions(blueprint) # 追加
```

すると、追加したHTTP Triggerも表示されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/23db0e50-29a2-09dc-21ac-d974adfe2942.png)

# データを登録するHTTP Trigger

データを登録するコード(一括も可)
Blueprintを使う方法でかきました。

```python
import azure.functions as func
import logging
from azure.cosmos import CosmosClient
import os

blueprint = func.Blueprint()

COSMOS_DATABASE_NAME = ""
COSMOS_CONTAINER_NAME = ""

cosmos_client = CosmosClient.from_connection_string(os.getenv("COSMOS_CONNECTION"))

@blueprint.route(route="data/upload_json", methods=["POST"], auth_level=func.AuthLevel.ANONYMOUS)
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:

    container = cosmos_client.get_database_client(COSMOS_DATABASE_NAME).get_container_client(COSMOS_CONTAINER_NAME)

    items = req.get_json()
    for item in items:
        container.upsert_item(item)

    return func.HttpResponse(f"{len(items)} data uploaded.", status_code=200)
```

# Postmanを使って試してみる

HTTP TriggerのURLをPostmanから叩いてみます。
19件登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/8528f3d5-0734-f0c1-bd9e-235f150c9086.png)

Cosmos DBにデータが登録され、そこからインデックスにもデータが追加されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/f9158e99-5451-c5ef-fa51-535b34b120bc.png)


# おわりに
データ追加がかなり便利になりました。
普段pythonでFunctionsを使わないので、Bulueprint機能なるものがあるという学びを得ることができました。