はじめに
Azure OpenAIをAWS Lambdaから呼び出したい!
マルチクラウドっぽく、AzureのサービスをAWSから呼び出したかった。
さらに、Azure OpenAIもAWSから呼び出せたらいいですよね。
しかしながら、呼び出しまでにいろいろつまずいたのでエラーメッセージとともに対応方法を共有します。
構成
構成はこんな感じです。
やること
1. Azure OpenAIを作成、モデルをデプロイする。
2. AWS Lambdaを作成する。
3. AWS Lambdaレイヤーを作成、レイヤーの追加をする。
3-1. AWS Lambdaレイヤーを作成する。
3-2. レイヤーを追加する。
4. AWS LambdaでAzure OpenAIを呼び出すようにする。←この記事のメイン
では、やってみましょう!
1. Azure OpenAIを作成、モデルをデプロイする。
手順は以下を参照ください。
2. AWS Lambdaを作成する。
手順は以下を参照ください。
3. AWS Lambdaレイヤーを作成、レイヤーの追加をする。
3-1. AWS Lambdaレイヤーを作成する。
AWS LambdaでOpenAIのモジュールをimportしたいため、レイヤーを作成します。
まず、AWS Lambdaレイヤーを作成します。
手っ取り早く作成するため、AWS CloudShellを使います。
AWS CloudShellを開いて以下のコマンドを実行します。
mkdir python
pip install -t ./python openai fastapi==0.99.0
zip -r openai.zip ./python
作成したopenai.zipをAWS CloudShellからダウンロードします。
AWS CloudShell右上の「アクション」>「ファイルのダウンロード」からダウンロードできます。
Lambdaの左メニューから「レイヤー」をクリックし、「レイヤーの作成」ボタンをクリックします。
ダウンロードしたopenai.zipでAWS Lambdaレイヤーを作成します。
今回は「x86_64」、「Python 3.12」でAWS Lambdaを作成します。
3-2. レイヤーを追加する。
手順2で作成したLambdaのコードタブ一番下にあるレイヤーからレイヤーを追加します。
「レイヤーの追加」ボタンをクリックします。
「カスタムレイヤー」を選択し、手順3-1で作成したレイヤーを選択します。
「追加」ボタンをクリックします。
4. AWS LambdaでAzure OpenAIを呼び出すようにする。
AWS LambdaでPythonコードを書いていきます。
Pythonコードの書き方
OpenAIのバージョンによって異なります。以下を参照ください。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/migration?tabs=python-new%2Cdalle-fix#name-changes
Lambdaをテストした時に、問題なく動作すれば です!
自分はエラーが出ました...
[ERROR] APIRemovedInV1: You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0
[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
を追加しています。
pip install --upgrade -t ./python openai
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core’
[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
を追加しています。
pip install -t ./python openai fastapi==0.99.0
[ERROR] NotFoundError: Error code: 404 - {'error': {'code': 'DeploymentNotFound', 'message': 'The API deployment for this resource does not exist.
[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」などモデルを指定するのではなく、デプロイ名を指定します。
デプロイ名はAzureのAzure OpenAI Studioの「デプロイ」画面で確認できます。
エラー対応したAWS Lambdaのコードを載せておきます。
Lambdaコード
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!')
}
さいごに
- お試しのため、Azure OpenAIやLambdaにアクセス制限をかけておりません。
- AWS Bedrockでいろんなモデルが試せるけど、これでOpenAIのモデルも試せますね。
- 少しでもみなさんの参考になりますように!