Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アプリケーションログ、 どう出力する?どう調査する?

khmoryz
October 17, 2023

アプリケーションログ、 どう出力する?どう調査する?

JAWS FESTA 2023 KYUSHU メイントラック登壇資料です。

JAWS FESTA 2023 KYUSHU公式サイト:
https://jft2023.jaws-ug.jp/

書き起こし記事:
https://engineers.fenrir-inc.com/entry/2023/10/17/221623

khmoryz

October 17, 2023
Tweet

Other Decks in Technology

Transcript

  1. この発表の前提 • 資料は後⽇公開します • 正確な情報の記載を⼼掛けていま すが、ご⾃⾝のシステムに導⼊す る際には必ず公式の情報を参照し てください • AWS上で動かすモノリシックアプ

    リケーションのシステムを前提と します。マイクロサービスの話はあ りません • 開発寄りの話が多くなりますが、 インフラ担当者に知ってほしい内 容です 3
  2. 問題は何か? • 調査に時間がかかったり、不具合が解消できずにユーザー満⾜度が落ちる ◦ 問い合わせが来たのは1⼈でも、問い合わせしない同じ症状のユーザーがもっとたくさんいる かもしれない ◦ 多くのユーザーは問い合わせをせず、サービスを使うのをやめてしまう ◦ 否定的なレビューが増えると、潜在的なユーザーまで失ってしまう

    • チームに⻑くいるシニアエンジニアの勘と経験頼り ◦ チームに⻑くいればいるほど価値を発揮できる。しかし、次のプロジェクトに移りたくても 抜けられない ◦ ジュニアエンジニアはいつまで経ってもシニアエンジニアを超えられない 8
  3. 問題は何か? • 調査に時間がかかったり、不具合が解消できずにユーザー満⾜度が落ちる ◦ 問い合わせが来たのは1⼈でも、問い合わせしない同じ症状のユーザーがもっとたくさんいる かもしれない ◦ 多くのユーザーは問い合わせをせず、サービスを使うのをやめてしまう ◦ 否定的なレビューが増えると、潜在的なユーザーまで失ってしまう

    • チームに⻑くいるシニアエンジニアの勘と経験頼り ◦ チームに⻑くいればいるほど価値を発揮できる。しかし、次のプロジェクトに移りたくても 抜けられない ◦ ジュニアエンジニアはいつまで経ってもシニアエンジニアを超えられない → オブザーバビリティが低い状態 9
  4. ログレベル • ログの重⼤度を⽰す • RFC5424での定義を引き継いでいるロギ ングライブラリが多い • ログレベルに対してどのような⾏動を取 るかを決める(例:Error発⽣時はメー ルでアラートを⾶ばし、業務時間内で解

    消を⽬指す) • 環境ごとに、どのレベル以上を出⼒する かを決めておく(例:開発環境は Debug、検証/本番環境はInfoなど) 13 引用:https://datatracker.ietf.org/doc/html/rfc5424
  5. 構造化ログの実現⽅法 PHPでは、MonologのJsonFormatterを導⼊するだけで対応可能。 JsonFormatter適⽤後 { "message": "Hello!", "context": {}, "level": 200,

    "level_name": "INFO", "channel": "local", "datetime": "2023-10-07T09:00:00.000000+09:00", "extra": {} } デフォルトのログフォーマット [2023-10-07 09:00:00] local.INFO: Hello! 16
  6. 構造化イベントに追加する情報を決める • リクエストコンテキスト ◦ パス ◦ メソッド ◦ ボディ ◦

    クライアントIP • レスポンスコンテキスト ◦ ステータスコード ◦ ボディ ◦ 経過時間 • 時刻 • ユーザーID • 実⾏サーバーID • 取引ID • ログレベル • 発⾏したクエリ、パラメーター • 外部連携システムへのリクエス ト/レスポンス 19 出せる限りの全ての情報を記録したい。しかし、パフォーマンス、コスト、 セキュリティの観点から、全てを記録することはできません。システムの状態 を理解するのに必要と思われるデータに絞り込みましょう。
  7. 構造化イベントログの流れ Request Request Response 処理開始ログ コンテキスト追加 ‧クライアントIP ‧トレースID 処理開始ログ コンテキスト

    ‧クライアントIP ‧トレースID 処理終了ログ ‧レスポンスボディ ‧ステータスコード ‧エラーメッセージ …など 処理開始ログ ‧ユーザーID ‧クライアントIP ‧トレースID …など 何らかの処理ログ ‧取引ID ‧問い合わせID …など 23 PHPではMonologのwithContextメソッドを呼ぶだけで、後続のすべてのログエ ントリに含めるコンテキスト情報を指定できる
  8. 選択肢1 Amazon Athena • S3上のファイルに標準SQLを実⾏ • サーバーレスのためインフラストラクチャ の管理が不要 • CSV、JSON、ORC、Avro、Parquet に対

    応 • ペタバイト規模まで対応可能 • 分析ようにデータ整形したい場合はAWS Glueを使⽤してETL処理が可能 26
  9. 選択肢2 Amazon CloudWatch Logs • CloudWatch Logs Insightsを使⽤してクエ リが可能(≠標準SQL) • クエリを使⽤しなくてもGUIからログの確

    認や全⽂検索が可能 • メトリクスフィルターによるアラーム実⾏ • Live Tailによるリアルタイム表⽰ • 機密データのマスキング 27
  10. 選択肢3 Amazon OpenSearch Service • OpenSearch クラスターの管理を容易にす るマネージドサービス • OpenSearchおよびElasticsearch OSSをサ

    ポート • サーバーレス版(オンデマンド⾃動ス ケーリング)も提供 • SQLやGUIで検索可能 • トレース分析 28
  11. 機能も違いますが、料⾦体系に⼤きな違いがあります。 • Athena ◦ S3保存費⽤+Athenaデータスキャン量(ざっくりいうと、格安) ▪ Athena • 5.00USD per

    TB of data scanned ▪ S3 Standard • 最初の 50 TB/⽉ 0.025USD/GB • 次の 450 TB/⽉ 0.024USD/GB • 500 TB/⽉以上 0.023USD/GB • CloudWatch Logs ◦ データ収集、保存、分析それぞれ従量課⾦(ざっくりいうと、データ⼊れれば⼊れるほどコスト上昇) ▪ 収集 (データの取り込み) 0.76USD/GB ▪ 保存 (アーカイブ) 0.033USD/GB ▪ 分析 (Logs Insights のクエリ) スキャンしたデータ 1 GB あたり 0.0076USD ▪ 検出およびマスク (データ保護) スキャンされたデータ 1 GB あたり 0.12USD ▪ 分析 (Live Tail) 0.01 USD/分 • OpenSearch Service ◦ インスタンス費⽤とEBS費⽤(ざっくりいうと、ほぼ固定費) ▪ インスタンス費⽤(EC2よりも割⾼) • t3.medium.search vCPU2 メモリ4GiB 0.112USD ▪ EBS費⽤(EC2よりも割⾼) • 汎⽤ SSD (gp3) - ストレージ 1 GB あたり 0.1464USD/⽉ 料⾦⽐較 29 ※2023年10⽉時点の東京リージョンの料⾦