前提知識
SNSとは・・?
Amazon Simple Notification Service (SNS) は柔軟なフルマネージド型の pub/sub メッセージング/モバイル通知サービスで、登録中のエンドポイントやクライアントに配信するメッセージを調整できます。SNS を使用すると、分散システムやサービス、モバイルデバイスなど、多数の受信者にメッセージをファンアウトすることができます。 任意の規模のすべてのエンドポイントで通知をセットアップ、操作、および確実に送信できます。 AWS マネジメントコンソール、AWS コマンドラインインターフェイス、または AWS SDK のわずか 3 つのシンプルな API を使用して、ほんの数分で SNS を使い始めることができます。 SNS を使用することにより、専用メッセージングソフトウェアやインフラストラクチャの管理や運用に関連した複雑さやオーバーヘッドが排除されます。
AWSのSNS解説部より引用
端的に2つのサービスがあります。
-
- pub/subメッセージング
- 特定の通知先を登録しとくと、SNSに通知が来たときにそこへ通知する機能
-
- モバイル通知
- SNSに通知が来たときに、iosやAndroid等のモバイル端末へPush通知出来る機能
どんな時に使われるのか
例えば、ユーザから問い合わせが来た時に、SNSに通知するようにしていて、
その通知先としてEmailを選択しておけば自分のメールアドレスに通知する。
とかも可能です。
いきなり通知すれば良いじゃん?
と思うかもしれませんが、SNSを挟んでおくと、Subscriptionといって通知先を複数登録することが出来るので、例えば急に「やっぱメールも良いんだけど、その場でDBに登録もしてくんね?」等の要望が出てきた場合、SNSなら通知先をLambaやSQSにすることも可能なので、そこへ通知することで、メール通知と同時に登録等も簡単に出来ます。
つまり、イベント起きた後にxxする部分を抽象化出来る訳ですので、
使う側(SNSに通知を送る人)としては、通知先と通知方法さえ知っとけば、その先に何が行われるか知ってる必要も無ければ、要件が変わったときにこちら側を修正する必要もない。
早速SNSのTopicを作ってみる
作り方は、これも公式みれば書いてあるので参考にしてみます。
snsのtopicを作る時にはname
だけが必須で、他はオプションとなってます。
policyの設定方法は、これも公式を参照すると分かりやすいです。
さらに、sns_topic_subscriptionで、SNSの通知先も設定出来ます。
サポートされてるプロトコルを見るとわかりますが、ここでは、email
, email-json
, sms
は未サポートでした。
(これらをsubscriptionにしたい場合は、コンソール上から設定する必要があります)
なので今回は、SQSをsubscriptionに設定したSNS Topicを作ります。
# SNS
resource "aws_sns_topic" "test_sns" {
name = "test_sns_topic"
}
# SQS
resource "aws_sqs_queue" "test-sqs" {
name = "test_sqs"
}
# 全ての権限のpolicyを与える
resource "aws_sqs_queue_policy" "sqs_queue_polycy" {
queue_url = "${aws_sqs_queue.test-sqs.id}"
policy = <<POLICY
{
"Version": "2012-10-17",
"Id": "sqspolicy",
"Statement": [
{
"Sid": "First",
"Effect": "Allow",
"Principal": "*",
"Action": "sqs:*",
"Resource": "${aws_sqs_queue.test-sqs.arn}"
}
]
}
POLICY
}
# SNSのsubscriptionにSQSを登録
resource "aws_sns_topic_subscription" "sub_to_sqs" {
topic_arn = "${aws_sns_topic.test_sns.arn}"
protocol = "sqs"
endpoint = "${aws_sqs_queue.test-sqs.arn}"
}```
簡単にやるとこんな感じですね。
## 実際にSNSに通知して、SQSにキューが貯まるかチェック
$ aws sns publish --target-arn "arn:aws:sns:ap-northeast-1:138710906407:test_sns_topic" --message "hello world"
{
"MessageId": "39995d19-8000-5e5d-ab10-0f3eb8c4dabc"
}
![スクリーンショット 2017-09-04 20.19.28.png](https://qiita-image-store.s3.amazonaws.com/0/23276/6e3f1cec-5d5a-b4e7-e90b-f978b30a5e31.png "スクリーンショット 2017-09-04 20.19.28.png")
良い感じです。
このように、SNSやSQSもterraformを使えば簡単に作成や設定が可能です。