素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

IT

【サーバーレスアークテクチャ開発】ローカル環境でAWSのLambdaスクリプトをPythonで実装する際に「python-lambda-local」で動作確認する際のインストール方法とやり方【Bot開発にオススメ】

投稿日:

スポンサーリンク

336×280




ローカルでのLambdaスクリプト開発の課題

サーバーレスアーキテクチャの代名詞

皆さんはAWSのLambdaを使っているでしょうか?

Lambdaはサーバーレスアーキテクチャを実現する上で、欠かせない存在となっており、サーバーレスの流行りのおかげでとてもメジャーなAWSサービスの一つとなっています。

AWS Lambda を使用することで、サーバーのプロビジョニングや管理をすることなく、コードを実行できます。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。

Lambda を使用すれば、実質どのようなタイプのアプリケーションやバックエンドサービスでも管理を必要とせずに実行できます。コードさえアップロードすれば、高可用性を実現しながらコードを実行およびスケーリングするために必要なことは、すべて Lambda により行われます。コードは、他の AWS のサービスから自動的にトリガーされるよう設定することも、ウェブやモバイルアプリケーションから直接呼び出すよう設定することもできます。
AWS Lambda (サーバーレスでコードを実行・自動管理) | AWS

また、Lambdaは言語を問わずJava、Node.js、Pythonなど様々な言語を用いて実装出来るのも魅力の一つです。
最近はPythonでLambdaを実装するのが多いですね。

ローカル開発がちょっと大変

この便利なLambdaですが、ローカルで動作確認をしたい場合にちょっと厄介です。

外部のライブラリを使用している場合はZipに固める必要があったり、関数のトリガーもLambdaに依存しているため、ローカルで同じように動かすにはローカル様にちょっとソースを変える必要があったりと差分が発生してしまいます。

python-lambda-localが便利過ぎる

そんな中、PythonでLambdaをローカル環境で実装・動作確認をする際にとてもpython-lambda-local と言う便利なツールを見つけました。

こちらを使えば、ローカルでのLambdaスクリプトを簡単に実装・動作確認することが出来ます。

また、インストールもpipコマンドでワンタッチで出来たのでインストールから使い方までご紹介致します。

手順

pipでpython-lambda-localをインストール

今回はpipコマンドでpython-lambda-localをインストールします。
pip install python-lambda-localを実行すると以下のようにインストールが完了すると思います。

確認

では、python-lambda-local --versionコマンドで動作確認をしてみましょう。
以下のようにバージョンが表示されればインストール成功です。

外部依存無しの場合

では、実際にスクリプトを書いてみましょう。

まずはお決まりのHello World!!!を出力してみます。
こちらはライブラリなどには何も依存していないスクリプトとなります。

次に、event.jsonを用意します。

こちらは実行する際のリクエスト情報を定義します。

今回は特にリクエスト内容は不要ですが、必須で指定する必要があるようなので以下のような空のJsonのファイルを用意しておきます

ValueError: No JSON object could be decoded

ファイルは用意したが、中身が空の場合は以下のようなエラーが出てしまいます。

LambdaはJson形式で待ち構えているので、ファイルが空の場合にJsonオブジェクトをデコード出来ずにエラーになってしまうので気をつけましょう。

確認

では、実行してみましょう。

実行コマンドはpython-lambda-local --function {関数名} --timeout {タイムアウト秒} {スクリプトファイル名} {イベントファイル名}のように組み立てます。

今回だと以下のようになります。

実行すると以下のように出力されます。

正常にHello World!!!が出力されましたね♪

リクエスト依存の場合

では、POSTで送られてくるデータを操作するケースを想定してみます。
データはevent.jsonに定義する事でスクリプト内で取得出来るようになります。

event.jsonを以下のように変えてみます。

そして、lambda_function.pyは以下のように修正します。

確認

では、先ほどと同じコマンドで実行してみましょう。

正常にJsonの情報を読み取れていますね♪

実際にPOSTでリクエストを投げられる場合も、Json形式で来るはずなのでローカルで正常に動いていれば、実際のAWSのLambda上でもJson構造が正しければ問題無く動くはずです。

外部ライブラリに依存する場合

次に外部ライブラリに依存するケースを試してみましょう。

Lambdaでは依存するライブラリはZip内に含めないといけない、と言う制約があります。
ローカルで動作確認するだけなら特に意識せずに通常通りに記述すれば良いです。
※実際にAWSのLambdaに載せる際はライブラリ毎Zipに含める必要があります

今回はrequestsモジュールを利用して、POSTされたurlにアクセスして、HttpStatusを出力する、と言うシンプルなスクリプトを書いてみましょう。

requestsをまだインストールしていない場合はpip install requestsコマンドでインストールをしてください。

lambda_function.pyの中身は以下のように修正します。

確認

では、こちらも実行してみてください。

こちらも正常に処理が実行されましたね♪

AWSサービスのトリガーに依存する場合

では、最後により業務に近づいたケースを試してみましょう。

今回はAWSのS3バケットにファイルがPUTされたタイミングで動くスクリプトを書いてみます。

まずは、event.jsonにPUTされた際に送られてくるデータを定義します。

公式 に記載されていたサンプルイベントデータをベースに{バケット名}と{キー名}だけを修正します。

boto3モジュールをインストールしていない方はpip install boto3でインストールしてください。

lambda_function.pyは以下のように修正します。

このファイルの中でS3にアクセスする際にAWS CLIが利用されます。
session = Session(profile_name='{profile名}’)としています。

確認

では、実際に実行してみましょう。

正常に存在するファイルのContentTypeが取得出来ましたね。
AWS上のLambdaに乗せればリアルなPUTイベントを取得出来るので様々な操作が可能になります♪

オススメの参考書

独学プログラマー Python言語の基本から仕事のやり方まで

AWSによるサーバーレスアーキテクチャ”]

終わりに

今まではローカルで動作確認する際と実際にLambdaに上げる際にソースの修正やZip化をしたりと、差分が出てしまっていましたが、このツールを利用することでソースを変えること無くよりリアルな動作確認が出来るようになりました。

Lambdaを使っている方はとても便利なので是非使ってみてください♪

336×280




336×280




CATEGORIES & TAGS

IT, , , , , , , , ,

blogenist

Author: blogenist

お名前.comサイドバー