LoginSignup
0
0

More than 1 year has passed since last update.

CloudShell・Cloud9でのSNS作成

Posted at

はじめに

私は大学卒業後に新卒でITとは無縁のアナログな会社に営業として6年勤務後に現在のSESに未経験から転職して1年ほど。

経験した言語はPython・C#・Js
インフラの仕事をしたい訳ではなかったが、知識がなさすぎてやばいと思い個人的に勉強を始めAWSにたどり着いた。
目的がないと続かないと性格なので何やら流行っているAWS認定試験を合格を目指そうと思い以下を合格済み
・クラウドプラクティショナー 
・ソリューション・アーキテクト・アソシエイト 

現在はAWSエンジニアとして転職できるように勉強している。

この記事を書いた理由

オンラインでの勉強会に参加した際に
アウトプットするまでが勉強
という言葉から記事を書くというアウトプットをすることにした。
学んだことの復習をします。

アウトプット経験の少なさとそもそも学歴がないので文章力のかけた内容となる可能性もあると思いますがご理解のほどよろしくお願いします。
間違い、最善の策等のご指摘は喜びます。

内容について

connpassでJAWS-UG CLI専門支部でCLIハンズオンイベントで学んだことのアウトプット
イベント内での作業手順と同等の内容となっている部分も多くあると思います。
今回はタイトル通りSNSを作成し、自身のメールアドレスにSNSを飛ばすところまで実施する。

作業環境

・OSとバージョン
Amazon Linux release 2 (Karoo)
・シェルとバージョン
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
・AWS CLIのバージョン
aws-cli/1.20.56 Python/3.7.10 Linux/4.14.246-187.474.amzn2.x86_64 botocore/1.21.56

CloudShellとCloud9を使用します。

そもそもSNSとは

・モバイルプッシュ通知やSMS送信など様々なメディアに対応した分散型フルマネージド通知サービス ・発信する側をパブリッシャー・受信する側をサブスクライバーと言い、Pub/Subモデルとも呼ばれている。 ・発信する側受信する側へのメッセージをプッシュする一方通行 ・Kinesis Data Firehose、SQS、Lambda、HTTP、E メール、モバイルプッシュ通知、モバイルテキストメッセージ (SMS) などのサポートされたエンドポイントを使用して SNS トピックにサブスクライブし発行されたメッセージを受信できる。 ・基本料金、前払いは必要なく完全な従量課金制 ・モバイルプッシュ通知は100万件まで、SMSは100件まで、Eメールは1,000件まで無料利用枠で送信をすることができる。 ・1つのメッセージを多数のサービスが並列非同期処理ができ1対多の関係

SQSとの違い

SQSはマネージド型のメッセージキューイングサービスで、マイクロサービス、 分散システム、およびサーバーレスアプリケーションの切り離しとスケーリングが可能 ・非同期式サービス対サービス通信の一つの形で、サーバレス及びマイクロサービスで使われる ・送信側はキューと呼ばれる場所にメッセージを保存 ・受信者はポーリングをして、キューがあれば取得する ・メッセージを最大14日保存可能 ・処理・削除されるまでは保存される(受信されてもキューに残り、自動的に削除されない) ・各メッセージは1つの受信者によって1回だけ処理される1対1の関係 ・サービスや機能の間に依存性を分離させ、拡張性と安定性が高いシステムを構築

AWS CloudShell・Cloud9とは

CloudShell・・・AWSを操作するためのコマンドラインツール(あの黒い画面のやつです)

Cloud9・・・ブラウザのみでどのマシンからでもコードを記述、実行、デバッグできる、クラウドベースの統合開発環境 (IDE)

作業手順

以下CloudShellで実施
インスタンスプロファイルのIAMロールへのIAMポリシーのアタッチ (AmazonSNSFullAccess)
目的・・・インスタンスプロファイルにアタッチされているIAMロールに
IAMポリシー(AmazonSNSFullAccess)をアタッチする

1、インスタンスプロファイル名を指定

IAM_INSTANCE_PROFILE_NAME='handson-cloud9-instance-profile' 

2、IAMポリシー名を指定

IAM_POLICY_NAME='AmazonSNSFullAccess'

3、設定値の確認

cat << END
IAM_INSTANCE_PROFILE_NAME:"handson-cloud9-instance-profile"
       IAM_INSTANCE_PROFILE_NAME="${IAM_INSTANCE_PROFILE_NAME}"
IAM_POLICY_NAME:"AmazonSNSFullAccess"
       IAM_POLICY_NAME="${IAM_POLICY_NAME}"

END

4、IAMロール名の取得

IAM_ROLE_NAME=$( \
  aws iam get-instance-profile \
    --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
    --query 'InstanceProfile.Roles[].RoleName' \
    --output text \
) \
  && echo ${IAM_ROLE_NAME}
//(出力結果) handson-cloud9-environment-role

5、IAMポリシーのARNを取得

IAM_POLICY_ARN=$( \
  aws iam list-policies \
    --scope AWS \
    --max-items 1000 \
    --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
    --output text \
) \
  && echo "${IAM_POLICY_ARN}"
// (出力結果) arn:aws:iam::aws:policy/AmazonSNSFullAccess

6、 設定値の確認

cat << END

  # IAM_ROLE_NAME:"handson-cloud9-environment-role"
    IAM_ROLE_NAME="${IAM_ROLE_NAME}"
  # IAM_POLICY_ARN:"arn:aws:iam::aws:policy/AmazonSNSFullAccess"
    IAM_POLICY_ARN="${IAM_POLICY_ARN}"

END

7、IAMポリシーをアタッチ

aws iam attach-role-policy \
  --role-name ${IAM_ROLE_NAME} \
  --policy-arn ${IAM_POLICY_ARN}

8、完了確認(インスタンスプロファイル"handson-cloud9-instance-profile"がアタッチされているIAMロールにIAMポリシー"AmazonSNSFullAccess"がアタッチされている)

aws iam list-attached-role-policies \
  --role-name ${IAM_ROLE_NAME} \
  --query "AttachedPolicies[?PolicyName == \`${IAM_POLICY_NAME}\`].PolicyName" \
  --output text
//AmazonSNSFullAccess

以下からCloud9で実施

目的・・・メールアドレス登録用の一時ファイル

"${HOME}/environment/tmp-handson-cli-sns-novice/mail_address.tmp"を作成

1、メールアドレスの指定

MAIL_ADDRESS="<事前に用意したメールアドレス>"
  1. 一時ファイル用ディレクトリの指定
DIR_TMP="${HOME}/environment/tmp-handson-cli-sns-novice"

2、ディレクトリが存在することを確認し、存在しない場合は作成

ls -d ${DIR_TMP} > /dev/null 2>&1 \
  || mkdir -p ${DIR_TMP}

3、 一時ファイルファイル名の指定

FILE_TMP="${DIR_TMP}/mail_address.tmp" \
  && echo ${FILE_TMP}

4、設定値の確認

cat << END

  # 1. MAIL_ADDRESS:"<通知先メールアドレス>"
       MAIL_ADDRESS="${MAIL_ADDRESS}"
  # 2. DIR_TMP:"${HOME}/environment/tmp-handson-cli-sns-novice"
       DIR_TMP="${DIR_TMP}"
  # 3. FILE_TMP:"${HOME}/environment/tmp-handson-cli-sns-novice/mail_address.tmp"
       FILE_TMP="${FILE_TMP}"

END

5、一時ファイルを作成

cat << END

  # MAIL_ADDRESS:"<通知先メールアドレス>"
    MAIL_ADDRESS="${MAIL_ADDRESS}"
  # FILE_TMP:"${HOME}/environment/tmp-handson-cli-sns-novice/mail_address.tmp"
    FILE_TMP="${FILE_TMP}"

END
// MAIL_ADDRESS='<通知先メールアドレス>'

6、完了確認

ls ${FILE_TMP}
// ${HOME}/environment/tmp-handson-cli-sns-novice/mail_address.tmp

SNSトピックを構築する

1、リージョンの指定

export AWS_DEFAULT_REGION='ap-northeast-1'

2、SNSトピック名

SNS_TOPIC_NAME='handson-cli-sns-novice-topic'

3、設定値の確認

cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. SNS_TOPIC_NAME:"handson-cli-sns-novice-topic"
       SNS_TOPIC_NAME="${SNS_TOPIC_NAME}"

END

4、SNSトピックを作成

cat << END

  # SNS_TOPIC_NAME:"handson-cli-sns-novice-topic"
    SNS_TOPIC_NAME="${SNS_TOPIC_NAME}"

END
aws sns create-topic \
  --name ${SNS_TOPIC_NAME}
// {
//  "TopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-sns-novice-topic"
//}

5、SNSトピック"handson-cli-sns-novice-topic"が存在する事を確認

aws sns list-topics \
  --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
  --output text

SNSトピックへのメールアドレス登録

目的・・・SNSトピック"handson-cli-sns-novice-topic"にメールアドレス"<通知先メールアドレス>"を登録
1、リージョンの指定

export AWS_DEFAULT_REGION='ap-northeast-1'

2、SNSトピック名を指定

SNS_TOPIC_NAME='handson-cli-sns-novice-topic'

3、SNS通知プロトコル名を指定

SNS_SUBSCRIPTION_PROTOCOL='email'

4、通知先エンドポイント

DIR_TMP="${HOME}/enviroment/tmp-handson-cli-sns-novice"
FILE_TMP="${DIR_TMP}/mail_address.tmp" && echo ${FILE_TMP}
// ${HOME}/environment/tmp-handson-cli-sns-novice/mail_address.tmp

5、一時ファイルの読み込み

source ${FILE_TMP}

6、通知先エンドポイントを指定

SNS_SUBSCRIPTION_ENDPOINT="${MAIL_ADDRESS}" \ 
&& echo ${SNS_SUBSCRIPTION_ENDPOINT}
// 通知先メールアドレス

7、設定値の確認

cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. SNS_TOPIC_NAME:"handson-cli-sns-novice-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

8、SNSトピックのARNを取得する

SNS_TOPIC_ARN=$( \
  aws sns list-topics \
    --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
    --output text \
) \
  && echo ${SNS_TOPIC_ARN}
// arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-sns-novice-topic

9、設定値の確認

cat << END

  # SNS_TOPIC_ARN:"arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-sns-novice-topic"
    SNS_TOPIC_ARN="${SNS_TOPIC_ARN}"
  # SNS_SUBSCRIPTION_PROTOCOL:"email"
    SNS_SUBSCRIPTION_PROTOCOL="${SNS_SUBSCRIPTION_PROTOCOL}"
  # SNS_SUBSCRIPTION_ENDPOINT:"<通知先メールアドレス>"
    SNS_SUBSCRIPTION_ENDPOINT="${SNS_SUBSCRIPTION_ENDPOINT}"

END

10、SNSトピックにメールアドレスを登録

aws sns subscribe \
  --topic-arn ${SNS_TOPIC_ARN} \
  --protocol ${SNS_SUBSCRIPTION_PROTOCOL} \
  --notification-endpoint ${SNS_SUBSCRIPTION_ENDPOINT}
// "SubscriptionArn": "pending confirmation"

登録したメールアドレスに"AWS Notification - Subscription Confirmation"という標題のメールが届いているのを確認する。

11、完了確認
目的・・・SNSトピック"handson-cli-sns-novice-topic"にプロトコル"email"のエントポイント(メールアドレス)"<通知先メールアドレス>"が存在する事を確認する

aws sns list-subscriptions-by-topic \
  --topic-arn ${SNS_TOPIC_ARN} \
  --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].Endpoint" \
  --output text
// 通知先のメールアドレス

12、SNSトピック"handson-cli-sns-novice-topic"に登録されているエントポイント"<通知先メールアドレス>"のサブスクリプションARNが存在する。("PendingConfirmation"ではない。)」ことを確認

aws sns list-subscriptions-by-topic \
  --topic-arn ${SNS_TOPIC_ARN} \
  --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].SubscriptionArn" \
  --output text
// arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-sns-novice-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

参考にしたサイト

参加したイベント
https://jawsug-cli.connpass.com/
コマンド
https://awscli.amazonaws.com/v2/documentation/api/latest/index.html
JMESPath
https://dev.classmethod.jp/articles/aws-cli-query-jmspath-tostring-grep/
https://qiita.com/qtatsunishiura/items/fdd5e7f251299a90cd8c#%E9%80%9A%E5%B8%B8%E3%81%AEjmespath%E5%BC%8F%E3%81%A7%E5%A4%89%E6%95%B0%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0