NEWSニュース&ブログ

[Amazon Elasticsearch Service]複数のLogGroupからStreaming

この記事は最終更新から7年以上経過しています。内容が古くなっている可能性があります。
  • 投稿日:2017/5/9

    複数のロググループから単一の「Amazon Elasticsearch Service」ドメインに
    ストリーミングする方法

    こんにちは。クラウドコンサルティング事業部の関口です。
    今回は、CloudWatchログ の複数のロググループを単一の「Amazon Elasticsearch Service」(以降、Amazon ES)に ストリーミングする方法です。
    CloudWatch Logs のロググループを Amazon ESにストリーミングする場合、Index が全て”cwl-YYYY.MM.DD”となります。
    その為、複数の ロググループを単一の Amazon ESドメインにストリーミングした場合、同じ Index に複数のロググループのログが混在してしまいます。 このような状態ですとKibanaで確認した時にどのロググループのログなのかわからなくなってしまします。 この状態を回避する為、Amazon ESドメイン作成時に自動生成される Lambda Function を修正し、別々のIndexが作成されるようにします。 そうすることで、Kibanaで確認する時にどのロググループのログなのかフィルタをかけることができます。

    やりたい事

    ① EC2からApacheのアクセスログ(access_log、ssl_access_log)をCloudWatchログに送信
    ② CloudWatchログ の複数のロググループをAmazon ESにストリーミング
    ③ Amazon ESドメインにデプロイされているKibanaでログを確認する

    前提条件

    ・EC2にAapcheのインストール 、設定とmod_ssl設定は設定済みであること
    ・EC2にCloudWatchログエージェントのインストール、設定済みであること
    ・ロググループ名を、access_logは”apache-access_log”,ssl_access_logは”apache-access_log”とします
    ・Amazon ESは作成済みで、クラスターのドメイン名は”test-env”とします

    Amazon ESへストリーミング

    CloudWatchログのロググループに送信したApacheのアクセスログをAmazon ESにストリーミングし、サブスクリプションフィルタを作成します。まず、ロググループ”apache-access_log”のサブスクリプションフィルタを作成し、次にロググループ”apache-ssl_access_log”のサブスクリプションフィルタを作成します。


    1.AWSマネジメントコンソール「CloudWatch」の画面でロググループを選択し、”Amazon Elasticsearch Serviceへの
    ストリーミング開始”をクリックします。

    2.Amazon ESのクラスターとLambdaの実行ロールを選択し「次へ」をクリックします。

    ※事前にロールを作成していない場合は「新しいIAMロールを作成」を選択し自動生成することが可能。

    3.ログの形式を”共通のログファイル形式”とし、フィルターパターンはデフォルトのままで「次へ」をクリックします。

    ※Apacheのログをカスタマイズしている場合は、フィルタパターンを修正してください。

    4.内容を確認し「次へ」をクリックします。

    5.「ストリーミングの開始」をクリックします。

    6.ストリーミングが開始され、サブスクリプションフィルタが作成されます。

    もう一つのロググループについても同じ手順でサブスクリプションフィルタを作成します。Lambda実行ロールを選択するところでは「すでに存在する。」ということで選択できないのでそのまま「次へ」をクリックしてください。

    Lambda関数の修正

    サブスクリプションフィルタ作成時にLambda関数が自動で作成されます。 自動作成されたものは、”access_log”用のLambda関数とするため修正します。


    1.自動作成されたLambda関数をクリックします。

    2.コードはのちほど使用するので、テキストにコピーしておきます。

    3.コード内容にデフォルトのIndex”cwl-YYYY.MM.DD”が記載されています。”access_log”、”ssl_access_log”のIndexを分けるため、以下のように修正し「保存」をクリックします。

    62-67行目あたり
        payload.logEvents.forEach(function(logEvent) {
            var timestamp = new Date(1 * logEvent.timestamp);
    
            // index name format: cwl-YYYY.MM.DD
            var indexName = [
                'apache-access_log-' + timestamp.getUTCFullYear(),// year <--- "cwl-"を左記のように修正
                ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
                ('0' + timestamp.getUTCDate()).slice(-2)          // day
            ].join('.');
    

    4.”ssl_access_log”を処理するトリガーは不要ですので削除します。

    Lambda関数の作成

    “access_log”用のLambda関数を参考に”ssl_access_log”用のLambda関数は新規に作成します。 コード内のIndexとトリガー以外は全て同じで良いです。 先ほどテキストにコピーしておいたコードをコード入力欄に張り付け、Indexは”ssl_access_log”用に以下のようなIndexにしました。
    62-67行目あたり
        payload.logEvents.forEach(function(logEvent) {
            var timestamp = new Date(1 * logEvent.timestamp);
    
            // index name format: cwl-YYYY.MM.DD
            var indexName = [
                'apache-ssl_access_log-' + timestamp.getUTCFullYear(),// year <--- "cwl-"を左記のように修正
                ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
                ('0' + timestamp.getUTCDate()).slice(-2)          // day
            ].join('.');
    

    トリガーは”ssl_access_log”用に設定しました。※ロググループ”apache-ssl_access_log”を指定。

    Kibanaで確認

    Amazon ESにストリーミングしたApacheログをKibanaで確認します。

    1.Amazon ESドメインのKibanaのリンクをクリックします。

    2.Indexを設定する画面が表示されるので[index name or pattern]に”apache-*”(Index共通部分のワイルドカード)を入力し、「Create」をクリックします。

    3.メニューの「Discover」をクリックするとストリーミングされたApacheログがまとめてグラフ表示されます。

    [Available Fields]の”@log_group”でフィルタをかけることで”access_log”,”ssl_access_log”のどちらかのみ表示させることも可能です。 以上です。それではまた次回。

    参考URL

    ・CloudWatch Logs サブスクリプションフィルタの使用 http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#LambdaFunctionExample