~~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}}