プログラム初心者がAWS Lambda(Python)でハマった7個のこと

記事タイトルとURLをコピーする

私の所属している、"クラウドインテグレーション部技術1課"では、毎日5分程度の朝会というのをやっているのですが、ファシリテータをみんな忘れるので、適当に選出するbotを作成しました。
SlackのIncoming Webhookを用いて、メンバーをシャッフルしメンションする簡単なbotです。

朝の10時にしか動かないため、サーバーを起動させ続けているのは非常にもったいないので、Pythonでコードを書いて、AWS LambdaでCronで動かすことにしたのがきっかけです

会社では"作らないSI"と言っていますが、普段はインフラエンジニアとして、基本的にコードを書いていません。
ほとんど、サンデープログラマーです。

AWS Lambdaの初歩的なところでハマったんだ

さて、こんな私が恥ずかしながら、Lambdaを使おうと思ってハマった事柄の、ごく簡単な忘備録を載せておきます。

1. ファイル名はHandlerに書く

"test.py" とかのファイル名にしますが、そのファイル名 "test" とかを、「Handler」のピリオドの前までに書きます。

Lambda-Handler-1

2. 実行したい部分もHandlerに書く

実行したい関数は、「Handler」のピリオド以下に書きます。

def bot(event, context):

という形で、botという関数を用いる場合は、 「Handler」の部分は、上と合わせて"test.bod"と入れればいいことになります。

Lambda-Handler-2

3. ちゃんと関数にはreturnをつける

当たり前なのですが、defで関数を定義していますので最後には"return"が必要です。 特にどこに返すというプログラムでもない場合、エラーがLambdaの中でハンドリングされていれば、返り値はとりあえず"0"とかでも問題ないようです。

社内レビュー中に指摘が有って、returnつけなくてもNoneで返るそうです。知らなかった。

もちろん、次に繋げる場合は返り値が必要になると思います。

4. cronの記法に注意

普通にLinuxで使うcron記法と若干変わっていて、 AWSのドキュメントに スケジュールされたイベントでの AWS Lambda の使用 というのがあります。

曜日指定がある場合は、"*"ではなく"?"を使う必要があるらしく、 今回の平日の毎朝10時という場合は、

cron(0 1 ? * MON-FRI *)

と書けばいいようでした。

5. ライブラリはフォルダ直下に置く

AWS Lambdaでライブラリをインポートすることについては色々なところで言われてはいますが、importしたライブラリは、フォルダの直下にある必要があります。
今回"slackweb"を使いましたが、pipでやる場合は、

pip install module-name -t /path/to/project-dir

で入れ込む必要があります。

6. zipするときは-rをつけましょう

無駄にハマったのですが、ライブラリとかがフォルダで入っているので、

zip -r * ../test.zip

とかのコマンドで、zip圧縮が必要です。

7. エラーはExecution resultではなく、右下のLog outputに内容が出ます

最初、「Execution result」を見ていて、なんのエラーが出て止まっているのか、と思っていましたが、右下の「Log output」に素直にエラーが出ていました。

Lambda-Logoutput-1

まとめ

知っている人にとっては当たり前のことばかりですが、無駄にハマって時間を使ったので、もし同じようにハマっている人の助けになればと思い、恥を忍んで書き出しました。
(こんな初歩的なことでハマる奴いないよ、と言われるかもしれませんが)

慣れてくればフレームワークでやってしまうのがきっと幸せだと思います。祝! Serverless Framework 1.0 Beta版リリース



誰かの助けになれば幸いです。