ようへいの日々精進XP

よかろうもん

ラムダこりゃ(Amazon Lambda チュートリアル)

tl;dl

今更だけど Amazon Lambda を弄ってみた。

弄るといっても Lambda の魅力って他のサービス(AWS の各種サービスや外部のサービス)との連携だよなって勝手に思ったので SNS → Lambda → im.kayac.com 又は Datadog Event という連携した。


参考

www.slideshare.net

何はともあれ、まずは黒帯先輩の資料を拝読するところから始める。


ネタ二品

SNS -> Lambda -> im.kayac.com tutorial

github.com

SNS -> Lambda -> Datadog tutorial

github.com

詳しくは...

上記の README をご一読下さい。

両方ともに SNS Topic を作成して、Subscription として Lambda Function を指定する。そして、各 Lambda Function では Event Source として SNS Topic を指定してあげれば SNS と Lambda の連携は完了。後はよしなに Message を Publish すればそれぞれの通知先に通知する。


弄った際のメモ

意外に簡単

Node.js 又は Java で記載する Lambda Function は個人的には高いハードルだったが、上記の二品のネタ程度であれば Node.js 検定特級(超初心者)な自分でも簡単に書くことが出来た。

exports.handler = function(event, context) {

// ここに処理を書く

};

以下は個人的な知見。

  • exports.handler = function(event, context) {}; の間に処理を書けば良い
  • キモは変数 event で Event Source からのデータがこの変数に格納されている
  • event の中身が JSON であれば JSON.parse(event.Records[0].Sns.Message); 等で JSON を解析してハッシュにならしてあげれば値を取り出すことが出来る

高度なことをやろうとすると、上記の知見だけでは「Lambda こりゃ(だめだこりゃ)」なんだろうけど。ということで、次いってみよう。

デバッグが面倒(だったけど...)

Function 自体は意外に簡単に書くことが出来た。しかし、スクリプト修正→ AWS CLIupdate-function-code を叩く→ AWS CLI でメッセージを publish するという流れでデバッグを繰り返しがだんだん面倒に感じてきた。DynamoDB Local のようなローカルで動く Lambda 環境が欲しいなあと思った矢先に Lambda-local というツールが提供されているようなのでちょっと試してみた。

github.com

インストールは以下のように。

% npm install lambda-local

README に従って NODE_PATH やクレデンシャルな情報を設定。

% export NODE_PATH='/path/to/lambda-korya-xxxxxxx/node_modules/lambda-local/node_modules'
% export AWS_ACCESS_KEY_ID='AKXXXXXXXXXXXXXXXXXX'
% export AWS_SECRET_ACCESS_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

Lambda Function に渡すイベントデータを以下のように作成。

 % cat << EOT >> test.js
module.exports = {
  "default": "test",
  "title": "Lambda Message Test",
  "message": "foo bar",
  "url": "http://xxx.example.com/"
};
EOT

lambda-local を実行してみる。

% lambda-local -l index_test.js.test -h handler -e test.js

以下のように出力されて動作確認が出来る。

% lambda-local -l index_test.js.test -h handler -e test.js
Loading event
Logs
----
START RequestId: 8f1cf24a-6637-11d2-de89-d7c1a17df67c
Sending Datadog event: 
URL: https://app.datadoghq.com/api/v1/events?api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Message: {"title":"Lambda Message Test","text":"foo bar","alert_type":"error"}
Message send successful!  Server responded with: {"status": "ok", "event": {"priority": null, "date_happened": 1442717663, "handle": null, "title": "Lambda Message Test", "url": "https://app.datadoghq.com/event/event?id=12345678901234567", "text": "foo bar", "tags": null, "related_event_id": null, "id": 12345678901234567}}
END


Message
------

尚、上記の例では lambda-korya-datadog を利用してみたが、Lambda Function を以下のように修正する必要があった。

--- index_test.js       2015-09-20 11:47:34.000000000 +0900
+++ index.js    2015-09-20 11:57:37.000000000 +0900
@@ -6,8 +6,7 @@
 
 exports.handler = function(event, context) {
   // Generate formData
-  // var message = JSON.parse(event.Records[0].Sns.Message);
-  var message = event;
+  var message = JSON.parse(event.Records[0].Sns.Message);
   var formData = {
     "title": message.title,
     "text": message.message,

修正無く利用できれば嬉しいのだが...この辺り、自分の詰めの甘さが露呈した感じ...お恥ずかしい。


ということで

f:id:inokara:20150920110128j:plain

次、いってみようー(Lambda を引き続き勉強していきたい)