amareloのブログ(仮)

IT系勉強会で感じた想いや知見をメインに書いていきます。

JAWS-UG CLI専門支部 #153R SNS入門 復習

5/19(火)JAWS-UG CLI専門支部 #153R SNS入門 に参加しました。 こちらもブログの執筆をしていなかったため、復習しながらブログを書きます。

目次

イベントページ

jawsug-cli.connpass.com

ハンズオンでやったこと

以下の通りです。事前準備として、Cloud9上にハンズオン環境を構築しました。 ハンズオンでは、Cloud9のターミナルでコマンド実行します。

  • SNSトピックの構築
  • SNSトピックの購読
  • SNSトピックへの配信

Amazon Simple Notification Service (SNS) とは

マイクロサービス、分散型システム、およびサーバーレスアプリケーションの分離を可能にする、高可用性で、耐久性に優れたセキュアな完全マネージド型 pub/sub メッセージングサービスです(公式より引用)。

SNSのポイントは以下の通りです。誤りなどありましたら、ご指摘いただけると幸いです。

  • AWSの様々なサービスと連携して疎結合サービスを実現できる。
    • Cloudwatch(Billing アラートの通知、メトリクスの閾値超過アラートの通知など)
    • S3(ファイルがアップロードされたときの通知など)
    • など
  • 様々なプロトコルで通知することができる。
    • email
    • 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と書きます。他にもsmslambdasqshttphttpsを指定することができます。
④通知先エンドポイントを指定します。
  • 事前準備で指定した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
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専門支部の活動は知っていたのですが…もっと早く参加するべきでした…(涙)

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