以前、インティメートマージャーの松田さんが↓のブログで、
http://tech.im-dmp.net/entry/archives/1681
MackerelとPapertrailとRundeckを紹介してて、特にpapertrailが気になっていたのですが、
先日aerobatic(https://www.aerobatic.com/)というGitにPushするだけで簡単に静的サイトをホスティング出来るサービスの↓の”AWS Lambda Powered Continuous Deployment”というブログを読んでいたら、
https://www.aerobatic.com/blog/lambda-continuous-deployment
↓って記述を見かけて、なんか良さそうだな、と。
Lambda does send stdout to CloudWatch which is ok for isolated testing, but because the logs aren’t searchable, quickly becomes unwieldy when troubleshooting a Lambda function receiving any sort of load.
AWS Lambdaは標準出力をCloudWatchに送ります。それはisolatedなテストを行うにはOKだけど、ログはSearchableではなく、トラブルシューティングの時などLambdaファンクションがそれなりのロードを受けると、すぐにかさばって扱いにくくなってしまいます。
Our solution is to send log events from the Lambda function to a 3rd party logging service. We use Papertrail and highly recommend it. The winston-papertrail module provides a winston transport that handles forwarding log entries to Papertrail.
私たちのソリューションはイベントログをLambdaファンクションから3rdパーティーのロギングサービスに送る、というものです。私たちはPapertrailを使っていて高くオススメしています。winston-papertrailモジュールは(Node.jsのロギングライブラリである)winston転送を提供し、ログエントリのPapertrailへのフォワーディングを行います。
ということで、さっそく試してみたいと思います。
まずは、https://papertrailapp.com/ でアカウントを作ります。まずはFree Planにしてみました。
//embedr.flickr.com/assets/client-code.js
条件的には↓のような感じ。ちょっと試すには十分な量かな、と。
– Free
– 100 MB/month
– Additional 5 GB first month
– 48 hours search
– 7 days archive
– Unlimited systems
– Unlimited users
また、papertrailは↓のようにS3バケットにexport出来たり、
http://help.papertrailapp.com/kb/how-it-works/permanent-log-archives/
S3+Amazon EMRを使って解析を行ったりすることもできて、多機能です。
http://help.papertrailapp.com/kb/analytics/introduction-to-hadoop-and-hive/
コレといって自分でソフトウェアをインストールしたりせず↓大量のログデータに対してこんな事が出来るなんて良い時代になったものです。
SELECT AVERAGE(response_time) FROM request_events GROUP BY request_path SELECT SUM(data_transferred) FROM api_logs GROUP BY account_id WHERE ds > '2011-01-01' AND ds < '2011-01-31'
Papertrailを試す作業に戻ります。
Lambdaファンクションを作ります。適当にHello Worldとかで。
//embedr.flickr.com/assets/client-code.js
ローカルで↓のようなコードを書いて、
1 console.log('Loading function'); 2 3 var winston = require('winston'); 4 require('winston-papertrail').Papertrail; 5 6 exports.handler = function(event, context) { 7 var logger = new winston.Logger({ 8 transports: [ 9 new winston.transports.Papertrail({ 10 level: 'info', 11 hostname: 'xxxx', 12 host: 'logs4.papertrailapp.com', 13 port: xxxx 14 }) 15 ] 16 }); 17 logger.info("hoge"); 18 logger.info("foo"); 19 logger.info("bar"); 20 logger.info("buzz"); 21 context.succeed("done"); 22 };
npmでwinstonとwinston-papertrailをカレントディレクトリにインストールして
$ npm install winston winston@2.2.0 node_modules/winston ├── cycle@1.0.3 ├── stack-trace@0.0.9 ├── eyes@0.1.8 ├── isstream@0.1.2 ├── async@1.0.0 ├── pkginfo@0.3.1 └── colors@1.0.3 $ npm install winston-papertrail winston-papertrail@1.0.2 node_modules/winston-papertrail └── glossy@0.1.7
↓このディレクトリ内のファイルをzipで固めてLambdaにアップロードして実行します。
$ ls -l total 8 -rw-r--r-- 1 eiji 1896053708 502 4 3 19:44 hello.js drwxr-xr-x 3 eiji 1896053708 102 4 3 19:46 node_modules $ zip -r hello.zip ./* adding: hello.js (deflated 51%) adding: node_modules/ (stored 0%) adding: node_modules/winston/ (stored 0%) adding: node_modules/winston/CHANGELOG.md (deflated 67%) adding: node_modules/winston/lib/ (stored 0%) 〜略〜
↓こんな感じ。
//embedr.flickr.com/assets/client-code.js
試しにもう一つログの突っ込み先を作ってみたり、してみたりして。
//embedr.flickr.com/assets/client-code.js
で、Lambdaファンクションをバンバン叩くと↓のように。
そりゃまぁ、ホントのホントにリアルタイムってわけにはいかないですが便利です。
//embedr.flickr.com/assets/client-code.js
こういう検索機能とか便利ですね〜(試しに”hoge”で…)
//embedr.flickr.com/assets/client-code.js
売り上げランキング: 1,954
コメント