LoginSignup
1
1

More than 1 year has passed since last update.

AWS SNSから届くメールを読みやすくする

Posted at

はじめに

AWSでエラー検知をしてメールを飛ばすという仕組みを作るのは簡単ですが、最低限の設定だけでメールを送ると、なかなか解読が難しい文字列が送られてきます。
現場でも使う仕組みだったので、少しでも読みやすくする方法を調べてみました。

以下の2つの記事が大変参考になりました。
CloudWatch アラームの通知メールを少しでも読みやすくしたい
EventBridgeの入力トランスフォーマーでSNSのメール通知内容を整形してみた

エラー通知メール(通常のすがた)を確認

構成

 今回は「testAPI」という名前のAPIを作成して、APIでエラーが発生した場合、メールで通知するようにします。
 構成図は以下のとおりです。
スクリーンショット_20221202_213345.png
 ざっくりと説明すると、CloudWatchで監視を行い、CloudWatchがエラーを検知したらSNSでメールを送るという流れです。
 testAPIを作成したという前提で、SNSトピックの作成とCloudWatch Alarmの設定を説明します。

SNSトピックの作成

 トピックで、タイプを「スタンダード」、名前はAPI名と何を通知するかわかるように設定します。
スクリーンショット_20221201_203202.png

 サブスクリプションで、プロトコルを「Eメール」、エンドポイントを自分のメールアドレスに設定します。
スクリーンショット_20221201_203323.png

 これだけだとサブスクリプションが保留中になっています。
スクリーンショット_20221201_201040.png

 登録したメールアドレスに認証メールが届いているので、「Confirm subscription」を押すと、以下の画面が出てきてSNSトピックの設定は完了です。
スクリーンショット_20221201_203411.png

 

CloudWatch Alarmの設定

 メトリクスはtestAPIの「4XXError」を選択します。ここは実際に監視したい項目を選んでください。(「4XXError」の選出理由はエラーが出しやすいというだけなので…)
スクリーンショット_20221201_204259.png
スクリーンショット_20221201_204319.png
スクリーンショット_20221201_204334.png
スクリーンショット_20221201_204450.png
 
 統計「合計」、期間「5分」にします。
スクリーンショット_20221201_204526.png

 条件は以下の画像のとおり、しきい値の種類「静的」、4XXErrorが次の時…「以上」、…よりも「1」で設定します。
 これで「5分間で、4XXErrorが1回以上発生したとき」アラーム状態になります。
スクリーンショット_20221201_204556.png

 アクションの設定で、アラーム状態トリガーを「アラーム状態」、次のSNSトピックに通知を送信を「既存のトピックを選択」、通知の送信先を先ほど作ったSNSトピック名にします。
スクリーンショット_20221201_204620.png

 アラーム名を設定します。
スクリーンショット_20221201_204647.png

エラー通知メールを確認

 適当にエラーを発生させて(APIの4XXエラーは存在しないパスにアクセスすれば出ます)、エラー通知メールを待ちます。
 来ました。
スクリーンショット_20221201_205037.png

 ・・・・・・????
 これはあくまで一部の抜粋で、本文はこの2倍くらい文字がずら~~~~と並んでいます。
 AWSを全く知らない人に見せたら「迷惑メール?」と言われました。たしかに、寝起きの頭だと迷惑メールとして処分してしまうかもしれません。私はまだまだひよこなので、しっかり目覚めていてエラー通知メールと認識できても、解読が大変です。
 そこで、SNSから発行されるメールの加工方法がないか調べてみました。

エラー通知メールを読みやすくする

構成

 先ほどから構成を少し変えます。EventBridgeというサービスを新たに追加します。
 流れをざっくりと説明すると、CloudWatchで監視を行い、CloudWatchがエラーを検知したらEventBridgeにイベントソースを送り、EventBridgeはイベントソースをもとにメッセージを加工して、SNSでメールを送るという流れです。
スクリーンショット_20221202_213339.png
 エラー検知するAPIや、CloudWatch Alarm、SNSトピックは基本的にそのまま使いますが、CloudWatch AlarmとSNSトピックについては少し設定の変更をします。

CloudWatch Alarmの設定変更

 先ほどは、CloudWatch Alarmがアラーム状態になったら(=エラーを検知したら)、SNSトピックに通知を行うという設定にしていました。
 しかし、今回はCloudWatch Alarmがアラーム状態になったら、EventBridgeにイベントソースを送るという構成にします。そのため、CloudWatch Alarmのアクションの設定から通知を削除します。
スクリーンショット_20221214_220359.png

SNSトピックの設定変更

 実は通知メールの件名は、SNSトピックの表示名と同じです。
 SNSトピックの表示名は任意の項目ですが、画像のように入力して、よりエラーが来たことをわかりやすくしました。
スクリーンショット_20221201_225955.png

 CloudWatch AlarmとSNSトピックについて、設定変更が終わったので、新しく使うEventBridgeの設定を行っていきます! 

EventBridgeの設定

 ルールの詳細を定義で、名前をわかりやすいものに(画像ではCloudWatchアラームと同じ名前にしています)、イベントを「default」に、ルールタイプを「イベントパターンを持つルール」にします。
スクリーンショット_20221201_205221.png

 イベントパターンを構築で、イベントソースを「AWSイベントまたはEventBridgeパートナーイベント」を選択します。
 さらに、イベントパターンで、イベントソースを「AWSのサービス」、AWSのサービスを「CloudWatch」、イベントタイプを「CloudWatch Alarm State Change」にします。イベントパターンは画像の通りにJSONコードを入力します。
スクリーンショット_20221201_205302.png
スクリーンショット_20221201_205426.png
スクリーンショット_20221201_225932.png

 ターゲットを選択で、ターゲットタイプを「AWSのサービス」、ターゲットを選択を「SNSトピック」、トピックを先ほど作ったトピックにします。
スクリーンショット_20221201_205743.png

 ターゲットを選択の追加設定をクリックします。
 ターゲット入力を設定から、「入力トランスフォーマー」を選択して、「入力トランスフォーマーを設定」を選択します。
スクリーンショット_20221201_205804.png

 入力トランスフォーマーを設定します。
 サンプルイベントを選択し、EventBridgeに渡されるイベントソースを確認して、
スクリーンショット_20221201_205855.png
 入力パスで、サンプルイベントから必要な項目を抽出して変数に代入して、
スクリーンショット_20221201_210258.png
 入力テンプレートで、入力パスで定義した変数を使いながらSNSトピックに渡すメッセージを作っていくという流れです。
 イベントソースは使わずに、入力テンプレートに必要なメッセージを入力するというような使い方も可能です! ただし、改行を含む入力テンプレートは各行をダブルクォーテーションで囲むのが必須のようです。(公式ドキュメント
スクリーンショット_20221214_215338.png

エラー通知メール(加工後のすがた)

スクリーンショット_20221201_225537.png

 だいぶ何言ってるかわかるようになったのではないでしょうか!
 入力テンプレートは記号等を含めて自由に記載できたので、メール受信者の事情(AWSの習熟度や、さっと読みたい/じっくり詳しくエラーの原因を把握したいといったニーズ)に合わせて内容を変えていけるのが良いですね。

感想

 
 AWSは基本英語のサービスだと理解はしていますが、やっぱり日本語の方がうれしい。
 今回Eventbridgeを触ってみて、AWSサービスを呼び出すときはJSON形式でイベントソースを渡していることを改めて認識できました(そういえば、API GatewayからLambda関数を起動するときにJSON形式でイベントを渡していたなぁと思い出したり)。このあたりの理解をもっと深めたら、サービスどうしを組み合わせていろんなことができて楽しそうです。

 

 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1