Lambdaによる
クラウド型言語の実装
Genki&Sugawara
お前誰よ
• twi%er
• @sgwr_dts
• github/bitbicket
• winebarrel
最近のアクティビティ
• Lambda便利ツール作りました
• lambchop
• h,ps://github.com/winebarrel/lambchop
• Please:try:it:out!
本題
Lambdaを触ってみました
• h#p://so)wh.at/search?q=lambda
• AWS;Lambdaで外部のURLをたたく;);h#p://goo.gl/aZkxTy
• AWS;LambdaでMySQL(RDS)に接続する;);h#p://goo.gl/33tVg1
• aws)sdkで自分自身にイベントを送る;);h#p://goo.gl/GhBykk
• バイナリデータをイベントとして送る;);h#p://goo.gl/Za5EpR
• 任意のシステムコマンドを実行する;);h#p://goo.gl/oJ60F8
スループットを計ってみたり
h"p://www.slideshare.net/winebarrel/
200ksec
twi$erボット作ってみたり
h"ps://github.com/winebarrel/aws6lambda6
tw6bot
僕はこう思ったッス
フィルタであって
ジョブキューではないのかな…
戻り値を受け取りづらい
Developer(Guide(9ページ目
h/p://docs.aws.amazon.com/lambda/latest/dg/lambda=dg.pdf
• context.done()は2つの引数をとる
• 1つ目がnullのときは成功
• null以外のときは失敗。CW(Logsに出力
• 2つ目の引数が与えられた場合、テスト実行コンソールに出力
戻り値を受け取りづらい
CW#Logsはともかく
テスト実行コンソールのログ取得APIがない
単体ではInvokeに一対一で対応した
実行結果を受け取れない
CloudWatch+Logsつらい
• 検索機能がない
• Log%Groupはfunc-on名
• しかし出力先Log%Streamが不定
エラーハンドリングつらい
• エラーのグラフはでるけど個別のエラーはログあさるしかない
• CloudWatch,Logsで探すのめんどい
lambchop)tail
• lambda用のtail
• h*ps://github.com/winebarrel/lambchop/
• blob/master/lib/lambchop/tail.rb
• blob/master/lib/lambchop/watch_dog.rb
中でやってること
• tailコマンド実行後に更新されたLog)Streamを全部取得
• 指定時間以降のLog)Eventを取得、ソートして出力
• 以降繰り返し…
Pythonのツールでも同じことやってた
• kappa
• command*line*tool*for*AWS*Lambda.
• h8ps://github.com/garnaat/kappa
• kappa tailコマンドの実装がほぼ同じ
ちょっとつらい…
AWSはこう思ったッス(想像)
『おおいなる流れ(Stream)の中では
 個々の実行結果などどうでもいいのだ』
現状では個々の実行結果を知るのが厳しい
なのでジョブキュー用途にはあまり向いていないような
戻り値を受け取る方法を
考えてみた
• アプリがLambdaを実行
• uuidを関数コールIDとして付ける
• LambdaはSQSに結果を投げる
• uuidもSQSに投げる
• 別スレッドがSQSをポーリング
• uuidに対応した関数呼び出しに結果を返す
なにが楽しいか?
• サーバいらずのジョブキューシステムを持てる
• 並列実効性が高い(タイムアウト60sだけど)
• Nodeならオンデマンドでロジックをぶち込める
• Func/on.toString
Func%on.toString
h"ps://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/
Global_Objects/FuncBon/toString
$ node
> var f = function() { console.log('hello'); }
undefined
> f.toString();
'function () { console.log('hello'); }'
こういうことができる
var lambda_func = lambda(function(args, callback) {
// Run on Lambda
// Any job
callback({key:'val'});
});
lambda_func({key: "val"}, function(retval) {
console.log(retval);
});
作ってみた
lambleg
h"ps://www.npmjs.com/package/lambleg
Demo
すでに同じネタをやってる人がいた!orz
Lambdaws
h)ps://github.com/mentum/lambdaws
var λ = require('lambdaws').create;
var calculator = function(a, b, callback) { callback(a+b) };
var cloudedCalculator = λ(calculator);
cloudedCalculator(5, 2, function(data) {
// Calls the function in the cloud, it doesn't run locally
console.log(data); // Prints 7
});
もう少し考えを進めてみた
• Pure&JSのコードはだいたいそのまま実行できる
• nodeで言語を実装すればもっとシームレスになるのでは?
作ってみた
クラウド型言語(仮)
Clala
h"ps://github.com/winebarrel/clala
こんなんです
• schemeのサブセット
• Lambdaに関数を定義できる
• コンテキストをLambdaに持って行ける
• (破壊的更新はできません)
Demo
所感
• 実験的実装なので未来はないが未来感はある
• 非同期な世界とのギャップがつらい
• だれか実用的なのを実装してください
まとめ
• 実行毎の結果をハンドルできると便利そうです
• なので機能追加をぜひー
• あとタイムアウト時間をのばさせて
• あとSNS対応を
• ついでにCW&Logsに検索機能をばー
Thank&you&for&your&a,en.on.

Lambdaによるクラウド型言語の実装