$30 off During Our Annual Pro Sale. View Details »

AthenaとCloudWatchで始める低コストなSLOエラーバジェット監視

iwamot
June 23, 2023

 AthenaとCloudWatchで始める低コストなSLOエラーバジェット監視

2023-06-24
Reject Day 2023
https://connpass.com/event/282843/

iwamot

June 23, 2023
Tweet

More Decks by iwamot

Other Decks in Technology

Transcript

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

    View Slide

  2. こんな人
       

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 複数バーンレートの監視が推奨
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 複合アラームで条件式を実装
    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

    View Slide

  20. 複合アラームで条件式を実装
    (
    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")
    )

    View Slide

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

    View Slide

  22. カスタムメトリクスを設計
    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 ... ...

    View Slide

  23. カスタムメトリクスを設計
    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 ... ... ...

    View Slide

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

    View Slide

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

    View Slide

  26. AthenaでALBログを集計

    View Slide

  27. 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

    View Slide

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

    View Slide

  29. 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

    View Slide

  30. 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

    View Slide

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

    View Slide

  32. ChatbotでSlackに通知

    View Slide

  33. ダッシュボードで可視化

    View Slide

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

    View Slide

  35. 構成はシンプル

    View Slide

  36. 料金は月51.7USD~

    View Slide

  37. 実装期間は2週間

    View Slide

  38. 実装期間は2週間

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide