【AWS】Azure OpenAIをAWS Lambdaで呼び出そう！

### はじめに

Azure OpenAIをAWS Lambdaから呼び出したい！

マルチクラウドっぽく、AzureのサービスをAWSから呼び出したかった。
さらに、Azure OpenAIもAWSから呼び出せたらいいですよね。
しかしながら、呼び出しまでにいろいろつまずいたのでエラーメッセージとともに対応方法を共有します。

### 構成

構成はこんな感じ:point_down:です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/53c3f70f-4476-b9a5-3bb8-068104a8ce79.png)

### やること
　1. Azure OpenAIを作成、モデルをデプロイする。
　2. AWS Lambdaを作成する。
　3. AWS Lambdaレイヤーを作成、レイヤーの追加をする。
　　3-1. AWS Lambdaレイヤーを作成する。
　　3-2. レイヤーを追加する。
　**4. AWS LambdaでAzure OpenAIを呼び出すようにする。←この記事のメイン**

では、やってみましょう！

#### 1. Azure OpenAIを作成、モデルをデプロイする。

手順は以下を参照ください。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/create-resource?pivots=web-portal

#### 2. AWS Lambdaを作成する。

手順は以下を参照ください。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started.html

#### 3. AWS Lambdaレイヤーを作成、レイヤーの追加をする。

##### 3-1. AWS Lambdaレイヤーを作成する。

AWS LambdaでOpenAIのモジュールをimportしたいため、レイヤーを作成します。

まず、AWS Lambdaレイヤーを作成します。

手っ取り早く作成するため、AWS CloudShellを使います。
AWS CloudShellを開いて以下のコマンドを実行します。

```shell:CloudShell
mkdir python
pip install -t ./python openai fastapi==0.99.0
zip -r openai.zip ./python
```

:::note warn
`pip install -t ./python openai fastapi==0.99.0` コマンド

インストールしたopenaiのバージョンが1.x系であることを確認します。
0.x系の場合、**手順4**でエラーが出ます。エラーについては後述。
バージョンは `ls -al ./python` で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/f4f4a426-07eb-0a26-8602-3aa56194e840.png)

また、上記コマンドを `pip install -t ./python openai` で実行すると**手順4**でエラーが出ます。エラーについては後述。
:::

作成したopenai.zipをAWS CloudShellからダウンロードします。
AWS CloudShell右上の「アクション」＞「ファイルのダウンロード」からダウンロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/27dfb648-09f7-104a-a369-f66a419cf319.png)

Lambdaの左メニューから「レイヤー」をクリックし、「レイヤーの作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/0a2bafdf-8c03-8937-ff61-d8b4ab2ed9b7.png)

ダウンロードしたopenai.zipでAWS Lambdaレイヤーを作成します。
今回は「x86_64」、「Python 3.12」でAWS Lambdaを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/b89b4261-7100-9e5e-882f-8b23cb5bf126.png)

##### 3-2. レイヤーを追加する。

**手順2**で作成したLambdaのコードタブ一番下にあるレイヤーからレイヤーを追加します。
「レイヤーの追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/635def48-6e5e-30a0-b9e8-9f46c3776147.png)

「カスタムレイヤー」を選択し、**手順3-1**で作成したレイヤーを選択します。
「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/7e4c7698-3d02-5b4a-6715-5bde992228a5.png)

#### 4. AWS LambdaでAzure OpenAIを呼び出すようにする。

AWS LambdaでPythonコードを書いていきます。

:::note warn
Pythonコードの書き方

OpenAIのバージョンによって異なります。以下を参照ください。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/migration?tabs=python-new%2Cdalle-fix#name-changes
:::

Lambdaをテストした時に、問題なく動作すれば :ok: です！

自分はエラーが出ました...
- - -
##### :x: [ERROR] APIRemovedInV1: You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0

```text:エラーメッセージ
[ERROR] APIRemovedInV1: You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742
```

openaiのバージョンを1.0.0以上にする必要がありそうです。
**手順3-1**においてインストールしたopenaiのバージョンを確認しましょう。
もしopenaiのバージョンが0.x系の場合は、以下のコマンドを実行して再度レイヤーを作成してください。
`--upgrade` を追加しています。

```shell:CloudShell
pip install --upgrade -t ./python openai
```
- - -
##### :x: [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core’

```text:エラーメッセージ
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core’
```

インストールしたopenaiのモジュールに「'pydantic_core._pydantic_core’」が無いようです。
既知の情報のようですので、以下のコマンドを実行して再度レイヤーを作成してください。
`fastapi==0.99.0` を追加しています。

```shell:CloudShell
pip install -t ./python openai fastapi==0.99.0
```
- - -
##### :x: [ERROR] NotFoundError: Error code: 404 - {'error': {'code': 'DeploymentNotFound', 'message': 'The API deployment for this resource does not exist.

```text:エラーメッセージ
[ERROR] NotFoundError: Error code: 404 - {'error': {'code': 'DeploymentNotFound', 'message': 'The API deployment for this resource does not exist. If you created the deployment within the last 5 minutes, please wait a moment and try again.’}}
```

デプロイしているAzure OpenAIが見つからないようです。
Lambdaの中で「model」を指定している箇所があります。
そこに「gpt-35-turbo」などモデルを指定するのではなく、**デプロイ名を指定します**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/58e16344-f7e4-1404-ffce-b0d776f71516.png)

デプロイ名はAzureのAzure OpenAI Studioの「デプロイ」画面で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288944/344d011f-7590-af7f-415a-be8511c4b7ca.png)

- - -
エラー対応したAWS Lambdaのコードを載せておきます。

<!-- open属性なし -->
<details><summary>Lambdaコード</summary>

```python:lambda_function.py
import os
from openai import AzureOpenAI

def lambda_handler(event, context):
    client = AzureOpenAI(
        azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
        api_key = os.getenv("AZURE_OPENAI_API_KEY"),
        api_version = "2024-02-01",
    )
    completion = client.chat.completions.create(
        model = '[Azure OpenAIのデプロイ名]',
        messages=[
            {"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
            {"role": "user", "content": "Who were the founders of Microsoft?"}
        ]
    )
    print(completion.model_dump_json(indent=2))
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```
</details>

### さいごに

* お試しのため、Azure OpenAIやLambdaにアクセス制限をかけておりません。
* AWS Bedrockでいろんなモデルが試せるけど、これでOpenAIのモデルも試せますね。
* 少しでもみなさんの参考になりますように！