← ハンズオン一覧に戻る

AWS Hands-on / Monitoring

サーバーの異常をメールで知らせる仕組みを作る

EC2 サーバーの CPU 使用率を CloudWatch で見張り、決めた条件を超えたら自動でメールが届くようにします。画面を見続けなくても、異常があれば向こうから知らせてくれる——監視と通知の基本のかたちを、実際にメールを受け取って確かめます。

● Lv.3 複数のサービスを組み合わせられる人 ⏱ 所要 40〜60 分 すべてコンソールで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須EC2 インスタンスを起動した経験があること
  • 必須確認メールを受け取れるメールアドレス(自分が使えるもの)
  • あると良い「メトリクス(測定値)」「しきい値」という言葉のイメージがある

※ このハンズオンは すべてコンソールだけで完結します。通知の受け取りにメールアドレスを 1 つ使います(確認メールのリンクを 1 回クリックします)。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

サーバーを動かしていると、CPU が高止まりしたり、応答しなくなったりと、調子が悪くなることがあります。とはいえ、その兆候に気づくためにずっと画面を見張っているのは現実的ではありません。とくに夜間や、複数台を運用しているときはなおさらです。

そこで使うのが CloudWatch です。CloudWatch は、AWS の各サービスの状態を数値(メトリクス)として集めています。その値にアラームを仕掛け、「CPU 使用率が一定を超えたら」といった条件で自動的に知らせることができます。知らせ先は SNS というサービスのトピックを通じてメールに届けます。今回は「異常があればメールが飛んでくる」仕組みを作り、実際にメールを受け取って確かめます。

通知に、なぜ SNS をはさむの?

SNS の「トピック」は、通知の届け先を束ねる配信センターのような役割です。アラームはトピックに知らせるだけでよく、トピックの先にはメールを何件でも、あるいは他のサービスもつなげます。「知らせる側」と「届け先」を分けておくと、あとから届け先を増やすのが簡単になります。

アラームには、どんな状態があるの?

主に OK(正常)アラーム(条件を満たして警告中)データ不足(判断材料がまだない)の 3 つです。状態が「OK → アラーム」へ変わった瞬間に通知が飛ぶ、と考えると分かりやすいです。

Goal

EC2 の CPU 使用率メトリクスに CloudWatch アラームを仕掛け、SNS トピック経由で自分のメールに通知が届くようにする。アラームが「アラーム」状態になったときに、実際に通知メールが届くことを確認する。

04 — Architecture

つくる構成

EC2 の状態は CloudWatch にメトリクスとして集まります。そこにアラームを仕掛け、条件を満たすと SNS トピックへ通知し、トピックから自分のメールへ届きます。

メトリクス
EC2 の CPU 使用率
(CloudWatch が収集)
アラーム
しきい値を超えたら
「アラーム」状態へ
SNS トピック
通知の配信センター
あなたのメール
通知が届く
アラームの状態が「OK」から「アラーム」へ変わった瞬間に、SNS トピックへ通知が送られ、メールが届きます。
05 — Requirements

要件

以下の要件を満たし、通知メールが実際に届くことを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2監視対象として EC2 インスタンスを 1 台起動する(Amazon Linux 2023、無料利用枠タイプ。例:t2.micro / t3.micro。名前タグは monitor-target など)。
3SNS トピックを作成し、自分のメールアドレスをサブスクライブして、届いた確認メールからサブスクリプションを確定(Confirm)する。
4CloudWatch アラームを作成する。対象は手順 2 のインスタンスの CPU 使用率(CPUUtilization)、通知アクションに手順 3 の SNS トピックを指定する。
5アラームが 「アラーム」状態になったときに通知メールが届くことを確認する(確認のため、現在の状態で条件を満たすしきい値を一時的に設定して発報させてよい)。
6確認後、しきい値を現実的な条件(例:CPU 使用率が一定以上の状態が続いたら警告)に整える。
06 — Steps

構築の進め方

「監視対象を用意 → 通知先(SNS)を用意 → アラームでつなぐ → 実際に発報させて確認」の順に進みます。まず一度メールを受け取ってから、現実的な設定に整えるのがコツです。

  1. リージョンを合わせ、監視対象の EC2 を 1 台起動する

    リージョンが東京であることを確認し、EC2 を 1 台起動します(Amazon Linux 2023・無料利用枠タイプ)。CPU 使用率を見張る対象にするだけなので、ユーザーデータや特別な設定は不要です。

    メトリクスは自動で集まる

    EC2 の CPU 使用率などの基本的なメトリクスは、何もしなくても CloudWatch に集まります(標準では 5 分間隔)。起動直後はまだデータが少ないので、数分待つとグラフに現れます。

  2. SNS トピックを作り、自分のメールを登録する

    検索バーから SNS コンソールを開き、「トピックの作成」でタイプ「スタンダード」のトピックを作ります(名前は alarm-topic など)。続けて、そのトピックに「サブスクリプションの作成」で、プロトコル「Eメール」・エンドポイントに自分のメールアドレスを登録します。

    届いた確認メールを必ず Confirm

    登録すると、AWS から確認メールが届きます。その中の「Confirm subscription」リンクをクリックして、はじめて通知を受け取れる状態になります。これを忘れると、アラームが鳴ってもメールは届きません。

  3. CloudWatch アラームを作り、対象メトリクスを選ぶ

    CloudWatch コンソールの「すべてのアラーム」→「アラームの作成」を開き、「メトリクスの選択」から EC2 →「インスタンス別メトリクス」→ 対象インスタンスの CPUUtilization を選びます。

    何を見張るかを決める

    メトリクスは「どのリソースの・どの指標を見るか」の指定です。今回は「このインスタンスの CPU 使用率」を選びました。1 つのアラームは 1 つのメトリクスを見張ります。

  4. まずは「必ず発報する」しきい値で、通知を確認する

    条件の設定で、今の状態でも必ず条件を満たすしきい値を一時的に指定します(例:「CPUUtilization0 以上」のように、現在値が確実に超える向き)。通知アクションに、手順 2 のSNS トピックを指定してアラームを作成します。しばらくすると状態が「アラーム」になり、通知メールが届きます

    なぜ最初に必ず鳴らすの?

    本来の「CPU が高くなったら」という条件は、わざと負荷をかけないと発報しません。学習では、まず通知の経路が正しくつながっているかを確かめるのが先決です。確実に鳴る条件で一度メールを受け取り、仕組み全体が動くことを確認します。

  5. 状態の移り変わりを観察する

    アラームの画面で、状態が データ不足 → OK や アラーム と移り変わる様子と、履歴を確認します。状態が「アラーム」に変わったタイミングで通知が送られていることを、メールの受信時刻と照らし合わせてみましょう。

  6. 現実的なしきい値に整える

    仕組みが確認できたら、アラームを編集して、実運用を想定した条件に直します(例:「CPU 使用率が 70% 以上の状態が 5 分続いたら」)。これで、ふだんは静かにしていて、本当に高負荷になったときだけ知らせてくれるアラームになります。

    しきい値と期間はセットで考える

    「いくつを超えたら(しきい値)」だけでなく、「どのくらいの時間続いたら(評価期間)」も大切です。一瞬の上昇で毎回鳴ると、通知が多すぎて逆に見なくなります。少し続いたら鳴る、くらいが扱いやすいバランスです。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — アラームは鳴っているのにメールが来ない

「状態は『アラーム』なのに、通知メールが届かない」

通知の届け先がつながっていない可能性が高いです。①SNS サブスクリプションの状態が「確認済み(Confirmed)」になっているか(確認メールの Confirm を押し忘れていないか)、②迷惑メールフォルダに入っていないか③アラームの通知アクションに、その SNS トピックが指定されているかを順に見直しましょう。

Pitfall 02 — アラームがずっと「データ不足」のまま

「状態が『データ不足(Insufficient data)』から変わらない」

判断材料となるメトリクスがまだ十分にない状態です。①対象のインスタンスを正しく選んでいるか②起動してから時間が経っているか(基本のメトリクスは 5 分間隔のため、起動直後はデータが少ないです)、③評価期間がメトリクスの間隔に対して短すぎないかを確認しましょう。少し待つと値が集まり、状態が定まります。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。CloudWatch・SNS コンソールとメールを確認しながら、次を順に確かめましょう。

  • SNS のサブスクリプションの状態が 「確認済み(Confirmed)」になっている。
  • CloudWatch アラームが、対象インスタンスの CPUUtilization を見張っている。
  • アラームの通知アクションに、作成した SNS トピックが指定されている。
  • アラームが「アラーム」状態に変わったとき、通知メールが届いた(受信を確認できた)。
  • 最終的に、しきい値が現実的な条件(例:CPU 使用率が一定以上の状態が続いたら)に整えられている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. アラームのしきい値や評価期間を、低く・短くしすぎると何が起きるでしょうか。逆に高く・長くしすぎるとどうでしょうか。ちょうどよい設定とは、どんな考え方で決めればよいでしょうか。
    ヒント
    低く・短くすると、些細な変動で何度も鳴り、通知が多すぎて見なくなります(オオカミ少年のように)。高く・長くすると、本当の異常を見逃しかねません。「鳴りすぎず、見逃さず」のバランスをどう取るか、という観点で考えてみましょう。
  2. 通知を、アラームから直接メールに送らず、SNS トピックを間にはさみました。この「ひと手間」は、あとからどんな場面で役に立つでしょうか。
    ヒント
    トピックには、メールの宛先を複数足したり、メール以外の届け先(他のサービスなど)をつないだりできます。「知らせる側(アラーム)」を変えずに「届け先」だけ増やせる、という分離の利点から考えてみましょう。
  3. アラームには「データ不足」という状態がありました。監視の観点では、これを「正常」と同じに扱ってよいでしょうか。データが来ないこと自体が問題のサインである場合を考えてみましょう。
    ヒント
    データが来ない原因が「単に起動直後」なら問題ありませんが、「サーバーが落ちて値を送れない」なら見逃せません。データ不足を OK とみなすか、警告とみなすかは選べます。「沈黙=正常」とは限らない、という視点で考えてみましょう。
10 — Clean up

後片づけ

学習で作ったものを片づけます。アラームや SNS は少額または無料枠の範囲が多いですが、EC2 は起動中ずっと課金されるため、忘れず終了しましょう。

  1. CloudWatch アラームを削除する:「すべてのアラーム」で作成したアラームを選んで削除します。
  2. SNS のサブスクリプションとトピックを削除する:サブスクリプション(メール登録)を削除し、続けてトピックを削除します。
  3. EC2 インスタンスを終了する:「インスタンス」で monitor-target を選び、「インスタンスを終了(Terminate)」します。
Caution — 監視対象の EC2 を消し忘れない

料金が続くのは主に EC2

アラームや SNS の通知は少額・無料枠の範囲が多い一方、監視対象の EC2 は起動している間ずっと課金されます。学習が終わったら、必ずインスタンスを終了しましょう。アラームだけ残しても、対象がなくなれば「データ不足」になります。デフォルト VPC などの既定リソースは消さないようにしましょう。

コストに関する注意: 監視対象の EC2 インスタンスは、起動している間ずっと課金されますt2.micro / t3.micro などは無料利用枠の対象)。CloudWatch アラームは一定個数まで、SNS のメール通知も一定量まで無料利用枠があり、今回の範囲ならごく少額か無料に収まることが多いです。インスタンスに付くディスク(EBS ボリューム)や public IPv4 アドレスにも料金がかかります。使い終えたら、上の「後片づけ」でアラーム・SNS・EC2 をすべて片づけましょう。最新の料金は AWS の公式料金ページで確認してください。