技術

PythonでAWSのlambdaの開発をするときに考えること

AWSLambda は、何かと使用機会の多いサービスです。

実行環境のサーバーを用意しなくていいので、インフラ周りのちょっとしたジョブとか、マイクロサービスのちょっとした機能とかに使いやすいんですね!

しかしサーバーレスということもあって、開発にはちょっとした癖があります。そこで Python ではじめて Lambda の開発をするときに躓きそうなことについてまとめてみました。

ローカルでの実行テスト

Lambda 特有の開発事情として、開発中の動作確認はどうするのかという問題があります。

一般的な開発では、ローカルで動作確認をしたらそのままのコードを開発環境にデプロイしてそこで動作確認してみるという手順になります。

一方 Lambda はサーバーレスのため開発環境というものが存在しません。ローカルで動作確認したら、次は本番、つまり Lambda にコードをUPして動作確認するということになります。

しかしここで問題になるのは、Lambda のコード実行方法は Handler 関数が起点となるため、ローカルで動くコードそのままでは、Lambda 上では動きません。逆に言うと、Lambda の形式に合わせてコードを書くと、ローカルでは動作しません。

Lambda の開発をするにあたり、まずこの問題どうするのか考えねばなりません。

私が知る限り、Python の場合は、以下の3つの対応策があります。

  • python-lambda-local を使う
  • AWS SAM を使う
  • コードで解決する

python-lambda-local を使う

これは一番、メジャーな方法です。

Python には、python-lambda-local という Lambda のコードをローカルで動かすツールがあります。このツールを pip でインストールして、実行パラメータであるJSONファイルを用意したら、以下の様なコマンドでローカルで実行することができます。

しかし、この python-lambda-local は2019年7月現在はバージョンが0.1.8ということもあり、動作が安定しません。特に Windows では、エラーになることが多いようです。

ちょっと使ってみて動くならそのまま使っていいですが、もしエラーを吐くようならそのエラー解決には時間をさかずに、早めに諦めて別の方法をとったほうがいいと思います。

私も Windows では、下記のリンクにある問題が発生しました。バージョン0.1.7に戻せば解決するらしいのですが、使用を諦めました。
https://github.com/HDE/python-lambda-local/issues/45

AWS SAM を使う

私は使ったことがないのですが、AWS SAM という、サーバーレスアプリケーションを構築するためのAWS公式のフレームワークがあります。

Dockerで環境を用意して、プロジェクトをこのフレームワーク上で作成するという、けっこうゴツゴツしたことをやる必要があるのですが、開発の規模が大きい場合は使ってみるのもいいと思います。

コードで解決する


コードをごにょごにょするというイケてない方法です。私がよく使うのは、この方法です。

規模の小さいものなら、ローカルでこの方法で動作確認したら、zipで固めて Lambda にUPするというフローで事足ります。

lambda のコードは以下の様になります。

このコードは Lambda では動作しますが、ローカルでは動きません。そこで以下の様にします。

これでローカルでも動かせるようになります。

Lambda で環境変数を設定している場合は、環境変数定義用のファイルを作成してimportします。

少しダサいですが、以上のような方法でローカルで動作確認できます。ただし、loggingを使っている場合は後述する対応が必要になります。

loggingの扱い


以下の公式の説明にあるように、Lambda ではloggingが簡単にできます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-logging.html

と記載するだけで、

の様なコードで、CloudWatchにログを吐き出すことができます。

ローカルで動かす場合は、コンソール出力の設定が必要

しかし、ローカルの動作確認をコード編集でやる場合、logging周りの修正も必要になります。

loggingは、上記のコードではLambda上で実行された場合はCloudWatchの出力には対応していますが、ローカルで動かした場合はログは何もでません。loggingにコンソール出力の設定をする必要があります。

そこで、コードを以下の様に編集します。

これで、ローカルで動かしても、Lambda上で動かしても、ログは出力されるようになります。

PycharmのPythonのパス


これは Lambda とは関係ないことなのですが、Pycharm で開発しているときに Pythonパスの関係で、モジュールのimportエラーにはまったことがあるので紹介します。

Lambdaは、プロジェクトのおまけ的な機能としてプロジェクトの一部に組み込まれることが多いです。そのため、以下の様なフォルダ構造になるケースがあります。

この ProjectName を Pycharm で開いている時、codeq1.py に以下の記述をすると、ModuleNotFoundError になります。

しかし、Lambda 上では問題無く動作しますし、また Pycharm でなくターミナルから実行してもエラーをはくことなく問題無く動作します。

Pycharm でも、以下の様にコードを修正すればエラーはなくなります。

これは、Pythonのパスが意図したものと違うことになります。Pycharm と Lambda で ソースの起点がずれているのが原因です。

Pycharm の Projectツリー画面で

LambdaDirecotry を右クリック -> Mark Directory as -> Sources Root

とクリックすれば、解決します。

昔このことがわからなくて何時間もはまったことがあります^^;

まとめ

以上、PythonでLambdaの開発をするときにつまづきそうな、というか私が実際にはまったことがあることについての紹介でした。

参考になれば幸いです。

ABOUT ME
tara
tara
年収360万円でIT業界のキャリアスタート
SES -> Web業界 -> 大手メーカー -> フリーランス
と経験してきて、現在は年収1000万円を越えました。

エンジニアのキャリアアップに役立つ情報を発信していきます。