【AWS】python-lambda-localとlambda-uploaderを使ってみた

2019-11-30
2019-11-30

AWS Lambda の開発時の不満

AWS Lambda は便利で使う機会が多いです。

ただ、ブラウザでコードを書いて修正していくのはちょっと大変です。

また、依存関係がある場合はローカルでいちいち zip に固めてアップロードするのもめんどうです。

できれば、慣れ親しんだエディターを使って、git で管理したりアップロードは GUI を操作せずにやりたいです。

ということで今回はおすすめの lambda 作成環境を紹介します。

使用言語は python です。

すでにいろいろな方がわかりやすい記事を書いているので、新しい内容はないかもです。

開発環境は何がベスト?

Lambda の開発環境に関して私と同じような不満を持つ人は多いようでいろいろな改善方法がすでに存在します。

解決策としては、現状だと以下のような選択肢になるのではないでしょうか。

  • python-lambda-local
  • AWS SAM Local
  • cloud9

個人的に一番簡単なのは今回紹介するpython-lambda-locallambda-uploaderかなと思ってます。

AWS SAM Local でも似たことができますが、ちょっと複雑になります。
簡単な Lambda 関数を一つアップロードする場合ではなく、API Gateway を組み合わせるなどの少し複雑な構成の場合には使えそうです。

cloud9 は単純にお金がかかるのでやめました。
多少の出費が許容できるなら選択肢に入ると思います。

今回作るもの

Lambda → Slack の通知システムです。

よくあるかなりわかりやすいものにしてみました。

python-lambda-local の使い方

python-lambda-local でできることは、python で書かれた lambda の local テストです。
これを使うことででいちいちアップロードして動作確認する必要がなくなります。

とりあえず、公式をみてみます。

公式によると python 2.7 か 3.7 が必要なので pyenv で 3.7 を用意しました。

それではpython-lambda-localをインストールしていきます。

pip install python-lambda-local

まずは一番簡単なパターンで試そうと思います。

作業フォルダを作成し、そこで以下の 2 つのファイルを作成します。

.
├── event.json
└── lambda_handler.py

event.jsonの中身はこんな感じです。

{
  "answer": "hello"
}

lambda-handler.pyは以下のように書きました。

import json
def lambda_handler(event, context):
    print("value = " + event['answer'])
    return event['answer']

次はコンソールで以下のコマンドを実行

python-lambda-local -f lambda_handler lambda_handler.py event.json

-fのあとに関数名とファイル名、最後に event ファイル名を指定して実行する。

結果は次のように出力される。

これで簡単なものなら local で動作することが確かめられました。

さて、今回やりたいのは Slack へメッセージを送ることなので、コードを以下のように書き換えます。

import json
import requests
import os
SLACK_URL = os.environ["SLACK_URL"]
def lambda_handler(event, context):
    message = "test"
    payload = {
        "text":message
    }
    data = json.dumps(payload)
    requests.post(SLACK_URL, data)
    return event['answer']

ポイントは外部ライブラリのrequestsが使用されていること。

lambda で外部ライブラリを使用するには layer を使うか、外部ライブラリも含めて zip に固めてアップロードする必要があります。

今回はlambda-uploaderを利用して後者の方法で試していきます。

まずは pip でインストール

pip install lambda-uploader

次は upload するための設定ファイルを用意します。

場所はこれまでの作業フォルダと同じで大丈夫なので、フォルダ内は以下のようになります。

├── event.json
├── lambda.json
└── lambda_handler.py

設定ファイルは以下のように記述しました。

{
  "name": "notify_func",
  "description": "slack notification",
  "region": "ap-northeast-1",
  "runtime": "python3.7",
  "handler": "lambda_handler.lambda_handler",
  "role": "lambdaの実行ロール",
  "requirements": ["requests"],
  "timeout": 5,
  "memory": 128
}

ポイントはroleの指定とrequirementsのところに使用する外部ライブラリを記述すること。
なのでロールはあらかじめ作成しておく必要があります。

あとは AWS の認証情報をあらかじめ設定しておくことです。

一度でも、aws cli を使った人なら問題ないと思います。

ここまできたらあとはコマンド一発でアップロードできます。

以下のコマンドをコンソールで実行します。

lambda-uploader --variables '{"SLACK_URL": "hogehoge"}'

オプションの variables は lambda で使用する環境変数です。slack の webhook の url を入れます。

なんとこのコマンドだけでコードが zip に固められ aws にアップロードされます。

コンソールでアップロードを確認し、test イベントを実行してみます。

slack にもしっかりメッセージが飛んでます。

簡単ですね!

まとめ

今回は lambda の開発環境の紹介でした。

今まで便利なツールの存在を知りながら、コンソールでコードを書いていたのでようやくコンソールを卒業できてスッキリしました。

思っていたよりさくっとできたので、もっと早く試しておけばよかったです。

一番時間がかかったのが python 3.7 のインストールでした。