5/19(火)JAWS-UG CLI専門支部 #153R SNS入門 に参加しました。 こちらもブログの執筆をしていなかったため、復習しながらブログを書きます。
目次
- 目次
- 最後に
イベントページ
ハンズオンでやったこと
以下の通りです。事前準備として、Cloud9上にハンズオン環境を構築しました。 ハンズオンでは、Cloud9のターミナルでコマンド実行します。
Amazon Simple Notification Service (SNS) とは
マイクロサービス、分散型システム、およびサーバーレスアプリケーションの分離を可能にする、高可用性で、耐久性に優れたセキュアな完全マネージド型 pub/sub メッセージングサービスです(公式より引用)。
SNSのポイントは以下の通りです。誤りなどありましたら、ご指摘いただけると幸いです。
- AWSの様々なサービスと連携して疎結合サービスを実現できる。
- Cloudwatch(Billing アラートの通知、メトリクスの閾値超過アラートの通知など)
- S3(ファイルがアップロードされたときの通知など)
- など
- 様々なプロトコルで通知することができる。
- SQS
- HTTP/HTTPS
- Lambda
- SMS(モバイル通信)
- メッセージ通信順番は保証されない。
- メッセージサイズは最大256KB(SQSと同じ)
- 一度メッセージを発行したら、メッセージを保持しない。
- SQSはメッセージを取得しても即時削除されない。メッセージ保持期間(60秒~14日間)を定義する必要がある。
- SNSはプッシュ型通信。SQSはポーリング型通信。
ハンズオン
事前作業
以下の2つの事前作業を行います。
1.SNSトピックの構築
①環境変数に東京リージョンを指定します。
- 環境変数を設定するときは
export
コマンドを使います。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SNS_TOPIC_NAME]にSSNSトピック名を指定します。
SNS_TOPIC_NAME='handson-cli-sns-topic'
③変数に正しいパラメータが格納されているか確認します。
cat << END # 0. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 1. SNS_TOPIC_NAME:"handson-cli-sns-topic" SNS_TOPIC_NAME="${SNS_TOPIC_NAME}" END
④SNSトピックを作成します。
- SNSトピックを作る場合は、
sns create-topic
コマンドを使います。 - `--name <トピック名>' でトピック名を指定します。
aws sns create-topic --name ${SNS_TOPIC_NAME}
⑤SNSトピック"handson-cli-sns-topic"が存在することを確認します。
- SNSトピックの存在確認には、
sns list-topics
コマンドを使います。
aws sns list-topics --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \ --output text
2.SNSトピックの購読
①環境変数に東京リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SNS_TOPIC_NAME]にSNSトピック名を指定します。
SNS_TOPIC_NAME='handson-cli-sns-topic'
③変数[SNS_SUBSCRIPTION_PROTOCOL]にSNS通知プロトコル名を指定します。
SNS_SUBSCRIPTION_PROTOCOL='email'
- 今回はメール送信のため、
email
と書きます。他にもsms
やlambda
、sqs
、http
・https
を指定することができます。
④通知先エンドポイントを指定します。
- 事前準備で指定したtmpファイルを指定します。
- tmpファイルに書かれているメールアドレスを読み取るためです。
DIR_TMP="${HOME}/environment/tmp-handson-cli-sns"
FILE_TMP="${DIR_TMP}/mail_address.tmp" \ && echo ${FILE_TMP}
- 一時ファイルを
source
コマンドで読み込みます。source
コマンドは、ファイルに書かれているコマンドを、開いたシェルで実行するためのコマンドです。
source ${FILE_TMP}
- 変数[SNS_SUBSCRIPTION_ENDPOINT]に通知先エンドポイントを指定します。
SNS_SUBSCRIPTION_ENDPOINT="${MAIL_ADDRESS}" \ && echo ${SNS_SUBSCRIPTION_ENDPOINT}
⑤正しいパラメータ値が格納されていることを確認します。
cat << END # 0. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 1. SNS_TOPIC_NAME:"handson-cli-sns-topic" SNS_TOPIC_NAME="${SNS_TOPIC_NAME}" # 2. SNS_SUBSCRIPTION_PROTOCOL:"email" SNS_SUBSCRIPTION_PROTOCOL="${SNS_SUBSCRIPTION_PROTOCOL}" # 3. SNS_SUBSCRIPTION_ENDPOINT:"<通知先メールアドレス>" SNS_SUBSCRIPTION_ENDPOINT="${SNS_SUBSCRIPTION_ENDPOINT}" END
⑥トピックARNを取得します。
SNS_TOPIC_ARN=$( \ aws sns list-topics \ --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \ --output text \ ) \ && echo ${SNS_TOPIC_ARN}
⑦SNSトピックを購読(サブスクリプションを作成)します。
- SNSトピックにサブスクリプションを作成するためには、
sns subscribe
コマンドを使います。 --topic-arn
でトピックのarnを指定します。--protocol
でサブスクライブするエンドポイントのタイプ を指定します。--notification-endpoint
で、サブスクライブ先を指定します。
aws sns subscribe --topic-arn ${SNS_TOPIC_ARN} \ --protocol ${SNS_SUBSCRIPTION_PROTOCOL} \ --notification-endpoint ${SNS_SUBSCRIPTION_ENDPOINT}
- コマンド実行後、以下のように表示されます。
{ "SubscriptionArn": "pending confirmation" }
- 登録したメールアドレスに"AWS Notification - Subscription Confirmation"という標題のメールが届きます。
- "Confirm subscription"リンクをクリックして承認します。
⑧サブスクリプションが存在することを確認します。
sns list-subscriptions-by-topic
コマンドを使って、エンドポイントの存在確認とサブスクリプションARNが存在確認をします。通知先の存在確認をします。
--topic-arn
でトピックARNを指定します。
aws sns list-subscriptions-by-topic --topic-arn ${SNS_TOPIC_ARN} \ --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].Endpoint" \ --output text
- サブスクリプションARNの存在確認をします。
aws sns list-subscriptions-by-topic --topic-arn ${SNS_TOPIC_ARN} \ --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].SubscriptionArn" \ --output text
3.SNSトピックへのメッセージの配信
①環境変数に東京リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SNS_TOPIC_NAME]にSNSトピック名を指定します。
SNS_TOPIC_NAME='handson-cli-sns-topic'
③変数[SNS_MESSAGE_BODY]にメッセージ本文を指定します。
SNS_MESSAGE_BODY='Hello World!'
④変数[SNS_MESSAGE_SUBJECT]にメールタイトルを指定します。
SNS_MESSAGE_SUBJECT='Message handson-cli-sns'
⑤通知先エンドポイントを指定します。
- 事前準備で指定したtmpファイルを指定します
DIR_TMP="${HOME}/environment/tmp-handson-cli-sns"
FILE_TMP="${DIR_TMP}/mail_address.tmp" \ && echo ${FILE_TMP}
- 一時ファイルをsourceコマンドで読み込みます。
source ${FILE_TMP}
- 通知先エンドポイントを指定します。
SNS_SUBSCRIPTION_ENDPOINT="${MAIL_ADDRESS}" \ && echo ${SNS_SUBSCRIPTION_ENDPOINT}
⑥変数に正しいパラメータ値が格納されていることを確認します。
cat << END # 0. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 1. SNS_TOPIC_NAME:"handson-cli-sns-topic" SNS_TOPIC_NAME="${SNS_TOPIC_NAME}" # 2. SNS_MESSAGE_BODY:"Hello World!" SNS_MESSAGE_BODY="${SNS_MESSAGE_BODY}" # 3. SNS_MESSAGE_SUBJECT:"Message handson-cli-sns" SNS_MESSAGE_SUBJECT="${SNS_MESSAGE_SUBJECT}" # 4. SNS_SUBSCRIPTION_ENDPOINT:"<通知先メールアドレス>" SNS_SUBSCRIPTION_ENDPOINT="${SNS_SUBSCRIPTION_ENDPOINT}" END
⑦トピックARNを取得します。
SNS_TOPIC_ARN=$( \ aws sns list-topics \ --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \ --output text \ ) \ && echo ${SNS_TOPIC_ARN}
⑧SNSトピックにメールメッセージを配信します。
publist
コマンドを使ってメッセージを配信します。--topic-arn
でトピックのARNを指定します。--message
でメッセージ本文を指定します。--subject
でメールタイトルを指定します。
aws sns publish \ --topic-arn ${SNS_TOPIC_ARN} \ --message "${SNS_MESSAGE_BODY}" \ --subject "${SNS_MESSAGE_SUBJECT}"
- コマンド実行後、エンドポイントにメール送信されます。
- メールを受信していることを確認します。
4.後片付け
ハンズオン環境が不要な場合は、以下の作業を実施します。
最後に
明日6/8(月)のEC2基礎(VPC)を前に、これまでの復習が完了して良かったです!コマンドの復習だけでなく、サービスの概要も復習することができました。SAAやプラクティショナーを受験する前に受けておきたかった内容でした。プラクティショナー受験前からCLI専門支部の活動は知っていたのですが…もっと早く参加するべきでした…(涙)
最後まで読んでいただき、ありがとうございました!