Poetryを使ってLambda関数をデプロイしたい

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については以下も参考に。

datablogger.hatenablog.com

npm を起動して python-requirements プラグインをインストール

Serverlessはnode製パッケージであり、現在のセットアップにserverless-python-requirementsプラグインをインストールする。 プロジェクトフォルダのルートにあるnpm initnpm 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