Sumo Logic に CloudWatch Logs のログを送信してみる
今日は CloudWatch Logs でログを収集していた場合に、Sumo Logic にログを送信する方法をご紹介したいと思います。
CloudWatch Logs 側にログが送られているので、こちらを Sumo Logic に送信していきたいと思います。
CloudWatch Logs から Sumo Logic にログを送信する方法はいくつかありますが、パフォーマンス料金のバランスを考えると Firehose Data Kinesis での連携が良いのでそちらで設定していきます。
※当ブログ内容は、基本的にこちらの公式ドキュメントの情報をもとに作成しています。
まずはじめに、ログを送信したい CloudWatch Logs を確認します。今設定されている下記のログを連携していきます。
Kinesis Data Firehose のデータ送信イメージ
データ送信のイメージ図は下記のようになります。
Sumo Logic のコンソールで Source の設定
Sumo Logic にログインして、左ペーンの Manage Data > Collection から Hosted Collector 上で Add Source を選択していきます。(もし、まだ Hosted Collector の設定をしていない場合は、下記のブログの「1. Sumo Logicで、Hosted Collectorの作成」を参考に設定してください。)
Source の選択では AWS Kinesis Firehose for Logs を選択します。
Source の名前と Source Category を設定します。Kinesis がデータ送信を失敗した時に S3 に失敗したデータを格納させることができるので、失敗時に Sumo Logic から S3 にポーリングさせたい場合は Enable S3 Replay をチェックして有効化しますがこちらの設定は後ほど実施するので、まずはチェックを外したまま進めます。
それ以外はデフォルトのチェックのまま Save します。
その設定が終わると、Kinesis Data Firehose でログを送信する宛先となる Sumo Logic 側のエンドポイントが表示されるのでコピーしておきます。
AWS のコンソールで Kinesis Data Firehose の設定
AWS のコンソールにログインして Kinesis Data Firehose のリソースの作成および設定をしていきます。この設定については、Sumo Logic が CloudFormation のテンプレートを用意しているので、こちらを使います。
テンプレートをダウンロードして、AWS CloudFormation で設定していきます。
パラメータを入力する箇所があるので、入力します。
Sumo Logic AWS Kinesis Firehose for Logs Source URL
のところでは、前の設定でコピーした、エンドポイントのURLを入力します。AWS S3 Bucket Name for Failed Data
のところでは、Kinesis Data Firehose がログの転送を失敗した場合に、バックアップとして保管する S3 のバケットになります。バケット名はユニークな名前である必要があるので、適当なハッシュ値、日付や用途などを含めてユニークになるように設定します。またログはSumoLogic-Kinesis-Failed-Logs/
のフォルダの中に出力されるようになることが書かれています。
そのままスタックを実行して、正常に終了したことを確認します。
CloudWatch Logs にサブスクリプションフィルターの設定
CloudWatch Logs が Kinesis Data Firehose にアクセスするためのロールの設定をします。
IAM の画面でロールを作成します。
下記のような信頼関係を設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
ポリシーはマネージドポリシーの「AmazonKinesisFirehoseFullAccess」を設定しました。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "firehose:*" ], "Effect": "Allow", "Resource": "*" } ] }
次に CloudWatch Logs で対象の Log groups のサブスクリプションフィルターの設定をします。
Kinesis Firehose のサブスクリプションフィルターを作成します。
作成している Delivery streams とロールを選択して、サブスクリプション名を入力します。
後は、出来ていることを確認します。
Sumo Logic のソースの設定で Kinesis Data Firehose ログ配信エラー時のデータ取得設定
Sumo Logic のソース設定で、チェックを外していた Enable S3 Replay を有効化していきます。Manage Data > Collection から先程つくったソースを編集します。
Enable S3 Replay をチェックして有効化して、S3リージョン、バケット名、パスを入力します。パスは、CloudFormation で Kinesis Data Firehose のリソースを作った時の配信エラーの時の S3 のフォルダ名と、http-endpoint-failed/
を含めるように書かれていますので、そのように指定します。
Enable S3 Replay を有効化すると、AWS Access という設定項目が現れています。ここでは、Sumo Logic が S3 へアクセスするためのロールの設定を行います。Generate role-based access template
をクリックすると、CloudFormation のテンプレートがダウンロードできます。
再度、AWS コンソールにログインして、CloudFormation の Stack を作成していきます。先程のダウンロードしたテンプレートを指定し、Stack名を入力したら後はデフォルトで実行します。
AWS の CloudFormation の実行が正常に完了したことを確認して、作成されたロールの ARN をコピーします。
もう一度、Sumo Logic のコンソールに戻って、ソースの設定を続けます。Role ARN を入力して、Kinesis Data Firehose の配信エラーのバケットを見に行くスキャン間隔を設定します。今回は1時間に設定して、Save で設定を確定させます。
Kinesis Data Firehose のデータ転送確認
Sumo Logic と AWS での設定が完了したので、正しくデータが送られてくるか確認してみます。
CLIからデータを送信してみます。
aws firehose put-record --delivery-stream-name Kinesis-Logs-30008250 \ --record '{"Data":"SGVsbG8gd29ybGQ="}'
Sumo Logic でデータを検索すると、きちんとデータが送信されていることが確認できました。
続いて、配信エラーになっている状態を確認してみます。Kinesis の Delivery streams で送る先のエンドポイントを無効なものに変更してみます。
再度CLIからデータを送信します。
aws firehose put-record --delivery-stream-name Kinesis-Logs-30008250 \ --record '{"Data":"SGVsbG8gd29ybGQ="}'
すると、S3 に配信されなかったデータが流れてきます。
Sumo Logic で確認してみるともう一行ログが入ってきたのがわかります。こちらが、配信が失敗していたログを S3 へのポーリングによって回収したものになります。
CloudWatch Logs のデータが取り込まれていることを確認
最後に、CloudWatch Logs に出力されたデータを Sumo Logic に連携されることを確認します。こちらのログが CloudWatch Logs にはかれたので、Sumo Logic で取り込めているか確かめます。
無事にとりこまれていることが確認できました。
まとめ
いかがでしたでしょうか。CloudWatch Logs を Sumo Logic にログを配信していくのに、Kinesis Data Firehose を使って連携してみました。だれかの参考になれば幸いです。