Lambda関数の集中ログシステム

UnsplashのScott Webbによる写真

AWSのお客様は、サービス固有のメトリックとログファイルにアクセスして、AWS CloudWatchを介して各AWSサービスがどのように動作しているかについての洞察を得ることができます。このサービスは、小規模で複雑性の低いアプリケーションの集中ログプラットフォームとして使用できますが、環境が複雑で規模が大きい場合は、Splunk、Datadog、ELK(ElasticSearch、Logstash、 Kibana)スタック。

Foxintelligenceでは、AWSマネージドサービス(API Gateway、Lambda、Lambda @ Edgeなど)のDockerized MicroservicesおよびCloudWatch Logsのログプラットフォームとして、有名なELKスタックを使用しています。ただし、サーバーレスアーキテクチャの台頭に伴い、インタラクティブで動的なダッシュボードを使用して、複数のAWSリージョンでスピンアップしたLambda関数のトラブルシューティングとデバッグを行える単一の場所が必要になりました。したがって、この投稿では、CloudWatchからELKへのログのほぼリアルタイムのフィードを配信するために従ったプロセスを説明します。ワークフローは、以下のスキーマで説明されています。

Amazon Kinesis、Amazon CloudWatch、AWS Lambdaを使用したLambdaのリアルタイムロギング

CloudWatchサブスクリプションを使用して、Lambda関数からログイベントのリアルタイムフィードにアクセスし、Amazon Kinesis Data Streamsに配信します。そこから、AWS Lambdaがトリガーされ、カスタム処理、分析、およびLogstashにロードする前にログデータにビジネスロジックを適用します(ログエンリッチメント)。

ログイベントへのサブスクライブを開始するには、イベントが配信される受信ソースを作成します。 Kinesisストリームを作成する前に、生成されるログデータの量(スループット)を計算します。このボリュームを処理するのに十分なシャードを持つKinesisストリームを作成してください。ストリームに十分なシャードがない場合、ログストリームは調整されます。

次に、Kinesisストリームにログを挿入するCloudWatch Logsアクセス許可を付与するIAMロールを作成します。

IAMロールは、次のスクリーンショットに示すように構成する必要があります。

以下のコマンドを発行して、CloudWatch Logsの宛先を作成します。

ログイベントのほぼリアルタイムのフィードをKinesisに配信するには、次のコマンドでCloudWatch Logsサブスクリプションフィルターを作成する必要があります。

サブスクリプションフィルターは、選択したロググループからKinesisストリームへのリアルタイムログデータのフローをすぐに開始します。

サブスクリプションフィルターを設定すると、CloudWatch Logsはフィルターパターンに一致するすべての受信ログイベントをKinesisストリームに転送します。次に、ログコンシューマを展開する必要があります。

コンシューマーは、Kinesisデータストリームのレコードを処理するノードベースのLambda関数です。

したがって、次の例に示すように、Kinesisからレコードを取得する権限を持つ実行ロールを割り当てる必要があります。

そして、ストリームから一度に読み込まれるバッチサイズを設定します。

その結果、AWS Lambdaはデータストリームからレコードを読み取り、ストリームレコードを含むイベントと同期して関数ハンドラーを呼び出します。以下は、Kinesis Data Streamsによって発行されたイベントの例です。

関数ハンドラーは一目瞭然で、入力としてAmazon Kinesisイベントデータを受け取り、データ属性レコードをデコードし(Kinesisレコードのデータ属性はBase64でエンコードされ、gzip形式で圧縮されます)、Logstashにログを書き込みます。

ログはUDPプロトコルを介して送信されますが、これはパフォーマンスと信頼性の点で優れたトレードオフです。

いくつかのログを配送する

このチュートリアルの目的のために、特定の数値のフィボナッチ値を計算する簡単なラムダ関数を作成しました。

すべてうまくいけば、ElasticSearchで新しいインデックスが作成され、そのパターンをKibanaで定義できるようになります。

「インデックスパターンの作成」をクリックすると、ログを分析する準備ができました。

現時点では、Lambda関数からログを収集しているだけなので、あまり多くはありません。ビューまたはダッシュボードを構築して、Lambda関数の実装と機能に関する決定を通知するのに役立つ重要な情報を強調表示できます。

既に多数の既存のロググループがある場合は、次のシェルスクリプトを使用してKinesis宛先にサブスクライブできます。

その結果、すべてのLambda関数ログがKinesisデータストリームに配信されます。

これをさらに進め、CloudTrailのパワーを活用して、CreateLogGroupイベントに基づいてLambda関数を呼び出し、新しいロググループを自動サブスクライブできます。

私たちは騒ぐためだけにこれを共有していません

これらの問題のいくつかを解決する手助けをしたい人を探しているので、これを共有しています。求人広告に当てはめることができる洞察はあまりないので、これがもう少し与えられ、あなたの食欲を刺激することを願っています。新しい役割について心を開いている場合や、単にチャットをしたい場合-連絡を取り合う、または応募する-ぜひご連絡ください。