AWSのドキュメントに従ってAWS Lambda用のPythonスクリプト(Poetryの仮想環境内)をパッケージ化してデプロイしたい。
背景
serverless frameworkを使ってPython Lambda関数をデプロイする方法については、すでに多くの記事が存在するが、Poetryと組み合わせてServerlessを使用するための方法についてはあまり記事がないので、この記事を書いた。
前提条件
- Poetryをインストール
- Node.jsをインストール
- awscliをインストールし、プロファイルで設定
- グローバルにserverless frameworkをインストール
フォルダ構造
lambda-test/ handler.py pyproject.toml
serverless.ymlの追加
Serverless frameworkを使用するには、この設定ファイルが必要。 serverless.ymlはサービスごとに設定され、このファイルに関数とそのトリガーとなるイベントが定義される YAML ファイル。 このファイルはプロジェクトフォルダのルートに保存されている必要がある。Serverless deploy を実行して Framework でデプロイすると、 serverless.yml (または --config オプションで指定したファイル) のすべてが一度にデプロイされる。
# serverless.yml service: lambda-test provider: name: aws runtime: python3.6 functions: test: handler: handler.main plugins: - serverless-python-requirements custom: pythonRequirements: dockerizePip: non-linux
serverless-python-requirementsについては以下も参考に。
npm を起動して python-requirements プラグインをインストール
Serverlessはnode製パッケージであり、現在のセットアップにserverless-python-requirementsプラグインをインストールする。
プロジェクトフォルダのルートにあるnpm init
とnpm install -save serverless-python-requirements
を実行する。そうすると、以下のようなフォルダ構造になる。
lambda-test/ node_modules/ .... handler.py package.json package-lock.json pyproject.toml
依存関係をrequirements.txtとしてエクスポート
プロジェクトの依存関係をrequirements.txtとしてエクスポートする。そうしないとServerless: Generating requirements.txt from pyproject.toml
とログがでるが、なぜかうまくいかないので、デプロイ前にrequirements.txtをエクスポートする。
poetry export -f requirements.txt > requirements.txt --without-hashes
lambdaのデプロイ
ここまででLambda関数をデプロイする準備ができた。デプロイする前に、正しいPython環境(プロジェクトのもの)が有効になっていることを確認しよう(poetry shell
)。また、poetry run python handler.pyを実行して機能をテストすることもできる。それが正常に動作していれば、以下のコマンドでLambdaをデプロイする。
serverless deploy
ラムダを呼び出す
そして、次のコマンドを使用してデプロイされたLambda関数を呼び出すことができる。
serverless invoke -f test --log