現在作成中のAlexaスキルにログ基盤を構築しています。
今回は技術情報ではなく、進捗状況をお話させて頂けたらと思います。
AWSマネージドサービスのログ基盤との出会い
インフラ部分をもっと充実させたいと思い、調べてみたら以下の記事が見つかった。
クラスメソッド、Amazon Alexaスキルのフルマネージドサービスを提供開始
〜音声インタフェースの設計開発から運用時の継続的なユーザー体験の改善までサポート〜
ログは普段の業務でも障害解析のために利用したりしているが、AWSでログ基盤を構築すると何ができるのか興味が出てきたため、ログ基盤構築に取り掛かることにした。
構成
上記構成で構築することを考えた。
特にSQLでログを検索できる(Athana)のは、普段から業務でSQLを触っている者としては非常に魅力的に感じた。
課題
しかし、事はそう簡単に行かず、2つの課題に直面した。
1. CloudWatchのログをFirehoseで読み込む際にエラーが発生
- エラー内容 :
Encountered malformed JSON. Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens at [Source: com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream@5b2f3ec7; line: 1, column: 2]
- 原因 : AWSサポートに問い合わせたところ、Firehoseの入力データ形式をJSONにしなければならないとの事。
- 解決策 : CloudWatchのログをJSONに変換するために別のAWS Lambdaを用意する必要がある事 を教えてもらった
2. AWS Lambdaで変換したログをFirehoseで読み込む際にエラーが発生
- エラー内容 :
Encountered malformed JSON. Unrecognized token 'START': was expecting ('true', 'false' or 'null') at [Source: com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream@3257c660; line: 1, column: 7]
-
手順
(1) Lambdaで関数を追加
関数の作成 -> 設計図の使用 -> kinesis-firehose-cloudwatch-logs-processor を選択
(2) firehoseの設定(Transform source records with AWS Lambda)で上記Lambda関数を設定 -
原因 : AWSLambda関数kinesis-firehose-cloudwatch-logs-processorだけではCloudWatchのログの形式を変換できず、データの解析、レコード形式の変換時にエラーが発生
-
解決策
(1) CloudWatch Logsから送信されたレコードから、個々のログイベントを解析して抽出
(2) 出力したい構造に合わせたJSON形式に変換
上記の1についてはAWSLambda関数kinesis-firehose-cloudwatch-logs-processorで実装されているため、2を実現するためには、kinesis-firehose-cloudwatch-logs-processorを編集する
現状
まだ、JSON形式に変換するためのAWS Lambdaを作成中です。
構成を考えた当初は設定だけでログ基盤を構築できると思ったが、現実はそう甘くないみたいです。
この続きはまた次回に投稿したいと思います。