例えば Python のプログラムを動かそうとしたら、パソコンやサーバーの上で準備作業を行って、Python が動く環境を作る必要があります。それに対し、AWS が提供するサービスである AWS Lambda は、環境を用意すること無しにプログラムを実行する仕組みを提供してくれます。
AWS Lambda サービスにアクセスする
AWS コンソール画面で “Lambda” を検索すると出てきますのでダッシュボードに移動します。
作成した Lambda はリージョンごとに保存されます。デフォルトは「米国東部(バージニア北部)」になっていますので必要なら変更してください。
関数の作成
「関数の作成」ボタンで Lambda 関数を作成します。
- 「一から作成」を選択(これがデフォルトです)
- 関数名は適当な名前を設定します。例えば “test” でも構いません。
- ランタイムは作ろうとするプログラムの言語を指定します。今回は「Python 3.12」を指定します。同じ Python でも別のバージョンを使いたい場合は「その他のサポート対象」に選択肢があります。
- アーキテクチャは使用しているパソコンに合わせておくのが無難です。WIndows なら「x86_64」、Apple Silicon Mac なら「arm64」です。
- 画面の下にある「関数の作成」ボタンを押して少し待ってください。
関数の実行
関数の画面では中央にいくつかタブが表示されています。「コード」を選択するとプログラムの入力ができます。あらかじめサンプルが記入されています。Python の場合、ファイル名は lambda_function.py、関数名は lambda_handler となっていることを認識してください。実行時には Lambda のシステムからこの関数が呼び出されます。
サンプルのプログラムを実行してみましょう。「テスト」タブに移動してオレンジ色の「テスト」ボタンを押すと実行されます。「詳細」を押すと結果ログの一部が表示されます。(ここで「ログ」をクリックすると詳細なログが表示されます)
サンプルプログラムの中の “Hello from Lambda!” という文字列がログに表示されているのを確認してください。
関数 lambda_handler の内容を編集すれば望みの機能を実現できます。「コード」タブに戻って、例えば “Hello from Lambda!” のところを “Konnitiha!!” と変更してみてください。コードを編集したときは「Deploy」ボタンを押せばシステムに反映されます。「テスト」タブから実行すると結果が変わっていることが確認できるはずです。
レイヤーについて
Python の標準ライブラリに含まれないライブラリ(pip コマンドでインストールするようなライブラリ)を Lambda で使用するには、レイヤーを作成して Lambda 関数に追加することで可能になります。
まずパソコン上で必要な Python の環境を作ります。使用するPython のバージョンは Lambda 関数の設定に合わせてください。その階層構造は次のようになっている必要があります。
“python3.12″ というディレクトリ名は使用する Python のバージョンに依存します。”site-packages” の下にライブラリの実体が配置されるようにします。
pip コマンドの実行時に “pip install <ライブラリ名> -t <インストール先>” というコマンドオプションを使ってライブラリのインストール先を指定することができます。この方法で上記のような階層構造を作れば良いのですが、もし virtualenv で Python 環境を作っていれば、環境名のディレクトリ下、”lib” 以下がちょうど上記のような構造になっているので楽に作ることができます。
ライブラリを含むディレクトリができたら、zip ファイルに圧縮して Lambda のレイヤーにアップロードします。
レイヤーの使用例
ChatGPT の API を使うために Python の openai ライブラリを使う場合を例に見ていきます。単純にソースコードに “import openai” の1行を追加して実行するとエラーが発生します。
1 |
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'openai' |
このエラーを解決していきます。
前提として、virtualenv で仮想環境を作っていることとします。virtualenv の使い方については、Windows または Apple Silicon Mac を参照してください。
1 |
$ virtualenv -p py3.12.0 env |
ここでは名前は “env” に、Python のバージョンは Lambda 関数の設定に合わせて 3.12.0 にしてあります。次に環境を有効にして、必要なライブラリをインストールします。
1 2 |
$ source env/bin/activate (env) $ pip install fastapi==0.99.0 openai |
必要なのは openai ですが、fastapi も一緒にインストールしていますが、その理由は ここ の解説のとおりです。通常は必要なライブラリだけインストールしてください。
この時点で env/lib 以下に必要な構造が出来上がっているのでそのまま利用します。python というディレクトリを作って、そこに lib 以下をコピーして zip ファイルにします。
1 2 3 |
$ mkdir python $ cp -r env/lib python/lib $ zip -r openai-py312 python |
zip ファイル名は openai-py312.zip としましたが、何でも構いません。
Lambda ダッシュボードのメニューから「レイヤー」を選択、「レイヤーの作成」ボタンを押します。
名前は後で見てわかり易い名前にしてください。アーキテクチャは Lambda 関数の設定に合わせてください。パソコンで作った zip ファイルにアーキテクチャに依存するものが含まれていたらエラー原因になります。
ランタイムは、このレイヤーを動作させる可能性があるものを選択してください。Python で複数のバージョンで動作可能なレイヤーなら複数選択しても構いません。(ただし、バージョンの競合が発生する可能性があるのでお勧めはしません。)
「.zip ファイルをアップロード」を選択して、先程作ったzipファイルをアップロードして、「作成」ボタンでレイヤーが作成されます。
Lambda 関数の画面に戻り、画面上部の「関数の概要」の図の中に「Layers (0)」となっています。
これからここにレイヤーを追加します。「コード」タブ画面の一番下の「レイヤー」の項目の「レイヤーの追加」を押してください。
ここまでの手順で作ったレイヤーは「カスタムレイヤー」に含まれますので選択します。その下の選択肢からレイヤーを指定します。さらにバージョンを指定します。「追加」を押すと Lambda 関数とレイヤーが関係付けられます。
「テスト」タブから関数を実行してください。”ImportModuleError” が発生しなければ成功です。
URL を設定する
どのようなタイミングで Lambda 関数を実行するか、すなわち実行のタイミングの設定方法は色々あります。試しに、URLにアクセスしたときに実行されるように設定してみます。
Lambda関数の画面で「設定」タブを開き、「関数URL」を選択します。「関数URLを作成」ボタンを押します。認証タイプを「NONE」にすると誰でもアクセスできるようになります。
作成したURLにアクセスすると応答があるはずです。