🦁

AWS SNSトピックとサブスクライブを設定してみた

2023/12/29に公開

はじめに

こんにちは!みゃっちーです。🦔

AWS SCS試験ただ勉強してももったいないから面白そうな構成作ってみよう第3弾です。
今回はCloudWatchメトリクスの値を参照してメールを送信するようにしてみたいと思います!

想定している全体像

想定している全体像は下記の通りです。

AWS CloudTrailでユーザのAPI履歴をS3、CloudWatchLogsに送信し、特定のアラートでSNSでメールを送信する。

前々回の記事
赤色で囲ったAWS CloudTrailの証跡をCloudWatch logsに取得する構築
前回の記事
青枠で囲った部分のCloudWatch メトリクスフィルターの設定を行い、EC2作成イベントの抽出

ときて今回は緑色のCloudWatchアラートが発行されたときに格納するSNSトピックとメールを送信するサブスクリプションを構築していきます!

AWS SNS とは?

公式にはこのように記載があります。

Amazon Simple Notification Service (Amazon SNS) は、配信者から受信者 (または生産者から消費者) へのメッセージ配信を提供するマネージドサービスです。・・・クライアントは、Amazon Kinesis Data Firehose、Amazon SQS、AWS Lambda、HTTP、E メール、モバイルプッシュ通知、モバイルテキストメッセージ (SMS) などのサポートされたエンドポイントを使用して SNS トピックにサブスクライブし発行されたメッセージを受信できます。

https://aws.amazon.com/jp/sns/

簡単にいうとトピック(入れ物)に入ったデータを欲しい人がそのトピックをサブスクライブ(購読)し様々な方法でトピックの中のメッセージを受信できるサービスです。今回はトピックの中にEC2の作成アラートを入れて、それをサブスクライブしてEmailで送ってもらうという用途で使用します。

やってみた

1.マネジメントコンソールでSNSトピック作成をクリック

2.トピックの作成設定

まず初めにトピックを作成しますが、下記の2種類が用意されていています。

FIFOとStandardの違い

この両者の違いはこちらにわかりやすく書いてありますがまとめるとこんな感じです。
https://aws.amazon.com/jp/sns/features/

FIFO

  • 使用シナリオ: オペレーションやイベントの厳密な順序が必要な場合や、重複を許容できないアプリケーションで利用されます。

    • 例)銀行取引のログ、株価のモニタリング、フライトトラッキング、在庫管理、最新価格表示アプリケーションなどに適しています。
  • スループット: FIFO トピックでは、毎秒最大で300件のメッセージ、もしくはFIFOトピックあたりで毎秒10MBに対応しています(先に発生したメッセージが優先)。

  • 順序付け: メッセージの順序は厳密に維持され、公開または配信した順序(先入れ先出し)が守られます。

Standard

  • 使用シナリオ: 順番が重要でない場合や、メッセージが順不同でもアプリケーションが適切に処理できる場合に利用されます。

    • 例)メディアエンコーディング、不正検出、税額計算、検索インデックス、アラートアプリケーションなどに適しています。
  • スループット: 標準トピックでは、1秒あたりにほぼ上限のないメッセージ数をサポートします。

  • 順序付け: メッセージの順序はベストエフォート型であり、公開された順番と異なる順序で配信される可能性があります。

その他作成オプション

暗号化

KMSを使ってSNSトピックの暗号化を行うことができ、暗号化、複合化のタイミングはこのように記載されています。

Amazon SNS を受信するとすぐにメッセージを暗号化します。メッセージは暗号化された形式で保存され、Amazon SNS は送信時にのみメッセージを復号化します。

https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html

アクセスポリシー

トピックに対してアクセスを行うユーザや用途を指定することができます。ポリシーの例としては下記のようなものがあります。

  • 特定のAWSアカウントのみトピックにアクセス可能にする
  • 通知配信プロトコルを HTTPS に制限する
  • 特定の VPC エンドポイントからのみ Amazon SNS トピックへの公開を制限する

などなど様々な指定が可能で、パターンや構文はこちらにわかりやすく記載されています。
https://docs.aws.amazon.com/sns/latest/dg/sns-access-policy-use-cases.html

データ保護ポリシー

データの中に機密情報がある場合に配信されないようにしたり、マスキングを行うことができます。こちらに例と設定方法がこちらにわかりやすく書いてあります。
https://docs.aws.amazon.com/sns/latest/dg/sns-message-data-protection-examples.html

配信ポリシー

HTTP/S エンドポイントへの配信再試行の設定を行います。これはマネジメントコンソールの画面でテンプレートが用意されており一番分かりやすいかと思います。

配信ステータスのログ記録

メッセージを配信したときのログをCloudWatch Logsに書き込む設定を行えます。

配信されたときにログを送信させるプロトコルとCloudWatch Logsに書き込むためのIAMロールを設定します。

アクティブトレース

このようにSNSでメッセージを扱うときの分析を行うことができます。

Amazon SNS で X-Ray トレースを使用して、メッセージとそのバックエンド サービスのレイテンシー (トピック内でのリクエストの所要時間や、トピックの各サブスクリプションにメッセージを配信するのにかかる時間など) を分析します。

https://docs.aws.amazon.com/xray/latest/devguide/xray-services-sns.html

今回の設定

上記を踏まえて今回はこのように設定をおこないました。

  • タイプ: スタンダード
  • 名前: EC2topic
  • 暗号化: なし
  • アクセスポリシー: トピックの作成ユーザのみ格納、サブスクライブが可能
  • データ保護ポリシー: なし
  • 配信ポリシー: なし
  • 配信ステータスポリシー: なし
  • アクティブトレース: なし

SNS サブスクリプションの作成

次にトピックにメッセージが格納されたときに配信する先を設定します。

1.マネジメントコンソールでSNSサブスクリプション作成をクリック

2.サブスクリプション作成設定

各設定項目はこのようにしました。

  • トピックARN: 作成したSNSトピックを選択
  • プロトコル: Eメール
  • エンドポイント: 通知を行いたいメールアドレス
  • サブスクリプションフィルターポリシー: オフ
    • 送信するメールのメッセージヘッダー、本文にここで指定したメッセージが含まれている場合のみ送信する設定
  • Redrive ポリシー (デッドレターキュー): オフ
    • 送信に失敗したメールをSQSに格納する設定

サブスクリプションフィルターポリシー

特定のメッセージがある場合や、数値に条件を持たせて取得する内容をフィルターすることができます。
このフィルタの設定方法は公式からハンズオン資料が出ているのでこちらを参考にするのがいいと思いました。
https://aws.amazon.com/jp/tutorials/filter-messages-published-to-topics/

Redrive ポリシー (デッドレターキュー)

配信が不能だったメッセージをSQSに格納することができます。
https://zenn.dev/amarelo_n24/articles/e20da70629c77e

3.サブスクリプションの確認

この登録を完了すると、すぐにメールにSNSトピックの内容が送信されるわけではなく、一度確認のメールが送信されるのでそこに記載されているURLをクリックする必要があります。

翻訳です

AWSの通知 - サブスクリプション確認

以下のトピックにサブスクライブすることを選択しました:
arn:*******************************

このサブスクリプションを確認するために、以下のリンクをクリックするか訪れてください(もし誤りであれば何もする必要はありません):
[サブスクリプションを確認する]

このメールに直接返信しないでください。今後のSNSサブスクリプション確認のリクエストを受け取りたくない場合は、sns-opt-out へのメールを送信して自分自身を登録解除してください。

サブスクリプションを確認するを選択するとこのようなページに飛び、確認が完了します。
また、このページのリンクをクリックすると登録が解除されます。

翻訳です

サブスクリプションが確認されました!

正常にサブスクライブされました。

あなたのサブスクリプションのIDは次のとおりです:
arn:***************************************************

もしサブスクライブが意図しないものであれば、こちらをクリックして登録解除してください。

確認が完了するとこのようにステータスが「確認済み」に変わります。

トピックにメッセージを入れてみる

ここからテストのメッセージを入れることができます。

すると、このようにテストメールがしっかりと届きました!

翻訳です

このトピックからの通知を受け取りたくない場合は、以下のリンクをクリックするか訪れて登録解除してください:
[登録解除]

このメールに直接返信しないでください。このメールに関する質問やコメントがある場合は、以下のリンクからお問い合わせください:
[Amazon Web Services サポート]

このメールのURLはサブスクリプションの解除URLで、クリックするとこのように削除できます。

さいごに

ここまで読んでいただきありがとうございました!

次回はCloudWatchアラームの先をこのトピックに設定して、EC2が特定の時間の間に特定の台数以上立ち上げられた時にメールが来るようにしていきます!

Discussion