アプリケーションのエラーに対してアラームを設定する

AWSBeginner
オンラインで実践に進む

はじめに

運用チームには、リクエストが失敗すると発生し、正常なトラフィックの後に回復するエラーのシグナルが必要です。このラボでは、メトリクスアラームを設定し、実際のリクエストによる両方の状態遷移を観察します。ゼロと欠損データを比較し、最後に自分のアラームを削除します。

最初に CloudWatch メトリクスでアプリケーションの健全性を測定する を完了し、メトリクスのディメンションと Sum を学んでください。このラボには、新しいアプリケーションとメトリクス系列が用意されています。

認定試験との関連

認定資格 試験タスク 実習内容
CloudOps Engineer – Associate (SOA-C03) タスク 1.1 CloudWatch アラームの評価、正常状態への復帰、欠損データ。
DevOps Engineer – Professional (DOP-C02) タスク 4.2 基礎演習:CloudWatch アラームの評価、正常状態への復帰、欠損データ。
Solutions Architect – Professional (SAP-C02) タスク 3.1 基礎演習:CloudWatch アラームの評価、正常状態への復帰、欠損データ。

実験の概要

概念図:実際の注文リクエストが CloudWatch アラームに Errors の測定値を提供し、失敗と測定されたゼロが状態を決定します。

メトリクスアラームを設定する

このステップでは、orders アプリケーションのサーバーエラー数を監視します。アラームは、メトリクスをしきい値と比較して評価し、OK、ALARM、INSUFFICIENT_DATA を報告します。アクションを設定しない限り、通知は送信しません。この演習では評価に集中します。

独立して準備されたアプリケーションは、実際のリクエストのメトリクスを公開します。Errors メトリクスは HTTP 5xx で 1、正常なリクエストで 0 です。高解像度の公開により 10 秒周期を使えるため、いくつもの周期を短時間で観察できます。本番環境の周期としきい値は、ワークロードと費用に応じて決まります。

cd /home/labex/project

単一メトリクスのアラームを作成します。名前空間、名前、ディメンションで系列を選びます。Sum は、完了した各周期のエラー数を数えます。

アラームは、完了した 10 秒周期を 1 つ評価します(--period 10、--evaluation-periods 1)。Sum が 1 以上になるとしきい値に達します。GreaterThanOrEqualToThreshold は「しきい値以上」を意味します。notBreaching は、測定値がない周期を、しきい値を超えていないものとして扱います。これにより、アイドル状態の周期は OK になりますが、アプリケーションの健全性を証明するわけではありません。

aws cloudwatch put-metric-alarm \
  --alarm-name labex-o03-orders-errors \
  --namespace LabEx/O03 \
  --metric-name Errors \
  --dimensions Name=Application,Value=orders \
  --statistic Sum \
  --unit Count \
  --period 10 \
  --evaluation-periods 1 \
  --threshold 1 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --treat-missing-data notBreaching

以下のコマンドでアラームを読み取ります。評価がまだ完了していない場合は、数秒待ち、OK を返すまでこの読み取りコマンドを繰り返してください。

最初の OK は、欠損データの扱いによるものであり、ヘルスチェックが成功したためではありません。評価理由を確認します。

aws cloudwatch describe-alarms \
  --alarm-names labex-o03-orders-errors \
  --query 'MetricAlarms[0].[StateValue,StateReason,Dimensions]'

/labex/o03-reference は変更せずに保持します。各ラボは独立して開始するため、以前のメトリクスデータは必要ありません。

実際の失敗でアラームを発生させる

このステップでは、実際に失敗するリクエストを生成し、自動評価を待ちます。完了した周期には、現在の未完了の周期のデータポイントは含まれません。HTTP レスポンスの確認とアラーム状態の確認は、別々の観察です。

提供されたサービスでは pear は利用できません。このループは、複数の 10 秒周期にまたがるように、2 秒間隔で 9 件のリクエストを送ります。for はコマンドを繰り返し、sleep 2 はリクエスト間で待ちます。-f を付けない curl は HTTP 503 でもレスポンス本文を返すため、失敗を観察できます。

for request in $(seq 1 9); do
  curl -sS -H 'Content-Type: application/json' -d '{"sku":"pear","quantity":1}' http://127.0.0.1:5050/orders
  echo
  sleep 2
done

評価された状態を読み取ります。まだ ALARM になっていない場合は、数秒待ち、このコマンドを繰り返してください。StateReasonData は文字列として保存された JSON なので、レスポンスでは引用符がエスケープされて表示されます。recentDatapoints には、評価された周期の合計値が並びます。

aws cloudwatch describe-alarms \
  --alarm-names labex-o03-orders-errors \
  --query 'MetricAlarms[0].[StateValue,StateReason,StateReasonData]'

ALARM と、StateReasonData 内の 1 以上の recentDatapoints 値が返るはずです。評価に前の周期がまだ表示されている場合は、数秒待って読み取りコマンドを繰り返してください。状態は、実際のリクエストから生成されたデータポイントに従います。アラーム状態を手動で設定しないでください。このアラームは orders だけを監視するため、別のアプリケーションの系列は評価に含まれません。

注文チームにとって ALARM は、選択した期間にサーバーエラーがあるかを示します。どのリクエストが失敗したか、なぜ在庫がなかったかまでは説明しません。HTTP 応答は業務リクエストの失敗、評価されたデータポイントはアラームの状態変化を示し、リクエストログは診断の詳細を提供します。調査対象を決めるときは、それぞれの観察結果を区別してください。

回復と欠損データを観察する

このステップでは、実際のゼロと、測定データがない状態を区別します。正常な apple のリクエストを送り、完了した周期に測定された Errors=0 を含めます。複数の周期にわたって繰り返すことで、現在の未完了の集計区間を回復と誤認しないようにします。

for request in $(seq 1 9); do
  curl -sS -H 'Content-Type: application/json' -d '{"sku":"apple","quantity":1}' http://127.0.0.1:5050/orders
  echo
  sleep 2
done

評価された状態を読み取ります。まだ OK になっていない場合は、数秒待ち、このコマンドを繰り返してください。

aws cloudwatch describe-alarms \
  --alarm-names labex-o03-orders-errors \
  --query 'MetricAlarms[0].[StateValue,StateReason,StateReasonData]'

OK と recentDatapoints: [0] が返るはずです。空のリストは測定データがないことを意味するため、先に進む前に、測定されたゼロを確認してください。

アプリケーションが一度も公開しない系列である Application=absent に対して、別のアラームを作成します。欠損データを正常とは扱わず、欠損として扱います。

aws cloudwatch put-metric-alarm \
  --alarm-name labex-o03-missing \
  --namespace LabEx/O03 \
  --metric-name Errors \
  --dimensions Name=Application,Value=absent \
  --statistic Sum \
  --unit Count \
  --period 10 \
  --evaluation-periods 1 \
  --threshold 1 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --treat-missing-data missing

選択した系列に測定値がないため、新しいアラームは INSUFFICIENT_DATA のままになるはずです。

aws cloudwatch describe-alarms --query 'MetricAlarms[].[AlarmName,StateValue,StateReason]'

orders は測定されたゼロによって OK、absent は INSUFFICIENT_DATA になるはずです。評価理由を使い、測定されたゼロと測定データがない状態を区別してください。

このステップの 2 つのアラームは、測定されたゼロと、欠損データの扱いを missing にした存在しない系列を区別します。

AWS View は、実際のサービスの状態と、評価されたデータポイントを表示します。すべての OK をアプリケーションの健全性の証明として扱わず、理由を比較してください。

orders は実際の失敗から回復し、存在しない系列はデータ不足になっています。

所有するアラームを削除し、公開を停止する

このステップでは、このラボのアラームだけを削除し、無関係なデータを保持します。削除前に計測を無効にし、アプリケーションが新しいデータポイントを公開しないようにします。

cat > app.json <<'JSON'
{"logging": {"enabled": false, "group": "/labex/o03-orders", "stream": "requests"}, "metrics": {"enabled": false, "namespace": "LabEx/O03"}}
JSON
aws cloudwatch delete-alarms --alarm-names labex-o03-orders-errors labex-o03-missing
aws cloudwatch describe-alarms --query 'MetricAlarms[].AlarmName'
aws logs get-log-events \
  --log-group-name /labex/o03-reference \
  --log-stream-name platform \
  --query 'events[].message'

アラーム一覧は空になり、INFO platform reference keep unchanged が返るはずです。既存のメトリクスのデータポイントは保持されます。CloudWatch には、個別のメトリクスを削除する明示的な API はありません。その後、制作者やプラットフォームによる後片付けで、この使い捨ての環境を削除します。

まとめ

エラーのアラームを設定し、実際のリクエストによる自動発生と回復を観察しました。測定されたゼロと欠損データを区別し、参照ログを保持しながら、所有するアラームを削除しました。

詳しくは、AWS 公式ドキュメントを参照してください:メトリクスアラームとアクション; 欠落データがある場合のアラーム評価。