三歩あるけば物も忘れる

お腹のお肉がメタボックル

ユーザ用ツール

サイト用ツール


Aws:ElasticSearch:CloudWatchLogsIntegration

10.CloudWatchLogs連携

CloudWatchLogs連携で、ElasticSearchサブスクリプションフィルターを作成します。

今回は、以下の流れでElasticSearchにログを記録しています。
①Lambda関数を指定したAPIGatewayにWebリクエストをする。
②Lambda関数が呼び出された際にeventをCloudWatchLogsに記録する。
③CloudWatchLogsのログ記録をトリガーに、サブスクリプションフィルターが動いてElasticSearchに記録する。

事前準備

Lambda関数の作成

・下記を参考に、CloudWatchLogsのRecordが分割されないようにloggingを使用します。
Aws/Lambda/サンプルイベントが欲しい時#Loggerで出力する
Webリクエストのレスポンスも欲しいので、下記のコードとなります。

import json
import logging

logger = logging.getLogger()
logger.setLevel('INFO')

def lambda_handler(event, context):
    jsn_str = event
    logger.info(json.dumps(jsn_str, ensure_ascii=False, indent=2))
    
    return {
        'isBase64Encoded': False,
        'statusCode': 200,
        'headers': {},
        'body': json.dumps(jsn_str, ensure_ascii=False, indent=2)
    }

APIGatewayの作成

・下記を参考に、「Lambdaプロキシ統合の使用」を選択して作成します。
Aws/APIGateway/Lambdaプロキシ統合の使用
APIGateway/Lambda関数の呼び出し

ElasticSearchサブスクリプションフィルター用のロール作成

以下の形式のカスタムポリシーをアタッチしたロールを作成します。
別途作成されるLambda関数に割り当てるので、信頼関係はLambdaを指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "es:*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:es:region:account-id:domain/target-domain-name/*"
        }
    ]
}

ElasticSearchサブスクリプションフィルターの作成

事前準備したAPIGatewayにWebリクエストをすると、CloudWatchLogsにLambda関数のログが作成されます。

手順

①メニュー操作

ElasticSearchに格納するLambda関数のロググループを開き、[アクション]-[サブスクリプションフィルター]-[ElasticSearchサブスクリプションフィルターを作成]を選択します。

②詳細設定

[ElasticSearchサブスクリプションフィルターを作成]の画面が開くので、以下の情報を入力し、[ストリーミングを開始]をクリックします。

■送信先を選択
・アカウントを選択:This account
・Amazon ES cluster:ElasticSearchのクラスターを選択
・Lambda IAM Execution Role:ElasticSearchサブスクリプションフィルター用のロールを選択

■ログ形式とフィルターを設定
・ログの形式:JSON ※記録されるログ形式によります。
・サブスクリプションフィルターのパターン:{ $.httpMethod = “*” } ※フィルタする文字列によります。(今回は、Lambda関数からloggerで記録したRecordだけフィルタしたかったので)
・サブスクリプションフィルター名:Elasticsearch ※任意文字列

■パターンをテスト
入力値は無いです、必要に応じて[パターンをテスト]。

ElasticSearchへデータ格納用のLambda関数

[ElasticSearchサブスクリプションフィルター]が正常に作成されると、下記のようなLambda関数が作成されます。
・LogsToElasticsearch_{クラスター名}

動作確認

APIGatewayのWebリクエスト

今回はコマンドプロンプトから呼び出しました。うおおおぉお!!

curl -XGET https://{API-ID}.execute-api.ap-northeast-1.amazonaws.com/{ステージ名}
curl -XPUT https://{API-ID}.execute-api.ap-northeast-1.amazonaws.com/{ステージ名}
curl -XPUT ​https://{API-ID}.execute-api.ap-northeast-1.amazonaws.com/{ステージ名}
curl -XGET https://{API-ID}.execute-api.ap-northeast-1.amazonaws.com/{ステージ名}

Kibanaコンソールの確認

無事格納されていました。
JSON形式のデータは、要素ごとに分解して記録してくれるんですね。
Kibanaはまだ初心者なので、理解したら別途扱い方を記載しようと思います。
 

Aws/ElasticSearch/CloudWatchLogsIntegration.txt · 最終更新: 2021/06/28 by 127.0.0.1