クラウドエンジニアとして仕事をしていると、新しくアプリケーションを立ち上げる場面にも遭遇することがあります。
その時に出てくる1つの課題として、システムアラートが発生した場合、アラートを検知して管理者にメールやSlackで通知を飛ばしたい、といったことが考えられます。
そのような時に効果を発揮するのがAWSフルマネージド型のメッセージ配信サービス、Amazon SNS(Amazon Simple Notification Service)です。
こちらの記事では、Amazon SNSの基本を解説し、Terraformを使ったハンズオンを行います。
普段はあまり触れる機会のないサービスかもしれません。
しかし、実際の業務では触れることが多いサービスのため、基本をしっかり理解しましょう。
Amazon SNSとは
Amazon SNS(Amazon Simple Notification Service)とは、AWSが提供するメッセージ配信サービスで、主に通知に使われるサービスです。SNSを利用すると、Publish-Subscriber(Pub-Sub)モデルと呼ばれる、非同期なメッセージの配信を実現することができます。
SNSでは、メッセージの発信元をPublisher(発行者)、メッセージの受信側をSubscriber(購読者)と表現します。
PublisherとSubscriberの挙動
SNSでは、「Publisher」と「Subscriber」の関係を理解しておくことがポイントです。
Publisherはメッセージの発信元となり、何かイベントが発生した際にSNSへ情報を発信します。
SNSがその情報を受け取り、Subscriberへ受け取った情報を転送します。
PublisherとSubscriberの仲介役としてSNSが存在すると捉えると、理解しやすいかもしれません。
このように、SNSは何かのイベントをトリガーにして情報を受け取り、送信先へデータを転送するため「イベント駆動型」のシステムと呼ばれます。
Amazon SNSのユースケース
SNSの主な使い方にはどのようなケースが考えられるのかを解説します。
クラウドエンジニアとして業務に携わる場合、アラートが発生したタイミングでの運用者への通知や、アプリケーション内で会員登録が発生したタイミングで顧客へ通知を送りたい、といった要件が発生し対応することが考えられます。こういった要件に対応するためにも、ぜひSNSの活用方法を押さえておきましょう。
出典: https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html
アラート発生をもとに通知する
EC2などに設定したしきい値をトリガーとして、SMS(テキストメッセージ)やEメール、Slackに通知を飛ばすことが可能です。
例として、EC2のAuto Scaling GroupにCPU使用率80%を超えたらアラートを発生させるよう設定したとします。通常はCloudWatchのアラート画面で発生状況を確認することが可能ですが、SNSに設定をすることでアラートが発生した際に登録したメールアドレス、Slackに通知を飛ばすことができます。
こうすることで、システム管理者がいち早くアラートに気づくことができ、より迅速にアラート解消へ向け動き出すことができます。
CloudWatchのアラートについては、以下記事で解説しています。
https://envader.plus/article/358
ユーザーへの通知
SNSは、EメールやSMSを個人や作成したグループへ送信することができます。
例えば、ECサイトなどでユーザーが商品を購入し、注文が確定した時に注文確認のメールを送信する。
アプリへ登録する際に、登録した電話番号へ認証するためのSMSメッセージを送信するなどです。
私たちが普段様々なサービスを利用する時に何気なく使っている機能を、SNSを使うことで実現することができます。
モバイルへのプッシュ通知
スマートフォンやタブレットなどのモバイルデバイスで使用されているアプリケーションに、直接通知を送信することができます。
具体的には、使用していたアプリケーションの新しいバージョンがリリースされた場合に、「新しいアプリケーションの更新が利用可能です。ここをクリックしてダウンロードしてください」というメッセージをSNSへ登録しておくことで、SNSへ登録してあるモバイルデバイスにプッシュ通知を送信することができます。
Amazon SNSの用語解説
このセクションでは、Amazon SNSを理解する上で基本となる用語を解説します。
Publisher
メッセージの発行元をPublisherと呼び、PublisherがTopicへメッセージを発行(送信)します。
SMSの発行や、AWS SDKやAPIを使ってメッセージを発行するアプリケーションの構築、CloudWatchやS3でのイベント発生をトリガーとしてメッセージを発行することが可能です。
Topic
メッセージの発行元のPublisher、配信先のSubscriberの仲介役として存在するのがTopicです。
Publisherからメッセージを受け取り、Topicは受け取ったメッセージをSubscriberへ送信します。
SNSのTopicには「スタンダード」と「FIFO」の2種類が存在します。
2種類の特徴を以下にまとめました。
スタンダード | FIFO | |
---|---|---|
配信順序 | 順序が保証されない | 同じメッセージグループIDであれば順序が保証される |
配信方式 | メッセージが重複していても配信する | 重複を排除して1回のみメッセージを配信する |
スループット | ほぼ無制限のスループットを実現できる | 最大300件/秒のメッセージ処理が可能 |
https://aws.amazon.com/jp/sns/features/
Subscriber
Subscriberとは、SNS Topicからメッセージを受け取る側のことで、TopicをSubscribe(購読)する最終地点を意味します。
Subscriberはプロトコルとして指定し、以下を指定することが可能です。
SMS](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-mobile-phone-number-as-subscriber.html)
https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html
TerraformでAmazon SNSを実装してみよう
ここからはTerraformを使ってSNSを実装してみましょう。
Terraformにはインストールなどの設定が必要になります。
Terraformの環境構築については次の記事で解説しています。
https://envader.plus/article/162
versions.tfの作成
はじめに、どのTerraformバージョンやプロバイダーのバージョンを使うかを指定するため、versions.tf
を作成します。
# versions.tf
terraform {
required_version = ">= 1.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.3.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
main.tfの作成
次にmain.tf
を作成します。
このファイルで、SNSのTopic、Subscriptionを作成します。
output
でSNS TopicのARNを取得します。このARNを使って、SNSを作成後自身のメールアドレスにテスト通知を行います。
# main.tf
# SNS Topicの作成
resource "aws_sns_topic" "send_to_email_topic" {
name = "send_to_email_topic"
}
# SNS Subscription
resource "aws_sns_topic_subscription" "send_to_email_subscription" {
topic_arn = aws_sns_topic.send_to_email_topic.arn
protocol = "email" # どのプロトコルを使用するか。今回はメールを指定。
endpoint = "xxxxxxxxxx@gmail.com" # 通知したい自身のメールアドレスを入力。
}
# output
output "sns_topic_arn" {
value = aws_sns_topic.send_to_email_topic.arn
}
SNSリソースの作成
ファイルの記述が完了したら、terraform init
を実行し初期化します。
terraform init
初期化完了後、terraform plan
とterraform apply
を実行しリソースを作成します。
terraform plan
terraform apply
apply
が完了すると、SNSから登録したメールアドレスへ承認メールが送信されるため、「Confirm subscription」をクリックします。
クリック後、以下の画面が表示されることを確認します。
これで、メッセージの送信先であるSubscriberを登録することができました。
outputで出力されたTopicのARNはテストメッセージの送信で利用するため、忘れずに保存しておきます。
AWS CLIを使ってテストメッセージを送信する
最後に、Subscriberである登録したメールアドレスへテストメッセージを送信します。
今回はAWS CLIを使ってメッセージを送信します。
ここでは、outputで取得したTopicのARNを指定してメッセージを送信します。
# aws cliでテストメッセージを送る基本構文
aws sns publish --topic-arn <your-sns-topic-arn> --message "My Test message"
# ARNを指定する場合
aws sns publish --topic-arn "arn:aws:sns:ap-northeast-1:xxxxxxxxxxx:send_to_email_topic" --message "My Test message"
コマンド実行後、登録したメールアドレスへSNSからメッセージが送信されるので、確認しましょう。
まとめ
今回はAmazon SNSの基本を解説し、Terraformを使ったハンズオンを通じてSNSの設定と通知の実践を行いました。SNSはシステムアラートやユーザーへの通知を実現でき、AWSの他のサービスと連携することでより柔軟な通知システムを構築することができます。
SNSを使ってシステムの監視や通知を自動化し、運用の効率化とサービスの品質向上を実現しましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.07.31
Terraformハンズオン】EC2のスケールアウトをスケジュールしてみよう
こちらの記事では、IaCツールのTerraformを使用し、EC2インスタンスのスケールアウトをスケジュールして実行する方法を解説します。
- AWS
- ハンズオン
2024.05.26
AWS環境に安全にリモート接続するためのAWS Client VPNの設定ハンズオン
この記事では、前回作成したACM証明書を使用してAWS Client VPNを設定し、セキュアなリモートアクセス環境を構築する手順を説明します。これにより、ユーザーが安全にAWSリソースにアクセスできるようになります。前回の記事がまだ完了して居ない方はこちらをご参照になり、ACM証明書の作成までを行なってください。
- インフラエンジニア
- サイバーセキュリティ
- ハンズオン
2024.04.17
【ハンズオン】Amazon S3にホストされた静的サイトにCognitoを用いた認証を追加
このハンズオンでは、Amazon Web Services(AWS)のサービスを活用して、静的ウェブサイトに安全なユーザー認証機能を実装する方法を学んでいきます。Cognitoを利用した安全な認証システムを構築し、読者だけに記事や動画を限定公開することができるようになります。
- AWS
- ハンズオン