私の所属している、"クラウドインテグレーション部技術1課"では、毎日5分程度の朝会というのをやっているのですが、ファシリテータをみんな忘れるので、適当に選出するbotを作成しました。
SlackのIncoming Webhookを用いて、メンバーをシャッフルしメンションする簡単なbotです。
朝の10時にしか動かないため、サーバーを起動させ続けているのは非常にもったいないので、Pythonでコードを書いて、AWS LambdaでCronで動かすことにしたのがきっかけです
会社では"作らないSI"と言っていますが、普段はインフラエンジニアとして、基本的にコードを書いていません。
ほとんど、サンデープログラマーです。
## AWS Lambdaの初歩的なところでハマったんだ
さて、こんな私が恥ずかしながら、Lambdaを使おうと思ってハマった事柄の、ごく簡単な忘備録を載せておきます。
### 1. ファイル名はHandlerに書く
"test.py" とかのファイル名にしますが、そのファイル名 "test" とかを、「Handler」のピリオドの前までに書きます。
### 2. 実行したい部分もHandlerに書く
実行したい関数は、「Handler」のピリオド以下に書きます。
def bot(event, context):
という形で、botという関数を用いる場合は、 「Handler」の部分は、上と合わせて"test.bod"と入れればいいことになります。
### 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」に素直にエラーが出ていました。
## まとめ
知っている人にとっては当たり前のことばかりですが、無駄にハマって時間を使ったので、もし同じようにハマっている人の助けになればと思い、恥を忍んで書き出しました。
(こんな初歩的なことでハマる奴いないよ、と言われるかもしれませんが)
慣れてくればフレームワークでやってしまうのがきっと幸せだと思います。祝！ Serverless Framework 1.0 Beta版リリース
誰かの助けになれば幸いです。