[アップデート] CloudWatch Synthetics Canary のスケジュール実行機能に自動リトライオプションが追加されました
いわさです。
CloudWatch Synthetics Canary を使って Web サイトや Web システムの合成監視を行われている方は多いと思います。
おそらくいちばん多い使い方はスケジュール機能を使って URL ベースのハートビートモニタリングではないでしょうか。料金が地味に高いので実行頻度に気をつける必要はありますが、それ以外は使いやすく私も Web サイトの死活監視によく使っています。
そんな Systhetics Canary ですが、先日次の API のアップデートがありました。
どうやら Canary をスケジュール実行した時に、自動でリトライができるようになったようです。
マネジメントコンソールを確認してみたところ、ユーザーインターフェース上も追加されていました。デフォルトは 0 回になっていますね。
マネジメントコンソールの説明欄によると、スケジュール実行が失敗した場合に最大 2 回(タイムアウトが 10 分を超える場合は最大 1 回)まで再試行ができる仕様のようです。
10 分未満の場合は 2 回まで設定が出来ました。
10 分以上の場合は 2 回を設定するとエラーになりますね。
公式ドキュメント上の追記がまだ確認できずいくつか気になる点があります。
まず再試行の間隔が不明なので、何秒後にリトライ実行されるのか気になります。
また、このリトライによってアラーム設定時にどのように考慮する必要があるのかも気になります。
例えば従来 3 回連続で失敗した時にアラーム通知を行うような条件だった場合、再試行を有効化することで 1 回目の失敗 + 再試行 2 回の失敗で 3 回失敗したと判断され通知が送信されるのでしょうか。
このあたりを検証してみましたのでその様子を紹介します。
ためしてみる
Lambda URL をエンドポイント URL に指定したハートビートモニタリングのテンプレートを使います。
Lambda 関数は一定確率で失敗するように次のように実装しました。
export const handler = async (event) => {
const randomValue = Math.random();
if (randomValue < 0.5) {
console.log('Function failed randomly (50% chance)');
throw new Error('Random failure occurred');
}
console.log('Function executed successfully');
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
1 分間隔で Canary を実行させ、2 回まで再試行させます。
再試行の実行間隔
まずは再試行の実行頻度を確認してみます。
1 分間でしばらく実行させた後、Canary コンソールのモニタリング画面に次のように表示されました。
新しく Retry というステータスが表示されるようになっていますね。
時系列を整理すると 1 分間隔で次のようなステータスが発生していました。
実行時間 | ステータス |
---|---|
6:48 | 成功 |
6:49 | リトライ |
6:50 | 成功 |
6:51 | リトライ |
6:52 | リトライ |
6:53 | 失敗 |
6:54 | 失敗 |
6:55 | 失敗 |
6:56 | 成功 |
6:57 | 成功 |
リトライも 1 分間隔で実行されているようにも見えるのですが、このリトライステータスは何を示しているのでしょうか。
ということで Canary によって実行される Lambda 関数のメトリクスも確認してみます。
1 分ごとに Canary 用の関数が何回実行されているかわかったので、この情報を先程の実行結果に追加してみてみます。
実行時間 | ステータス | 実行回数 |
---|---|---|
6:48 | 成功 | 1 |
6:49 | リトライ | 2 |
6:50 | 成功 | 1 |
6:51 | リトライ | 2 |
6:52 | リトライ | 2 |
6:53 | 失敗 | 3 |
6:54 | 失敗 | 3 |
6:55 | 失敗 | 3 |
6:56 | 成功 | 1 |
6:57 | 成功 | 1 |
この結果から、先ほどのモニタリング画面の「リトライ」は、初回は失敗したが定義された再試行の中で成功したことを示すステータスのようです。
ということは 1 分間隔の Canary の実行の中でさらに再試行が実行されているようです。
この Lambda 関数のログ情報からより詳細な実行回数を確認してみましょう。
6:52 は再試行を 1 回行って成功、6:53 は再試行を 2 回行っても失敗したようなので、そのあたりの時系列を整理してみます。
まず 6:52 からです。
ログを確認してみると、6:52:07 に 1 回目の実行を行いステータスが FAILED、6:52:08 に 2 回目の実行を行ってステータスが PASS になっています。
続いて 6:53 です。
6:53:07 に 1 回目の実行で FAILED、6:53:08 に 2 回目で FAILED、6:53:09 に 3 回目で FAILED となっています。
このことから、再試行間隔は約 1 秒程度となっているようです。
再試行失敗時のアラーム評価結果
どうやら CloudWatch メトリクス見る限り、リトライも Failed メトリクスに含まれていそうです。
そして、SuccessPercent メトリクスも Retry が除外され一発成功したもののみが対象となるようです。
ただ、不安定なサイトで一定のリトライ回数内で成功すれば正常だと見なしたいケースもあると思います。
その場合は新しく追加された以下の SeuccessPercentWithRetry メトリクスを使いましょう。
Retry で成功したものも Success として扱ってくれます。
今まで Failed 回数でアラーム発行することが多かったのですが、SuccessPercent が 100% を下回った場合に通知を出すような形に変更したほうが良さそうですね。
Canary のアクションメニューからも有効化が可能
なお、Canary 新規作成画面、編集画面からこの再試行回数を設定出来ましたが、どうやら Canary 一覧のアクションメニューからも設定ができるようです。
さいごに
CloudWatch Synthetics Canary のスケジュール実行機能に自動リトライオプションが追加されたので色々検証してみました。
リトライ成功の結果を成功/失敗どちらで扱うか運用上の判断が必要ですが、仕様を理解して使えれば特定のユースケースで役に立ちそうです。