Blog

ALBのアクセスログを利用してサービスの信頼性を可視化してみた

はじめに

はじめまして。ニフティ新卒4年目の内海です。 社内でSRE活動が浸透し始めており、その活動の一環としてSLI/SLOという概念を利用したサービスの信頼性を可視化する動きが広まっています。 本題に入る前に簡単にSLI/SLOについてご説明したいと思います。

SLI (Service Level Indicator)

日本語ではサービスレベル指標と要約できますが、一般的には以下の指標を利用することが多いです。
  • 可用性
  • エラー
  • システムスループット
  • リクエストのレイテンシ 
例えば可用性のSLIについてより具体的な表現に直すと

対象サービス (機能)の30日間のリクエスト成功率が99.9%

のようなイメージです。 可用性とはシステムが継続して稼働できる能力のことです。サービス提供が不可能になる時間が少なく、安定して利用することができるサービスは可用性が高いと言えます。つまり、可用性が高いサービスは信頼性が高いサービスであると言えます。

SLO (Service Level Objective)

SLIの説明で挙げた各指標に対しての目標数値になります。 例えば

対象サービス (機能)の30日間のリクエスト成功率が99.9%

のように99.9%という具体的な数値目標がSLOになります。 SLI/SLOを設定するメリットとしては以下が挙げらます。

サービス品質の見える化のため

SLI/SLOを設定することで「お客様がサービスを利用できているか」が数値として可視化されるようになります。サービスの状態が明確に分かるようになり、お客様への影響が素早く発見できるようになります。

SLOドリブンな開発を行うため

SLOを設定することでSLOを上回っている場合は継続的な開発を行い、SLOを下回っている場合は開発をストップして信頼性の改善を行うといったように、どちらを優先すべきか判断することができます。具体的にはSLOに基づいて算出されるエラーバジェットによって決まります。 エラーバジェットとは「サービスの信頼性がどの程度損なわれても許容できるか」を示す指標になります。例えばSLOを99.9%と定義した場合は0.1%がエラーバジェットになります。

100% – SLO(99.9%) = 0.1%

時間に直すと1ヶ月を30 日間とした場合の許容ダウンタイムは 43 分です。 1ヶ月の内、ダウンタイムが43分未満であれば開発を行い、43分を超えた場合に開発を中断してダウンタイムを減らすことに注力するといったイメージです。

目的

本記事ではある特定のページに対しての可用性がどの程度かをApplication Load Balancerのログを利用して可視化する手順をご紹介します。可用性を可視化してサービスの信頼性を計測することが目的です。

構成図

基本的には以下の構成を前提としています。
  • WEBサーバーの手前に Application Load Balancer が配置されている
  • Application Load BalancerのアクセスログがS3に保存されている

利用するAWSサービスの紹介

Amazon Simple Storage Service (Amazon S3)

Amazon Simple Storage Service (Amazon S3) は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、およびパフォーマンスを提供するオブジェクトストレージサービスです。ALBのログの格納先として利用します。

引用 – https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Welcome.html

AWS Lambda

Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。Lambdaを利用してS3に格納されているアクセスログを抽出・整形します。

引用 – https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

Amazon CloudWatch 

AWSが提供するフルマネージド運用監視サービスになります。CloudWatchに搭載された以下の機能を利用して可視化を実現します。

メトリクスフィルタ

ログデータから特定の文字列をフィルタリングする機能です。 Lambdaでアクセスログを抽出・整形したログがCloudWatch Logsに出力されるようになっているので、ログをフィルタリングしてメトリクスを作成します。

Amazon CloudWatch ダッシュボード

CloudWatchダッシュボードを使用することでAWS リソースのメトリクスを表示することができます。メトリクスフィルタによって作成されたメトリクスを可視化させる際に利用します。

作成手順

Lambdaの作成

S3に格納されているアクセスログを抽出・整形を行うLambda関数を作成します。
「lambda_handler(event, context):」 の処理の流れですが、S3から取得したALBのアクセスログを「parse_alb_log()」でパースします。
パース後のALBのアクセスログから「request_url」を取得して「search()」で検索をかけています。 今回は例として「http://example.com/list/index.html」へのリクエストに対する可用性を可視化します。なので「list」という文字列を含むURLの場合のみログとして出力するようにします。 出力されるログ形式は以下のようになっています。 ALBのアクセスログがS3に配置されたタイミングでLambdaを発火させるようにしたいのでトリガー設定もします。

イベントタイプは「ObjectCreatedByPut」としています。また、アクセスログの拡張子は「.gz」なのでサフィックスに設定しています。

メトリクスフィルタの設定

メトリクスフィルタを利用してLambdaによって出力されたログから以下のメトリクスを作成していきます。
  • 5xxRequestCount
    • 「http://example.com/list/index.html」に対しての50xリクエスト数
  • TotalRequestCount
    • 「http://example.com/list/index.html」に対しての総リクエスト数
CloudWatchのロググループからメトリクスフィルタを作成することができます。 LambdaのログはCloudWatch Logsに出力されているようになっているので該当のロググループ名 (今回は「/aws/lambda/slo-test-function」)を選択し、メトリクスフィルタの設定を行っていきます。
今回は2つのメトリクスを作成するので、メトリクスフィルタを2つ作成します。 ログに出力された「request_url」と「target_status_code」の2つの値を利用してフィルターを設定していきます。 5xxRequestCountFilterでは以下のフィルターパターンを設定しました。条件としては「listの文字列を含むurl」かつ「ステータスコードが50x」にしています。
TotalRequestCountFilterでは総リクエスト数を抽出したいのでステータスコードの条件は外しています。
メトリクスフィルタ設定後、試しにS3バケットにALBのログを配置したところLambdaが発火してメトリクスフィルタによってメトリクスが作成されました。

CloudWatchダッシュボードの設定

最後にメトリクスフィルタによって作成されたメトリクスをCloudWatchダッシュボード上に表示させるようにします。 ダッシュボードの作成方法についてはAWSの公式ドキュメントに書いてあるのでご参照ください。 作成した2つのメトリクスを利用して可用性 (総リクエスト数の内の50xリクエスト数以外の割合)を算出します。
上記で算出した値をCloudWatchダッシュボード上に反映させて完成です。

おわりに

今回はSLIの指標の一つである可用性の可視化にスポットを当てて紹介しました。 何か特定のページに対しての可用性を数値で表したいケースは参考になるかと思います。 ALBのログにはレスポンスタイムの値も含まれているのでメトリクスフィルタを上手く活用すれば リクエストのレイテンシ (リクエストに対してレスポンスを返すまでにかかった時間)も可視化できるので、SLIの指標に含めている方は是非試してみてください!

参考