【朗報】Serverless Framework v1.6.0でPythonのローカル実行がサポートされます

slack-slash-cm-and-serverless-005

2017年1月31日追記
当初v1.5.2で対応すると書いていましたが、1.5.1の次期リリースは1.5.2ではなく1.6.0のようでした。失礼いたしました。

はじめに

こんにちは、中山です。

個人的に待ち望んでいた機能がリリースされそうなのでエントリにまとめたいと思います。Serverless Frameworkの次期リリースバージョンであるv1.6.0でPythonのローカル実行がマージされました。以前までは、Node.jsのみこの機能がサポートされていましたが、新しくPythonも加わったということです。ローカル実行の機能は完全にLambda関数を再現できるわけではないですが、簡単なテストとしてなら便利に使える機能です。執筆時点(2017/01/21)ではまだリリースされていませんが、早速使ってみたのでこの機能についてご紹介します。

使ってみた

上述したようにまだv1.6.0はリリースされていません。リポジトリからcloneして自分でインストールする必要があります。以下のコマンドでインストール可能です。

# リポジトリのclone
$ git clone git@github.com:serverless/serverless.git
Cloning into 'serverless'...
remote: Counting objects: 44709, done.
remote: Compressing objects: 100% (106/106), done.
remote: Total 44709 (delta 35), reused 1 (delta 1), pack-reused 44602
Receiving objects: 100% (44709/44709), 71.42 MiB | 2.79 MiB/s, done.
Resolving deltas: 100% (27872/27872), done.
$ cd serverless
$ git log ec8a55a66e0be27f8e1ebb1aa48789f7b0479a12 -1
commit ec8a55a66e0be27f8e1ebb1aa48789f7b0479a12
Merge: fe3ddb7 a163e65
Author: Eslam λ Hefnawy <eahefnawy@gmail.com>
Date:   Thu Jan 19 19:40:38 2017 +0700

    Merge pull request #2937 from UnitedIncome/feature/invoke-python

    Invoke local python functions! closes #2862
# インストール
$ npm install
<snip>
# 確認(コミットハッシュ値は表示してくれない模様)
$ ./bin/serverless version
1.5.1

正式にリリースされたら以下のコマンドでインストール可能です。

$ npm install -g serverless

環境が整ったら早速使ってみましょう。今回はテンプレートから各種ファイルを用意しておきます。

$ path/to/serverless/bin/serverless create -t aws-python -n test
Serverless: Generating boilerplate...
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.5.1
 -------'

Serverless: Successfully generated boilerplate for template: "aws-python"

ローカルで実行してみます。

$ path/to/serverless/bin/serverless invoke local -f hello
{
    "body": "{\"input\": {}, \"message\": \"Go Serverless v1.0! Your function executed successfully!\"}",
    "statusCode": 200
}

実行できました!ちなみにグローバルにインストールしたServerless Framework(v1.5.1)で実行すると以下のようにエラーが表示されます。

$ sls invoke local -f hello

  Serverless Error ---------------------------------------

     You can only invoke Node.js functions locally.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues

  Your Environment Information -----------------------------
     OS:                 darwin
     Node Version:       7.1.0
     Serverless Version: 1.5.1

今度はeventにデータを渡してみます。

$ path/to/serverless/bin/serverless invoke local -f hello -d "$(jo hoge=fuga)"
{
    "body": "{\"input\": {\"hoge\": \"fuga\"}, \"message\": \"Go Serverless v1.0! Your function executed successfully!\"}",
    "statusCode": 200
}

eventに渡されたデータも本物のLambda関数と同じように表示されます。やりましたね。

まとめ

いかがだったでしょうか。

Serverless Frameworkの時期リリースで導入予定のPythonのローカル実行についてご紹介しました。Serverless FrameworkはNode.js製ということもあり、どうしてもPythonへのサポートは「二級市民」的な部分がありました。ただし、今回ご紹介した機能が取り込まれたように、有志の方がさまざまな便利機能を導入してくれています。今後もこのあたりの動向に注目していきたいと思います。

本エントリがみなさんの参考になれば幸いに思います。