Slide 1

Slide 1 text

ALBのアクセスログをAthenaで分析して SLOをゆるく決める 2023-10-18 JAWS-UG SRE支部 #7 AWSでゆるSRE!LT大会 https://jawsug-sre.connpass.com/event/291843/ ENECHANGE株式会社 VPoT兼CTO室マネージャー 岩本隆史 (iwamot)

Slide 2

Slide 2 text

「SLO決められない」問題 SREに取り組んでいく方針になりました。ゴールを設定して計画的に進めていく ために、まずは設計段階としてSLIと、できればSLOを定めようと思います。 しかしこのSLIとSLOがなかなか決まらず、設計フェーズから実装フェーズに進め られません。 どうしたらスムーズにSLIとSLOが決まりますか? https://x-tech5.co.jp/2023/09/05/828/

Slide 3

Slide 3 text

僭越ながらアドバイス

Slide 4

Slide 4 text

ALBを使ってるなら、Athenaで分析してみては?

Slide 5

Slide 5 text

ぼくの実例

Slide 6

Slide 6 text

可用性分析クエリを実行

Slide 7

Slide 7 text

GETばかりでつまらない

Slide 8

Slide 8 text

POSTに絞って再実行

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

最多リクエストのエンドポイントに対して 実績値を満たす可用性SLOを決める POST /endpoint1 の可用性:28日間で99.9%以上

Slide 11

Slide 11 text

レイテンシ分析クエリも実行(POSTのみ)

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

同様にレイテンシSLOも決める POST /endpoint1 のレイテンシ:2.8秒以内が28日間で95%以上 POST /endpoint1 のレイテンシ:1.8秒以内が28日間で50%以上

Slide 14

Slide 14 text

こんなふうに数分で決めてます

Slide 15

Slide 15 text

ゆるすぎる?

Slide 16

Slide 16 text

決められないよりはマシ!

Slide 17

Slide 17 text

注意:クエリ実行にはログテーブルが必要

Slide 18

Slide 18 text

ログテーブルの作り方はドキュメントを参照 前提条件(ALBアクセスログ有効化 + Glueデータベース準備) パーティション射影を使用した Athena での ALB ログ用のテーブルの作成 ALB ログのクエリ例 https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer- logs.html

Slide 19

Slide 19 text

まとめ

Slide 20

Slide 20 text

SLO、ゆるく決めてもいいじゃない ALBを使ってるなら、Athenaで分析してみては? 決められないよりはマシ! ログテーブルの作り方はドキュメントを参照

Slide 21

Slide 21 text

付録:コピペ用クエリ

Slide 22

Slide 22 text

可用性分析 SELECT http_method, path, count(*) AS total_count, count_if(is_bad_for_availability) AS bad_count, 100.0 * (count(*) - count_if(is_bad_for_availability)) / count(*) AS availability FROM ( SELECT request_verb AS http_method, url_extract_path(request_url) AS path, (elb_status_code >= 500 OR elb_status_code = 429) AS is_bad_for_availability FROM [ログテーブル名] WHERE day >= date_format(date_add('day', -28, current_timestamp), '%Y/%m/%d') AND from_iso8601_timestamp(time) >= date_add('day', -28, current_timestamp) ) t GROUP BY http_method, path ORDER BY count(*) DESC LIMIT 10

Slide 23

Slide 23 text

レイテンシ分析 SELECT http_method, path, count(*) AS total_count, approx_percentile(latency, 0.5) AS latency_p50, approx_percentile(latency, 0.95) AS latency_p95 FROM ( SELECT request_verb AS http_method, url_extract_path(request_url) AS path, request_processing_time + target_processing_time + response_processing_time AS latency FROM [ログテーブル名] WHERE day >= date_format(date_add('day', -28, current_timestamp), '%Y/%m/%d') AND from_iso8601_timestamp(time) >= date_add('day', -28, current_timestamp) AND (elb_status_code < 500 AND elb_status_code <> 429) AND (request_processing_time + target_processing_time + response_processing_time) > 0 ) t GROUP BY http_method, path ORDER BY count(*) DESC LIMIT 10