Slide 1

Slide 1 text

AthenaとCloudWatchで始める 低コストなSLOエラーバジェット監視 2023-06-24 Reject Day 2023 https://connpass.com/event/282843/ ENECHANGE株式会社 CTO室 インフラエンジニア兼SRE 岩本隆史 (iwamot)

Slide 2

Slide 2 text

こんな人    

Slide 3

Slide 3 text

伝えたいこと 1. SLOエラーバジェット監視は有益 2. 監視ツールの利用がベストとは限らない 3. AWSサービスだけで監視してみよう 4. 実際に低コストで運用できている

Slide 4

Slide 4 text

SLOエラーバジェット監視は有益

Slide 5

Slide 5 text

低信頼性はビジネスリスク 信頼性は、アプリケーションの最も重要な機能です。アプリケーションの信頼性 が低いと、最終的にはユーザーが離れてしまい、他の機能はすべて意味をなさな くなります。 https://cloud.google.com/architecture/framework/reliability?hl=ja

Slide 6

Slide 6 text

信頼性の目標=SLO サービスレベル目標(SLO)は、サービスの信頼性の目標レベルを指定します。 https://cloud.google.com/architecture/framework/reliability/principles? hl=ja#service_level_objective_slo

Slide 7

Slide 7 text

エラーバジェット=100%-SLO エラー バジェットは、一定期間における 100% – SLO として計算されます。 https://cloud.google.com/architecture/framework/reliability/principles? hl=ja#error_budget

Slide 8

Slide 8 text

バーンレート=消費速度 SLO のバーンレートとは、障害が発生してから、ユーザーがエラーの影響を受 け、エラー バジェットがすべて消費されるまでの速度を表します。 https://cloud.google.com/architecture/adopting-slos?hl=ja#slo_burn_rate

Slide 9

Slide 9 text

複数バーンレートの監視が推奨 私たちの経験では、複数のバーンレートに基づくアラートはSLOベースのアラー トを実装する上で強力な方法であることが分かりました。

Slide 10

Slide 10 text

複数バーンレートの監視が推奨 重要度 長期ウィンドウ 短期ウィンドウ バーンレート エラーバジェットの消費 ページ 1時間 5分 14.4 2% ページ 6時間 30分 6 5% チケット 3日間 6時間 1 10%

Slide 11

Slide 11 text

複数バーンレートの監視が推奨 expr: ( job:slo_errors_per_request:ratio_rate1h{job="myjob"} > (14.4*0.001) and job:slo_errors_per_request:ratio_rate5m{job="myjob"} > (14.4*0.001) ) or ( job:slo_errors_per_request:ratio_rate6h{job="myjob"} > (6*0.001) and job:slo_errors_per_request:ratio_rate30m{job="myjob"} > (6*0.001) ) severity: page

Slide 12

Slide 12 text

監視ツールの利用がベストとは限らない

Slide 13

Slide 13 text

ある有名ツールは月10万円の見積 ・ご請求額  ¥1,213,080 (年額)  ※税抜きとなります。¥101,090 (月額)

Slide 14

Slide 14 text

New Relicは集計期間が短い 評価期間は、最大 2 時間のデータの集計をサポートします。 https://docs.newrelic.com/jp/docs/service-level-management/alerts-slm/

Slide 15

Slide 15 text

社内実装も一考の価値あり 監視ツール 社内実装 コスト △ ○ 柔軟性 △ ○ 実装工数 ○ △

Slide 16

Slide 16 text

Frugality(倹約)は大事 Frugality 私たちは少ないリソースでより多くのことを実現します。倹約の精神は創意工 夫、自立心、発明を育む源になります。スタッフの人数、予算、固定費は多けれ ばよいというものではありません。 https://www.aboutamazon.jp/about-us/leadership-principles

Slide 17

Slide 17 text

AWSサービスだけで監視してみよう

Slide 18

Slide 18 text

複合アラームで条件式を実装 特定の条件を満たす場合に、基盤となるメトリクスのアラームが ALARM 状態に なる複合アラームを作成できます。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Create_Com posite_Alarm.html

Slide 19

Slide 19 text

複合アラームで条件式を実装 expr: ( job:slo_errors_per_request:ratio_rate1h{job="myjob"} > (14.4*0.001) and job:slo_errors_per_request:ratio_rate5m{job="myjob"} > (14.4*0.001) ) or ( job:slo_errors_per_request:ratio_rate6h{job="myjob"} > (6*0.001) and job:slo_errors_per_request:ratio_rate30m{job="myjob"} > (6*0.001) ) severity: page

Slide 20

Slide 20 text

複合アラームで条件式を実装 ( ALARM("example-important-endpoint-availability-2pct-1h") AND ALARM("example-important-endpoint-availability-2pct-5m") ) OR ( ALARM("example-important-endpoint-availability-5pct-6h") AND ALARM("example-important-endpoint-availability-5pct-30m") )

Slide 21

Slide 21 text

カスタムメトリクスを設計 AWS CLI または API を使用して、独自のメトリクスを CloudWatch に発行できま す。 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/publishing Metrics.html

Slide 22

Slide 22 text

カスタムメトリクスを設計 EnvironmentName CriticalUserJourneyName Category TimeWindow MetricName prod-example purchase Availability 5m TotalCount prod-example purchase Availability 5m BadCount prod-example purchase Availability 30m TotalCount prod-example purchase Availability 30m BadCount prod-example purchase Availability 1h TotalCount prod-example purchase Availability 1h BadCount prod-example purchase Availability 6h TotalCount prod-example purchase Availability 6h BadCount prod-example purchase Availability ... ...

Slide 23

Slide 23 text

カスタムメトリクスを設計 EnvironmentName CriticalUserJourneyName Category Percentile TimeWindow MetricName prod-example purchase Latency 5m TotalCount prod-example purchase Latency 95 5m BadCount prod-example purchase Latency 50 5m BadCount prod-example purchase Latency 30m TotalCount prod-example purchase Latency 95 30m BadCount prod-example purchase Latency 50 30m BadCount prod-example purchase Latency ... ... ...

Slide 24

Slide 24 text

AthenaでALBログを集計 ALB ログには、パーティションスキームを事前に指定できる既知の構造があるた め、Athena のパーティション射影機能を使用することで、クエリの実行時間を短 縮し、パーティション管理を自動化することが可能です。 https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer- logs.html#create-alb-table-partition-projection

Slide 25

Slide 25 text

AthenaでALBログを集計 クエリ単位でスキャンされたバイト数に対して課金されます。 https://aws.amazon.com/jp/athena/pricing/

Slide 26

Slide 26 text

AthenaでALBログを集計

Slide 27

Slide 27 text

AthenaでALBログを集計 WITH params AS ( SELECT ? param_data_point_time, ? param_http_method, ? param_path, ? param_latency_p50_threshold, ? param_latency_p95_threshold ) SELECT count(*), count_if(is_bad_for_availability), count_if(NOT is_bad_for_availability AND latency > 0), count_if(NOT is_bad_for_availability AND latency > param_latency_p50_threshold), count_if(NOT is_bad_for_availability AND latency > param_latency_p95_threshold) FROM ( SELECT (elb_status_code >= 500 OR elb_status_code = 429) is_bad_for_availability, (request_processing_time + target_processing_time + response_processing_time) latency FROM alb_logs_table, params WHERE day >= ? AND request_verb = param_http_method AND regexp_like(url_extract_path(request_url), concat(concat('^', param_path), '$') AND date_format( from_unixtime(CAST(floor(to_unixtime(from_iso8601_timestamp(time))) AS int) / 300 * 300 + 300), '%Y-%m-%d %H:%i:%s' ) = param_data_point_time ) t, params

Slide 28

Slide 28 text

AthenaでALBログを集計 AND regexp_like(url_extract_path(request_url), '^' || param_path || '$')

Slide 29

Slide 29 text

RDSでALBログを再集計 critical_user_journey_name data_point_time purchase 2023-05-21 11:35:00 total_count_for_availability bad_count_for_availability 35 0 total_count_for_latency bad_count_for_latency_p50 bad_count_for_latency_p95 35 15 1 http_method path latency_p50_threshold latency_p95_threshold month POST /orders 0.8 2.0 2023/05

Slide 30

Slide 30 text

RDSでALBログを再集計 WITH params AS ( SELECT TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS') AT TIME ZONE 'UTC' AS param_to_data_point_timestamp, %s AS param_critical_user_journey_name ), durations AS ( SELECT INTERVAL '30 minutes' AS duration UNION ALL SELECT INTERVAL '1 hour' UNION ALL SELECT INTERVAL '6 hours' UNION ALL SELECT INTERVAL '3 days' UNION ALL SELECT INTERVAL '28 days' ) SELECT SUM(c.total_count_for_availability), SUM(c.bad_count_for_availability), SUM(c.total_count_for_latency), SUM(c.bad_count_for_latency_p50), SUM(c.bad_count_for_latency_p95) FROM counts_table c, params p, durations d WHERE c.critical_user_journey_name = p.param_critical_user_journey_name AND c.data_point_time <= p.param_to_data_point_timestamp AND c.data_point_time > p.param_to_data_point_timestamp - d.duration GROUP BY d.duration ORDER BY d.duration

Slide 31

Slide 31 text

Lambdaでメトリクスを発行 cloudwatch = boto3.client('cloudwatch') cloudwatch.put_metric_data( Namespace=os.environ['CLOUDWATCH_METRICS_NAMESPACE'], MetricData=metric_data )

Slide 32

Slide 32 text

ChatbotでSlackに通知

Slide 33

Slide 33 text

ダッシュボードで可視化

Slide 34

Slide 34 text

実際に低コストで運用できている

Slide 35

Slide 35 text

構成はシンプル

Slide 36

Slide 36 text

料金は月51.7USD~

Slide 37

Slide 37 text

実装期間は2週間

Slide 38

Slide 38 text

実装期間は2週間

Slide 39

Slide 39 text

信頼性低下を実際に検知済み

Slide 40

Slide 40 text

試してよかった。今はこれで充分

Slide 41

Slide 41 text

ご質問は会場やSNSでお気軽に