Lambda関数の実行アクティビティをAmazon Elasticsearch Serviceへ配信してみる – ClassmethodサーバーレスAdvent Calendar 2017 #serverless #adventcalendar #reinvent

2017.12.18

どうも!大阪オフィスの西村祐二です。

このエントリはServerless Advent Calendar 2017の18日目の記事となります。

今回はLambda関数の実行アクティビティをElasticsearch Serviceへ配信してみたいと思います。 なるべく簡単に済ますために、AWS CloudTrailを中継する形をとります。

AWS CloudTrailでLambda関数の実行ログが取れるようになったので、これを利用したいと思います。

早速やっていきましょう。

Lambda関数を作成

マネージメントコンソールのLambdaから関数を作成します。

設計図から「hello-world-python3」を選択し作成します。

今回、名前は「test-cloudtrail」としています。

CloudTrailを設定

下記ブログを参考にLambda関数の実行アクティビティを取得します。

【速報】AWS CloudTrailでLambda Functionの実行ログが取れるようになりました #reinvent

マネージメントコンソールのCloudTrailからLambda関数の実行アクティビティを取得する設定を行います。

「証跡の作成」をクリックします。

今回は証跡名を「test-lambda」としておきます。 Lambdaのタブをクリックし、実行アクティビティを取得したい関数を選択します。 先程作成した、「test-cloudtrail」にチェックをつけます。

今回、保存するS3のバケットは新しく作成します。 バケット名は「cloudtrail-lambda」として作成します。

証跡が作成されたか確認します。

証跡が作成できたら、対象のLambdaの実行アクティビティが取得できるので、 取得したログをCloudWatch Logsに転送します。

証跡情報から作成した「test-lambda」をクリックします。

下の方に、CloudWatch Logsに転送する設定があります。

デフォルトのまま設定していきます。 ロググループは「CloudTrail/DefaultLogGroup」となっています。

対象のLambdaを実行してみて、きちんとCloudWatch Logsに転送されているか確認します。 ロググループは「CloudTrail/DefaultLogGroup」で、 フィルターを「Invoke」とすると、実行アクティビティのログを確認することができます。

Amazon Elasticsearch Serviceの設定

マネージメントコンソールから作成していきます。

Elasticsearchのドメイン名は、今回「test-es」として作成します。

インスタンスタイプは「t2.small.elasticsearch」としています。

ストレージの設定はデフォルトのままです。

アクセスの設定は パブリックアクセスとして、アクセスポリシーを特定のIPのみ許可するように設定しています。

作成が完了したら、次はCloudWatch Logsの設定です。

CloudWatch Logsでサブスクリプションの設定

CloudWatch LogsをElasticsearch Serviceに転送するために、サブスクリプションを設定します。

Amazon ES クラスターに作成した「test-es」を指定します。 Amazon Elasticsearch Serviceに転送するために、「LogsToElasticsearch」というLambda関数が作成されます。

そのLambdaに設定するロールを指定し、「次へ」をクリックします。

ログの形式を「AWS CloudTrail」、 フィルターパターンを「Invoke」として「次へ」クリックします。

「Kibana4」をクリックし、アクセスできるか確認した後に、「ストリーミングの開始」をクリックします。

Kibanaでログ確認

とりあえず下記のようにインデックスパターンを設定しておきます。 実際に利用する場合、きちんと設定をしておきましょう。

「Discover」へいき、eventNameでフィルターをかけます。

Lambdaの実行アクティビティログが確認できます。

確認したいログをクリックすると実行されたLambdaのさまざまな情報が確認できます。 あとは、各々で自由にグラフ化することができます。

さいごに

ノンプログラミングで簡単にLambdaの実行ログをAmazon Elasticsearch Serviceへ配信することができました。

CloudTrailを経由することで、ログの形式や、フィルターパターンを考える手間を省くことができました。 また、Kibanaで可視化もできるので、Lambdaの監視に活用できそうですね。

誰かの参考になれば幸いです。