CloudWatchLogs連携で、ElasticSearchサブスクリプションフィルターを作成します。
今回は、以下の流れでElasticSearchにログを記録しています。
①Lambda関数を指定したAPIGatewayにWebリクエストをする。
②Lambda関数が呼び出された際にeventをCloudWatchLogsに記録する。
③CloudWatchLogsのログ記録をトリガーに、サブスクリプションフィルターが動いてElasticSearchに記録する。
・下記を参考に、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) }
・下記を参考に、「Lambdaプロキシ統合の使用」を選択して作成します。
Aws/APIGateway/Lambdaプロキシ統合の使用
APIGateway/Lambda関数の呼び出し
以下の形式のカスタムポリシーをアタッチしたロールを作成します。
別途作成されるLambda関数に割り当てるので、信頼関係はLambdaを指定します。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "es:*" ], "Effect": "Allow", "Resource": "arn:aws:es:region:account-id:domain/target-domain-name/*" } ] }
事前準備した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 ※任意文字列
今回はコマンドプロンプトから呼び出しました。うおおおぉお!!
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/{ステージ名}