AWS Cloud9 で Lambda Function 開発

 前回の記事で Cloud9 で Rails の開発環境を作ってみましたが、 Cloud9 では Lambda Function の開発も行えるということで、やってみました。

Lambda Function の作成

 それでは Lambda 関数を作成してみます。 Cloud9 の新しい環境を作成すると Welcome ページが表示されますが、そこに Create Lambda Function というリンクがありますのでクリックします。

f:id:akanuma-hiroaki:20190119181629p:plain

 すると Lambda Function の作成フォームが表示されますので、まずは関数名とアプリケーション名を入力し、 Next をクリックします。

f:id:akanuma-hiroaki:20190119181750p:plain

 次に Function のテンプレートを選択します。今回はブランクから作成するので empty-python を選択して Next をクリックします。

f:id:akanuma-hiroaki:20190119181932p:plain

 続いて Function のトリガーを選択します。 API Gateway が選択できるようになっているので選択してみました。 Resours Path と Security を設定して Next をクリックします。

f:id:akanuma-hiroaki:20190119182215p:plain

 最後にメモリサイズと Role を選択して、 Next をクリックします。

f:id:akanuma-hiroaki:20190119182308p:plain

 これまでの設定内容の確認画面が表示されますので、間違いがなければ Finish をクリックします。

f:id:akanuma-hiroaki:20190119182424p:plain

 すると Lambda Function が作成され、 Cloud9 のエディタに表示されます。左側のディレクトリツリーにもファイルとして表示されます。

f:id:akanuma-hiroaki:20190119182935p:plain

 ということは EC2 の Linux 上にも存在するということなので、前回の記事でやったように、 vim でファイルを編集することも可能です。 vim で編集した内容はすぐに Cloud9 のエディタにも反映されます。 Linux 上で触れれば git でバージョン管理をすることも可能になりますので、継続的に開発していくにはかなり便利になりそうです。

$ pwd
/home/ec2-user/environment
$ ls -l SesSample/SesSample/
total 8
-rw-r--r-- 1 ec2-user ec2-user 75 Jan 19 07:53 lambda_function.py
-rw-r--r-- 1 ec2-user ec2-user 49 Jan 19 07:54 lambda-payloads.json

 Lambda のコンソールの方で確認してみると、そちらにも Function が作成されています。

f:id:akanuma-hiroaki:20190119183055p:plain

 内容も同様でブランクのテンプレートになっています。

f:id:akanuma-hiroaki:20190119183206p:plain

 Function のトリガーに API Gateway を選択したので、コンソールから確認すると API Gateway が作成されています。

f:id:akanuma-hiroaki:20190119183311p:plain

Lambda Function の実行

 それではひとまず Cloud9 から Lambda Function を動かしてみます。 Run ボタンをクリックします。

f:id:akanuma-hiroaki:20190119183515p:plain

 Function 実行のためのペインが開きますので、さらに Run をクリックします。

f:id:akanuma-hiroaki:20190119183609p:plain

 すると Function が実行され、下部に実行結果が表示されます。

f:id:akanuma-hiroaki:20190119183708p:plain

SMS 送信のサンプル

 今回はサンプルとして SMS 送信処理を実装してみます。内容は下記のようにシンプルなもので、 Amazon SNS から固定の宛先に SMS を送信します。

import boto3

PHONE_NUMBER = "080XXXXXXXX"
MESSAGE = "Test Message from Lambda"
REGION = "ap-southeast-1"

sns = boto3.client('sns')

def lambda_handler(event, context):
    sns.publish(PhoneNumber = PHONE_NUMBER, Message = MESSAGE)
    return 'Sent SMS'

 これを実行すると下記のように SMS が送信されます。

f:id:akanuma-hiroaki:20190119184045p:plain:w300

Lambda Function のデバッグ

 Cloud9 のエディタからは Lambda Function をデバッグすることもできます。行番号の前をクリックするとブレイクポイントとして赤いマークがつきますので、この状態で Run をクリックします。

f:id:akanuma-hiroaki:20190119184307p:plain

 実行用のペインでは今度はデバッグ用のボタンをクリックします。

f:id:akanuma-hiroaki:20190119184529p:plain

 すると関数の実行がブレイクポイントで停止し、右側ペインにコールスタックや変数の内容が表示されます。実行ボタンをクリックすると関数の実行が続行されます。

f:id:akanuma-hiroaki:20190119185417p:plain

Lambda Function のデプロイ

 Cloud9 から Lambda Function を作成した場合、作成時だけは同じ内容がリモートにも反映されますが、それ以降の変更内容は Cloud9 上にあるだけで、リモートには反映されていません。リモートにデプロイするには右側ペインで AWS Resources を選択し、ローカルで変更した Function を選択してデプロイボタンをクリックします。

f:id:akanuma-hiroaki:20190119190407p:plain

 すると Function がリモートにデプロイされ、 Lambda のコンソールからも内容が反映されていることが確認できます。

f:id:akanuma-hiroaki:20190119205513p:plain

 また、 Cloud9 からはリモートの Lambda Function を実行することも可能です。実行用のペインで Lambda (remote) を選択して Run をクリックします。

f:id:akanuma-hiroaki:20190119205828p:plain

 するとローカルの Function 実行時と同様に結果が下部に表示されます。今回はリモートの Function に SMS 送信の権限がないということでエラーになってしまいました。

f:id:akanuma-hiroaki:20190119210204p:plain

 Lambda のコンソール上で権限のある Role を割り当ててから再度実行すると、下記のように成功し、 SMS が送信されました。

f:id:akanuma-hiroaki:20190119210720p:plain

まとめ

 Lambda Function は Lambda のコンソールで実装すると普通のコードのようなバージョン管理ができないのが難点と感じていました。かといってバージョン管理できるように手元の端末上でコードを書いた場合はそのまま Function を実行することはできないので、毎回リモートに反映する必要があります。その点 Cloud9 は環境が EC2 の Linux 上にあり、書いたコードをそのまま実行することもバージョン管理することも可能なので、 Lambda の開発をかなり便利にしてくれそうに感じています。

 Cloud9 では Ruby ランタイムにはまだ対応していないようで、関数作成時のテンプレートにも Ruby のテンプレートは存在せず、リモートからのインポートの機能を使っても、 Python の Function はインポートできても Ruby の Function はインポートできませんでした。ここは今後の対応を待ちたいところです。