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/{ステージ名}