AWS CLIを利用して、SNSのトピックに通知先を登録してみます。
前提条件
SNSへの権限
SNSに対してフル権限があること。
AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.10.38
コマンド
aws --version
結果(例)
aws-cli/1.10.38 Python/2.7.11 Darwin/15.5.0 botocore/1.4.28
- 準備
=======
0.1. リージョンの指定
通知先を登録するトピックが存在するリージョンを指定します。
変数の設定(東京リージョンの場合)
export AWS_DEFAULT_REGION='ap-northeast-1'
0.2. 変数の確認
プロファイルが想定のものになっていることを確認します。
コマンド
aws configure list
結果(例)
Name Value Type Location
---- ----- ---- --------
profile sns-prjz-mbp13 env AWS_DEFAULT_PROFILE
access_key ****************XXXX shared-credentials-file
secret_key ****************XXXX shared-credentials-file
region ap-northeast-1 env AWS_DEFAULT_REGION
0.3. トピックの指定
通知先を登録するトピックを指定します。
変数の設定
SNS_TOPIC_NAME="$(date +%Y%m%d)-handson-topic" \
&& echo ${SNS_TOPIC_NAME}
0.4. トピック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:20160509-handson-topic
0.5. Lambda関数名の指定
変数の設定
LAMBDA_FUNC_NAME="sns-message-$( date '+%Y%m%d' )"
- 事前作業
===========
1.1. Lambda関数のARN
LAMBDA_FUNC_ARN=$( \
aws lambda get-function \
--function-name ${LAMBDA_FUNC_NAME} \
--query 'Configuration.FunctionArn' \
--output text \
) && echo ${LAMBDA_FUNC_ARN}
1.2. 通知先(エンドポイント)の決定
通知先となるエンドポイントとプロトコルを決定します。
今回は、プロトコルとしてLambdaを利用して通知するので、LambdaのARNがエンドポイントとなります。
変数の設定
SNS_NOTIF_ENDPOINT="${LAMBDA_FUNC_ARN}"
変数の設定
SNS_NOTIF_PROTOCOL='lambda'
1.3. Subscriptionの確認
登録予定の通知先がトピックに登録されていないことを確認しましょう。
コマンド
aws sns list-subscriptions-by-topic \
--topic-arn ${SNS_TOPIC_ARN} \
--query "Subscriptions[?Endpoint == \`${SNS_NOTIF_ENDPOINT}\`]"
結果(例)
[]
- Subscribeの実施
==================
トピックの購読を行います。
変数の確認
cat << ETX
SNS_TOPIC_ARN: ${SNS_TOPIC_ARN}
SNS_NOTIF_PROTOCOL: ${SNS_NOTIF_PROTOCOL}
SNS_NOTIF_ENDPOINT: ${SNS_NOTIF_ENDPOINT}
ETX
コマンド
aws sns subscribe \
--topic-arn ${SNS_TOPIC_ARN} \
--protocol ${SNS_NOTIF_PROTOCOL} \
--notification-endpoint ${SNS_NOTIF_ENDPOINT}
結果(例)
{
"SubscriptionArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:20160724-handson-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
3. 事後確認
3.1. Subscriptionの状況確認
Subscriptionの状況を確認してみましょう。
コマンド
aws sns list-subscriptions-by-topic \
--topic-arn ${SNS_TOPIC_ARN} \
--query "Subscriptions[?Endpoint == \`${SNS_NOTIF_ENDPOINT}\`]"
結果(例)
[
{
"Owner": "XXXXXXXXXXXX",
"Endpoint": "arn:aws:lambda:us-west-2:XXXXXXXXXXXX:function:sns-message-20160620",
"Protocol": "lambda",
"TopicArn": "arn:aws:sns:us-west-2:XXXXXXXXXXXX:20160619-handson-topic",
"SubscriptionArn": "arn:aws:sns:us-west-2:XXXXXXXXXXXX:20160619-handson-topic:b27368d4-ba2a-4f2e-b404-222a8b83aaf1"
}
]
3.2. 購読者数の確認
Confirmationが完了すると自分が購読者となっているので、Confirmation前の
購読者数よりも増えているはずです。
コマンド
SNS_COUNT_CONFIRMD=$( \
aws sns get-topic-attributes \
--topic-arn ${SNS_TOPIC_ARN} \
--query "Attributes.SubscriptionsConfirmed" \
--output text \
) \
&& echo ${SNS_COUNT_CONFIRMD}
結果(例)
2
topic-attributesに反映されるまでにタイムラグがあるようです。
自分しか購読者がいなければ1になっているはずです。
完了
トピックの通知先の登録が完了しました。