LoginSignup
4
0

More than 3 years have passed since last update.

Serverless FrameworkでPython版Lambda関数(+ Lambda Layer)を作成

Last updated at Posted at 2020-03-08

Python言語で書いたLambda関数をServerless Frameworkを用いて作成・デプロイした際の設定の記録です。

環境

  • macOS Catalina
  • serverless framework 1.65.0
  • python 3.7.4
  • node v12.15.0

プロジェクトのセットアップ

事前にServerless Frameworkのアカウントを作成しておく必要があります。
https://serverless.com/

serverlessコマンドのインストール

$ npm install -g serverless

Serverlessプロジェクトの作成

$ serverless

プロジェクト名の入力やアカウントへのログイン等を行います。
開発言語の選択肢では「AWS Python」を選びましょう。

入力が完了すると新しくServelessプロジェクト用のディレクトリが作成されます。

初期デプロイ

作成されたディレクトリに移動します。
初期状態ではserverless.ymlhandler.pyというファイルが作成されています。

それぞれ下記のように少し変更を加えます。

serverless.yml
# serviceとappは各自の環境に合わせて設定してください。
service: python-test
app: python-test

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1

functions:
  hello:
    handler: handler.hello
handler.py
def hello(event, context):
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }

eventの中身をオブジェクトにそのまま格納しreturnするだけの単純な関数です。

下記コマンドでデプロイ(Lambda関数の作成)を行います

$ serverless deploy

AWSコンソールからLambdaの画面を見ると関数が新しく作成されていることが確認できると思います。

関数の動作確認

次のコマンドで作成した関数を実行することができます。

$ serverless invoke yarn serverless invoke --function hello
{
    "message": "Go Serverless v1.0! Your function executed successfully!",
    "event": {}
}

実行時にイベントを渡すこともできます。
まず下記の内容でevent.jsonファイルを作成します。

event.json
{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

そして関数実行時にpオプションでイベントを記述したファイルを指定します。

$ serverless invoke --function hello -p event.json
{
    "message": "Go Serverless v1.0! Your function executed successfully!",
    "event": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    }
}

Pipenvを用いて外部ライブラリを導入する

Pythonの外部ライブラリを使用する場合の設定です。
今回はパッケージマネージャとしてPipenvを利用します。

Pipenvのセットアップ

Pipenvをインストールしていない場合はpipを使ってインストールします。


$ pip3 install pipenv

プロジェクトにおけるPipenvの設定初期化を行います。
今回はPython3系を使うため以下のようにバージョンを指定します。

$ pipenv --python 3

コマンド実行後ディレクトリ内にPipfileが作成されています。

Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = "3.7"

Pythonの外部ライブラリをインストール

今回は日付処理を便利に行うことが可能となるpython-dateutilというライブラリを使いたいと思います。

まずはPipenvでライブラリをインストールします。

$ pipenv install python-dateutil

次にpython-dateutilを使うようにプログラムを変更します。

handler.py
import datetime
from dateutil.relativedelta import relativedelta

def hello(event, context):
    today = datetime.date.today()
    yesterday = today + relativedelta(days=-1)

    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event,
        "dates": {
            "today": f'{today: %Y-%m-%d}',
            "yesterday": f'{yesterday: %Y-%m-%d}'
        }
    }

標準ライブラリのdatetimeと併用して、プログラム実行時の日付と1日前の日付を取得し、returnするオブジェクト内に追加しています。

serverless-python-requirementsの導入

PipenvでインストールしたライブラリをServerless Frameworkで扱うためには、serverless-python-requirementsというnpmパッケージを利用します。

serverless-python-requirementsは元々はrequirements.txtで管理するライブラリを扱えるようにするものですが、Pipenvにも対応しています。

まず、npmを使ってserverless-python-requirementをインストールします。

# npmプロジェクトの初期化を行っていない場合
$ npm init

# serverless-python-requirementsのインストール
$ npm install --save-dev serverless-python-requirements

次にserverless-python-requirementを利用するための設定をserverless.ymlに記述します。
pluginとcustomの部分を追記します。

serverless.yml
service: python-test
app: python-test

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: true

functions:
  hello:
    handler: handler.hello

デプロイ、動作確認

serverless deployコマンドでデプロイします。
その後、更新された関数を実行してみましょう。

$ serverless invoke --function hello -p event.json
{
    "message": "Go Serverless v1.0! Your function executed successfully!",
    "event": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    },
    "dates": {
        "today": " 2020-03-07",
        "yesterday": " 2020-03-06"
    }
}

Lambda Layerを利用する

Lambda Layerを利用すると、Lambda関数のパッケージに利用ライブラリのファイルを含む必要がなくなり、パッケージ容量を少なくすることができます。

serverless-python-requirementを利用している場合、設定を少し加えるだけで依存ライブラリを簡単にLayer化することが可能です。
具体的にはserverless.ymlに次のように設定を追加します。

serverless.yml
custom:
  pythonRequirements:
    dockerizePip: true
+   layer: true

設定変更後、serverless deployコマンドでデプロイします。

AWSコンソールのLambdaの画面から、新しくLayersが作成されていることを確認してみてください。

まとめ

Serverless Frameworkを用いてPython言語でLambda関数を作成する方法を説明しました。
serverless-python-requirementを利用すれば、Pipenvとの統合やLambda Layerの作成など外部ライブラリ周りの導入を簡単に行うことができます。

参考資料

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0