前回の記事で Cloud9 で Rails の開発環境を作ってみましたが、 Cloud9 では Lambda Function の開発も行えるということで、やってみました。
Lambda Function の作成
それでは Lambda 関数を作成してみます。 Cloud9 の新しい環境を作成すると Welcome ページが表示されますが、そこに Create Lambda Function
というリンクがありますのでクリックします。
すると Lambda Function の作成フォームが表示されますので、まずは関数名とアプリケーション名を入力し、 Next
をクリックします。
次に Function のテンプレートを選択します。今回はブランクから作成するので empty-python
を選択して Next
をクリックします。
続いて Function のトリガーを選択します。 API Gateway が選択できるようになっているので選択してみました。 Resours Path と Security を設定して Next
をクリックします。
最後にメモリサイズと Role を選択して、 Next
をクリックします。
これまでの設定内容の確認画面が表示されますので、間違いがなければ Finish
をクリックします。
すると Lambda Function が作成され、 Cloud9 のエディタに表示されます。左側のディレクトリツリーにもファイルとして表示されます。
ということは 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 が作成されています。
内容も同様でブランクのテンプレートになっています。
Function のトリガーに API Gateway を選択したので、コンソールから確認すると API Gateway が作成されています。
Lambda Function の実行
それではひとまず Cloud9 から Lambda Function を動かしてみます。 Run
ボタンをクリックします。
Function 実行のためのペインが開きますので、さらに Run
をクリックします。
すると Function が実行され、下部に実行結果が表示されます。
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 が送信されます。
Lambda Function のデバッグ
Cloud9 のエディタからは Lambda Function をデバッグすることもできます。行番号の前をクリックするとブレイクポイントとして赤いマークがつきますので、この状態で Run
をクリックします。
実行用のペインでは今度はデバッグ用のボタンをクリックします。
すると関数の実行がブレイクポイントで停止し、右側ペインにコールスタックや変数の内容が表示されます。実行ボタンをクリックすると関数の実行が続行されます。
Lambda Function のデプロイ
Cloud9 から Lambda Function を作成した場合、作成時だけは同じ内容がリモートにも反映されますが、それ以降の変更内容は Cloud9 上にあるだけで、リモートには反映されていません。リモートにデプロイするには右側ペインで AWS Resources を選択し、ローカルで変更した Function を選択してデプロイボタンをクリックします。
すると Function がリモートにデプロイされ、 Lambda のコンソールからも内容が反映されていることが確認できます。
また、 Cloud9 からはリモートの Lambda Function を実行することも可能です。実行用のペインで Lambda (remote)
を選択して Run
をクリックします。
するとローカルの Function 実行時と同様に結果が下部に表示されます。今回はリモートの Function に SMS 送信の権限がないということでエラーになってしまいました。
Lambda のコンソール上で権限のある Role を割り当ててから再度実行すると、下記のように成功し、 SMS が送信されました。
まとめ
Lambda Function は Lambda のコンソールで実装すると普通のコードのようなバージョン管理ができないのが難点と感じていました。かといってバージョン管理できるように手元の端末上でコードを書いた場合はそのまま Function を実行することはできないので、毎回リモートに反映する必要があります。その点 Cloud9 は環境が EC2 の Linux 上にあり、書いたコードをそのまま実行することもバージョン管理することも可能なので、 Lambda の開発をかなり便利にしてくれそうに感じています。
Cloud9 では Ruby ランタイムにはまだ対応していないようで、関数作成時のテンプレートにも Ruby のテンプレートは存在せず、リモートからのインポートの機能を使っても、 Python の Function はインポートできても Ruby の Function はインポートできませんでした。ここは今後の対応を待ちたいところです。