最近、2つ以上のAWSサービスを組み合わせたポストが増えているように思えますが、本日のポストもそのうちの1つになります。詳細をお話する前に、後ほどで登場するすべてのサービスについて簡単にご紹介したいと思います。振り返りになるかもしれませんが、AWSに詳しくない方にもブログをご理解頂くためです。
- Amazon Kinesisはリアルタイム データ ストリームを処理するためのマネージドサービスです。詳細に関しましてはこちらをご参照ください。 Amazon Kinesis – Real-Time Processing of Streaming Big Data
- Kinesis Connector Library を使用すると、他のAWSサービスまたはAWS以外のサービスからKinesisに接続するのに役立ちます。
- AWS CloudFormationはテンプレートを使用し、関連するAWSリソースのセットを、定義、作成、および管理するのに役立ちます。
- CloudWatch Logs を使うと、オペレーティングシステム、アプリケーション、およびカスタムログファイルを保存し、監視することができます。詳細はこちらをご参照ください。Store and Monitor OS & Application Log Files with Amazon CloudWatch
- AWS Lambdaは、イベントに応答しコード(現在のNode.jsやJava)を実行します。コンピューティングリソースが管理されるため、コードに集中できます。詳細はこちらをご参照ください。AWS Lambda – Run Code in the Cloud 多くの開発者はAWS Lambdaを(多くの場合、新しい Amazon API Gatewayと一緒に)利用することで、1秒間に何度も呼び出されるスケーラビリティに富んだマイクロサービスを構築することが可能です。
- VPC Flow Log を使用することで、VPC、VPCサブネット、または Elastic Network Interface に関連するネットワークトラフィックにアクセスできます。
- 最後に、AWS CloudTrai はアカウントのAWS API コールを記録し、ログファイルとして保存します。もちろんAWS CloudTrail のポストもあります:AWS CloudTrail – Capture AWS API Activity
下記3つに関しては大切な属性があり、それぞれが効率的に格納され、インデックス化され、価値あるものへと可視化されるために、イベントデータの膨大なストリームを作成します。
イベントデータの可視化
本日は Kinesis、新しいCloudWatch Logs Subscription Consumer の利用方法についてご紹介します。CloudWatch Logs Subscription Consumer は、特定のKinesis Stream リーダーになります。Elasticsearch と S3 のための組み込みのコネクタが付属しており、他の拡張も可能です。
私たちは、EC2 (テンプレートにより作成されたVPCの中) の上にElasticsearchクラスタを構築し、イベントデータが Elasticsearch に流れるようログサブスクリプションを設定、Kibana と可視化ツールを使った優れたダッシュボードまで構築するCloudFormation Template を作成しました。VPC Flow Log、Lambda、CloudTrailに対応したデフォルトのダッシュボードも設定します。必要に応じてカスタマイズしたり、独自のCloudWatch Logs ロググループ用に新たに作成するも可能です。
スタックは必要なすべてのリソースを作成するのに約10分かかります。準備完了すると、CloudFormationコンソールの [出力] タブにダッシュボードと管理ツールのURLが表示されます:
スタックでは、古いバージョンのサンプルダッシュボードと一緒に、Kibanaのバージョン3とバージョン4が構築されます(Kibana4を使用する場合は、少し手動で設定をを行う必要があります)。最初のサンプルダッシュボードには、VPC Flow Log が表示されます。ご覧のとおり、かなりの量の情報が含まれています。
次のサンプルは、関数自体により生成されたデータによって増大するLambda Function の実行情報が表示されています。
最後の3つの列は、Lambda Functionに次のコードで作成されました。FunctionではKinesisストリームを処理後各呼び出しに関する情報をログに記録されます。
javascript
exports.handler = function(event, context) {
var start = new Date().getTime();
var bytesRead = 0;
event.Records.forEach(function(record) {
// Kinesis data is base64 encoded so decode here
payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
bytesRead += payload.length;
// log each record
console.log(JSON.stringify(record, null, 2));
});
// collect statistics on the function's activity and performance
console.log(JSON.stringify({ "recordsProcessed": event.Records.length,"processTime": new Date().getTime() - start,"bytesRead": bytesRead,
}, null, 2));
context.succeed("Successfully processed " + event.Records.length + " records.");
};
ここでは、ちょっとしたトリックがあります。サブスクリプションの消費者は、ログエントリが有効なJSONオブジェクトであることを判断し、それぞれの値にインデックスをはります。
非常に便利で簡単で、とても強力です。是非このデザインパターンについて研究する時間を少しとり、皆さんのシステムに活かせないか検討してみて下さい。
このテンプレートの構成詳細はこちらをご覧ください-CloudWatch Logs Subscription Consumer-
Consume the Consumer
独自のアプリケーションで、CloudWatch Logs サブスクリプションの消費者を使用することができます。
また他のコネクタを追加することで、他リソースのサポートを追加し拡張することができます。
— Jeff;(翻譯が酒徳が担当しました。原文:CloudWatch Logs Subscription Consumer + Elasticsearch + Kibana Dashboards)