今まで、Javaのみに提供されていたLambda SnapStartがPythonと.Netに対応しました🎉🎉🎉
さすがクラスメソッドさん、もうブログが出ていますので、「SnapStartって何?」みたいな方はこちらを参照いただければと思います。
以前、Lambda上でLangServeを動作させる方法(こちら)を投稿したのですが、1年ぐらいたつので、改めてやってみました。
LangServeは、LangChainのチェーンをいい感じにWeb APIにするやつです
手順
LangServeのLambdaレイヤーを作成する
CloudShellで作業します。
pythonのSnapStartは、Pythonの3.12以降が対応とのことで、今回は最新のPython3.13を使用します。
CloudShellにインストールされているPythonは3.9なので、Dockerを使いつつ、無理やりPython3.13のレイヤーを作成します。
mkdir python
docker run \
-v $PWD/python:/python \
--user $(id -u):$(id -g) \
python:3.13-bullseye pip install -t python langserve[server]==0.3.0 langchain-aws==0.2.7
rm -r python/boto*
zip -r9 langserve-layer.zip python
aws lambda publish-layer-version \
--layer-name langserve-layer-p313 \
--compatible-runtimes python3.13 \
--compatible-architectures x86_64 \
--zip-file fileb://langserve-layer.zip --no-cli-pager
python:3.13
だとLambda環境で実行時エラーになるのでpython:3.13-bullseye
を指定しています。
Lambda関数を作成する
マネジメントコンソールで頑張ります。
ランタイムは「Python 3.13」を選択して、「関数の作成」をクリックします。
ラインタイム設定
ハンドラを「run.sh」に変更します。(run.shは後ほど作成します)
レイヤーを指定する
先ほど作成したLangServeのレイヤーに加え、「AWS Lambda Web Adapter」を追加します。
AWS Lambda Web Adapterは、FastAPIなどのWebアプリをLambda上で動作させるAWS製のライブラリーです。LangServeも内部的にFastAPIを使用しています。
-
LangServeレイヤー(langserve-p313)
バージョンはそれぞれの環境で変わってくると思います。
-
Lambda Web Adapter
ARNを直接指定します。(リージョンはLambdaのリージョンに合わせます)
arn:aws:lambda:us-east-1:753240598075:layer:LambdaAdapterLayerX86:23
ソースコードを記述する
ソースコードを記述します。
lambda_function.py
は不要なので削除します
-
main.py
main.py#!/usr/bin/env python from fastapi import FastAPI from langchain_aws.chat_models import ChatBedrockConverse from langchain_core.output_parsers import StrOutputParser from langserve import add_routes app = FastAPI( title="LangServe", version="1.0", description="LangChain Server", ) chain = ChatBedrockConverse(model="us.anthropic.claude-3-5-haiku-20241022-v1:0") | StrOutputParser() add_routes( app, chain, path="/bedrock", ) if __name__ == "__main__": import uvicorn uvicorn.run(app)
-
run.sh
run.sh#!/bin/bash PATH=$PATH:$LAMBDA_TASK_ROOT/bin \ PYTHONPATH=$PYTHONPATH:/opt/python:$LAMBDA_RUNTIME_DIR \ exec python -m uvicorn --port=$PORT main:app
ソースは自動保存されます。
ソースが完成したら、必ず「Deploy」ボタンを押してください。
諸々設定する
設定を色々します。
-
一般設定
- メモリを256MBにします(お好みで)
- SnapStartを「PublishedVersions」にします
- タイムアウトを30秒にします(お好みで)
また、画面下部の「既存のロール」のリンクからIAMロールの画面に遷移し、「BedrockFullAccess」を追加します。
-
環境変数
Lambda Web Adapterの動作に必要なので以下の環境変数をセットします。
- AWS_LAMBDA_EXEC_WRAPPER : /opt/bootstrap
- AWS_LWA_INVOKE_MODE : response_stream
- PORT : 8000
バージョンとエイリアス、関数URLを作成する
SnapStartを使用するには「バージョン」を作成する必要があります。
関数URLを使用するには「エイリアス」を作成する必要があります。
ということで、「バージョン」を作ったうえで「エイリアス」を作ります。
まずはバージョンを作成します。
そしてエイリアスを作成します。
最後に関数URLを作成します。
認証タイプを「NONE」にし、その他の設定の中にある「呼び出しモード」を「RESPONSE_STREAM」に設定します。
これで、SnapStartを有効化した関数URLが発行されます。
ブラウザでアクセスしてみる
関数URLのURLの末尾に/docs
をつけてブラウザでアクセスします。
OpenAPIのドキュメントが表示されます。
今回は「/bedrock」としてAPIを作成したので、「/bedrock/playground」にアクセスすると、プレイグラウンドが表示されます。
もちろん、呼び出しも可能です。
普通にWeb画面が表示されてますが、これ、Lambdaのレスポンスですよ。すごくないですか??
SnapStartの検証はできてませんすいませんw