~~NOCACHE~~ ## 10.CloudWatchLogs連携 CloudWatchLogs連携で、ElasticSearchサブスクリプションフィルターを作成します。 今回は、以下の流れでElasticSearchにログを記録しています。 ①Lambda関数を指定したAPIGatewayにWebリクエストをする。 ②Lambda関数が呼び出された際にeventをCloudWatchLogsに記録する。 ③CloudWatchLogsのログ記録をトリガーに、サブスクリプションフィルターが動いてElasticSearchに記録する。 ## 事前準備 ### Lambda関数の作成 ・下記を参考に、CloudWatchLogsのRecordが分割されないようにloggingを使用します。 [[Aws:Lambda:WantSampleEvent#Loggerで出力する|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:UsingLambdaProxy|Aws/APIGateway/Lambdaプロキシ統合の使用]] [[Aws:APIGateway:CallingLambdafunction|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サブスクリプションフィルターを作成]を選択します。 {{:Aws:ElasticSearch:pasted:20210629-154128.png?direct 800x0}} #### ②詳細設定 [ElasticSearchサブスクリプションフィルターを作成]の画面が開くので、以下の情報を入力し、[ストリーミングを開始]をクリックします。 ■送信先を選択 ・アカウントを選択:This account ・Amazon ES cluster:ElasticSearchのクラスターを選択 ・Lambda IAM Execution Role:ElasticSearchサブスクリプションフィルター用のロールを選択 {{:Aws:ElasticSearch:pasted:20210629-154752.png?direct 400x0}} ■ログ形式とフィルターを設定 ・ログの形式:JSON ※記録されるログ形式によります。 ・サブスクリプションフィルターのパターン:{ $.httpMethod = "*" } ※フィルタする文字列によります。(今回は、Lambda関数からloggerで記録したRecordだけフィルタしたかったので) ・サブスクリプションフィルター名:Elasticsearch ※任意文字列 {{:Aws:ElasticSearch:pasted:20210630-104234.png?direct 400x0}} ■パターンをテスト 入力値は無いです、必要に応じて[パターンをテスト]。 {{:Aws:ElasticSearch:pasted:20210629-160455.png?direct 400x0}} ### ElasticSearchへデータ格納用のLambda関数 [ElasticSearchサブスクリプションフィルター]が正常に作成されると、下記のようなLambda関数が作成されます。 ・LogsToElasticsearch_{クラスター名} {{:Aws:ElasticSearch:pasted:20210629-160213.png?direct 600x0}} ## 動作確認 ### 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:pasted:20210629-161545.png?direct 400x0}} {{:Aws:ElasticSearch:pasted:20210629-161730.png?direct 400x0}} {{tag>AWS ElasticSearch}}