はじめに
記載内容は上記の翻訳ではなく、意訳、要約を含みます。
手順も一部省略している部分もあります。
詳細や正確な手順を知りたい場合は本家サイトを参照ください。
画面スクショは本記事作成当時のものであり、今後のアップデートにより差異が発生する可能性があることをご留意ください。
Introduction
本ハンズオンではリソースの依存関係監視について学び、メトリクス監視やアラーム設定について学ぶことができます。
DEPLOY THE INFRASTRUCTURE
多くのワークロードは外部サービス、リソースに依存しています。
そのため、依存するサービス、リソースにデグレや障害が発生し、使用できなくなるとワークロードの機能性に大きな影響が発生します。
これらの依存関係を監視するためアラートや通知を設定することで関係者が問題を迅速に認識し、対応することができ、事業継続への影響を最小化することができます。
このハンズオンではOperational Excellenceのベストプラクティスである以下3つの実装例を示します。
- 依存関係のテレメトリーの実装
- ワークロードの異常が発生した場合のアラート
- プッシュ通知の有効化
本ハンズオンで監視するワークロードのアーキテクチャを紹介します。
右側のEC2インスタンスは外部サービスをエミュレートしたものです。50秒間隔でS3バケットにデータを書き込みます。
真ん中のS3バケットはイベント通知機能を有効にしています。バケットにデータが書き込まれると、通知を受け取るよう設定しています。
左側のLambda関数はS3バケットの通知を受け取ったら実行するよう設定しています。
1.1 Log into the AWS console
AWS管理コンソールにログインしてください。
1.2 Deploy the infrastructure using AWS CloudFormation
用意されたCloudFormationテンプレートを使ってハンズオン用スタックを作成します。
必要な部分だけ説明します。
ここからCloudFormationテンプレートをダウンロードしてください。
スタック名は今回はDependency-Monitoring-Lab
とします。
パラメーターの値は以下の通りに入力します。
AvailabilityZone
はプルダウンからAZを1つ選択してください。
BucketName
はアーキテクチャの際に説明したS3バケットのバケット名を入力します。今回はwa-lab-<あなたの名字>-<日付><時間>
とします。
LatestAmiId
はデフォルト値にしてください。
NotificationEmail
は依存外部サービス関連の通知を受け取るアクセス可能なメールアドレスを入力してください。
スタックの作成中にNotificationEmail
に設定したメールアドレスに確認メールが届きます。
リンクConfirm subscription
をクリックしてください。
以下のような画面が表示されたら購読設定完了です。
購読解除する際はリンクclick here to unsubscribe.
をクリックしてください。
スタックのステータスがCREATE_COMPLETE
になったらプロビジョニング成功です。
UNDERSTANDING METRICS
メトリクスとは、監視対象から取得するシステムのパフォーマンスに関するデータセットを指します。
ワークロードは、リクエスト数やエラーコードなどのアプリケーションメトリクス、CPU使用率、メモリ使用率、ディスク使用率などのインフラストラクチャメトリクスなど、様々なメトリクスを出力するよう設計すべきです。
多数のメトリクスを理解することで、監視に適切なメトリクスを選択することができ、ワークロードと依存関係のある外部サービスの可用性やステータスを理解することができます。
今回のハンズオンでは、S3バケットにデータが書き込まれるとLambda関数が実行されます。
Lambda関数に関するメトリクスを理解することで、依存サービスの健全性を判断するための適切なメトリクスが何かを判断することができます。
AWS LambdaはLambda関数を自動的に監視し、Amazon CloudWatchにメトリクスを送信します。
メトリクスにはリクエスト数、リクエスト毎の実行時間、エラーになったリクエスト数などがあります。
また、これらのメトリクスを活用してCloudWatchカスタムアラームを設定し、メトリクスが変化したら自動で応答するよう設定もできます。
LambdaががCloudWatchにデフォルトで送信するメトリクスは以下3種類です。
- 呼び出しメトリクス
- パフォーマンスメトリクス
- 同時実行メトリクス
それぞれどのようなメトリクスを集計するかは公式ドキュメントを参照ください。
また、以下の記事もわかりやすかったです。
また、公式ドキュメントにも記載があったようにデフォルトではありませんが、非同期呼び出しメトリクス
という種類もあるのでご留意ください。
さて、今回のハンズオンでは呼び出しメトリクス
のInvocations
とErrors
に注目します。
Errors
はLambda関数の呼び出しでエラーになった回数です。Lambdaランライムで発生した例外や設定誤りによるエラー、タイムアウトなどがあります。
外部サービスに関する問題を特定するのに重要な指標となります。
外部サービスのパフォーマンスが低下していたり、障害でS3にファイルの書き込みができない場合が考えられます。
Lambda関数の実行自体されなくなる可能性があり、Errors
の監視だけではこの状態を検出することは困難です。
Invocations
はLambda関数の呼び出し回数です。外部サービスは50秒に1回S3バケットにファイルを書き込みます。したがって、50秒に1回Lambda関数が呼ばれることになります。
Invocations
を監視することで想定した間隔で外部サービスが稼働しているのか確認することができます。
では、実際に画面の操作に移っていきましょう。
まず、Amazon CloudWatchのダッシュボードに遷移し、左メニューすべてのメトリクス
を選択してください。
検索窓にWA-Lab-DataReadFunction
と入力し、エンターキーを押下してください。
検索されたもののうちLambda > リソース別
リンクをクリックしてください。
利用可能なLambdaのメトリクスの一覧が表示されます。
メトリクス名Invocations
をチェックすると上のグラフでLambda関数が呼び出された時間と回数を確認することができます。
画面上部にあるCustom
ボタンをクリックし、Minutes
の15
を選択してください。
その後、画面中央のグラフ化されたメトリクス
タブを選択し、期間
を1分
に変更してください。
これで、グラフの表示範囲が直近15分間になり、メトリクスの粒度が1分間隔になります。
先ほど説明したようにInvocations
はLambda関数の呼び出し、つまり、S3バケットへのデータの書き込みを表します。
このメトリクスの回数と頻度を監視することで外部サービスの可用性の監視にも繋がります。
CREATE AN ALARM
監視すべきメトリクスを特定したので、メトリクスを監視するアラームを作成し、定義したしきい値に基づいて通知を送信するよう設定します。
CloudWatchアラームで上記実現ができます。CloudWatchアラームは指定した期間にわたりメトリクスを監視し、指定した閾値に対するメトリクスの値に基づいて、指定したアクションを実行します。
アクションにはAmazon SNSによる通知や、EC2アクション(停止、終了、再起動など)、Auto Scaling、Systems Managerの機能実行(Run Commandなど)があります。
では、実際に画面の操作に移っていきましょう。
まず、Amazon CloudWatchのダッシュボードに遷移し、左メニューすべてのアラーム
を選択してください。
画面右上アラームの作成
ボタンをクリックしてください。
メトリクスの選択
ボタンをクリックしてください。
検索窓にWA-Lab-DataReadFunction
と入力し、エンターキーを押下してください。
検索されたもののうちLambda > リソース別
リンクをクリックしてください。
利用可能なLambdaのメトリクスの一覧が表示されます。
メトリクス名Invocations
をチェックし、右下メトリクスの選択
ボタンをクリックしてください。
メトリクスと条件の指定
の入力を行います。
まず、メトリクス
セクションの入力です。
統計
を合計
に変更してください。
期間
を1分
に変更してください。
条件
セクションの入力です。
しきい値の種類
は静的
を選択してください。
Invocations が次の時...
はより低い
を選択してください。
... よりも
の部分は1分毎にLambda関数が呼び出される最小回数を入力します。つまり、1
を入力してください。
その他の設定
をクリックし、展開してください。
アラームを実行するデータポイント
はメトリクスのN
個のデータポイントのうちM
個がしきい値を超えた場合に、アラーム状態に遷移するための設定です。
今回はN
、M
ともの1
を設定します。つまり、1 / 1
と入力してください。
欠落データの処理
は欠損データを不正(しきい値を超えている)として処理
を選択します。
入力が終わったら画面最下部の次へ
ボタンをクリックしてください。
アクションの設定
の入力を行います。
通知
セクションの入力です。
アラーム状態トリガー
はアラーム状態
を選択してください。
次の SNS トピックに通知を送信
は既存の SNS トピックを選択
を選択してください。
通知の送信先
の入力欄をクリックすると、入力候補のSNSトピック名が表示されます。WA-Lab-Dependency-Notification
を入力してください。
E メール (エンドポイント)
に表示されているメールアドレスがCloudFormationスタック作成時に入力したものと同一であることを確認してください。
入力が終わったら画面最下部の次へ
ボタンをクリックしてください。
名前と説明を追加
の入力を行います。
名前と説明
セクションの入力です。
アラーム名
は今回WA-Lab-Dependency-Alarm
とします。
入力が終わったら画面最下部の次へ
ボタンをクリックしてください。
プレビューと作成
で入力内容を確認したら、画面最下部のアラームの作成
ボタンをクリックしてください。
アラームが作成されるとCloudWatchのすべてのアラーム
画面に戻ります。
一覧に先ほど作成したアラームが表示されています。
作成したばかりだとアラーム条件を判定するためのデータが足りないため状態
の値がデータ不足
になっているのでデータが集まるまで数分待機します。
データが収集されると状態
がOK
に変わります。
名前
のアラーム名リンクをクリックしてください。
アラームの詳細画面に遷移します。
グラフ
セクションでメトリクスが条件を満たしているかどうかを視覚的に確認することができます。
グラフの赤い線はしきい値を表し、それを下回るとアラーム状態
になります。
履歴
タブを選択すると、アラームに関する状態の変更の履歴を確認することができます。
CloudWatchアラームでSNS通知が追加されたため、現在のアーキテクチャは以下のようになります。
TEST FAIL CONDITION
外部サービスに障害が発生し、S3バケットにデータが書き込まれなくなった場合、つまり、Lambda関数が呼ばれなくなった場合、通知を送信するアラームを作成しました。実際に通知されるか確認してみます。
外部サービスに障害を発生させる要因としては例えば以下があります。
- IAMロールが変更or削除され、外部サービスにS3バケットへの書き込み権限がなくなった
- S3バケットポリシーが変更され、外部サービスに書き込み権限がなくなった
- S3バケットの設定が変更され、S3イベント通知が削除されたため、Lambdaに通知が送信されなくなった
- 外部サービスにネットワーク関連の問題が発生し、S3バケットへ書き込みができなくなっている
今回は最後の例を再現します。
サブネットルートテーブルからデフォルトルートを削除し、EC2上で実行されている外部サービスがインターネットに到達できなくします。
では、実際に画面の操作に移っていきましょう。
まず、VPCのダッシュボードに遷移し、左メニュールートテーブル
を選択してください。
ルートテーブルWA-Lab-RouteTable
をチェックし、ルート
タブを選択して、ルートを編集
ボタンをクリックしてください。
送信先
が0.0.0.0/0
のルートを削除
ボタンをクリックし、削除します。
そして、変更を保存
ボタンをクリックしてください。
以上の操作により、EC2上で実行されている外部サービスはインターネットに到達できなくなったため、S3バケットにデータを書き込むことができなくなりました。
アラームの状態と通知が送信されるかを確認します。
Amazon CloudWatchのダッシュボードに遷移し、左メニューすべてのアラーム
を選択してください。
アラームWA-Lab-Dependency-Alarm
のリンクをクリックしてください。
設定変更してから数分待つとアラームの状態がOK
からアラーム状態
に変更されます。
履歴
タブを選択すると、状態の更新
イベントが発生し、アクション
としてSNSの通知が送信されたことがわかります。
同時にSNSトピックの購読者に通知メールが送信されます。
通知メールには状態変更の理由など詳細な情報が記載されています。
外部サービスが障害から復旧したことを再現するため、先ほどサブネットルートテーブルから削除したインターネットゲートウェイへのデフォルトルートを復活させましょう。
数分するとグラフのステータスがアラーム状態
からOK
に変更されます。
履歴
タブを選択すると、状態の更新
イベントが発生したことがわかります。
BONUS CONTENT
CloudWatchメトリクスとCloudWatchアラームによって依存関係となっている外部サービスのモニタリングをすることができました。
通知により、関係者に問題を警告することはできるようになりましたが、このようなイベントを追跡することで問題解決をより確実なものにすることができます。
これはSystems Manager OpsCenterを活用することで実現できます。
OpsCenterは運用上の課題、問題をOpsItemという単位で管理し、追跡し、現在のステータスを迅速に把握することができます。
CloudWatchアラームで、通知と同時にOpsItemを自動作成するように設定してみます。OpsItemはLambda関数で作成します。
設定後のアーキテクチャは以下になります。
では、実際に画面の操作に移っていきましょう。
まず、Amazon SNSのダッシュボードに遷移し、左メニュートピック
を選択してください。
トピックWA-Lab-Dependency-Notification
リンクをクリックしてください。
サブスクリプション
タブを選択し、サブスクリプションの作成
ボタンをクリックしてください。
詳細
セクションの入力です。
トピックARN
はデフォルト値で構いません。
プロトコル
はAWS Lambda
を選択してください。
エンドポイント
はCloudFormationスタックの出力に表示されているキーOpsItemFunction
の値を指定してください。
入力し終えたら、画面最下部のサブスクリプションの作成
ボタンをクリックしてください。
Lambdaが自動実行されるか確認するためにCloudWatchアラームの状態をアラート状態
にします。前章で実施したようにサブネットルートテーブルからインターネットゲートウェイへのデフォルトルートを削除してください。
数分すると通知メールが送信されるのと同時にSystems Manager OpsCenterにOpsItemが作成されます。
作成されたID
リンクをクリックしてください。
OpsItemの詳細画面に遷移します。
OpsItemの詳細
をクリックするとタイトル
、重要度
、ステータス
など確認ができます。
関連リソース
セクションでは、問題に関連するAWSリソースを確認することができます。
ランブック
セクションでは、作成済みのRunbookを実行し、修復を自動化することができます。
TEAR DOWN THIS LAB
削除するリソースの箇条書き
- CloudWatchアラーム
- Systems Manager OpsCenterのOpsItem
- CloudFormationスタック
- S3バケット(
cf-templates-
から始まるバケット) - SNSサブスクリプション
詳細は以下を参照ください。