[JAWS-UG CLI] SNS:#6 通知先の登録 (lambda)

AWS CLIを利用して、SNSのトピックに通知先を登録してみます。


前提条件
========


SNSへの権限
-----------

SNSに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.38

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.10.38 Python/2.7.11 Darwin/15.5.0 botocore/1.4.28
```


0. 準備
=======


0.1. リージョンの指定
---------------------

通知先を登録するトピックが存在するリージョンを指定します。

```bash:変数の設定(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)

            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. トピックの指定
-------------------

通知先を登録するトピックを指定します。

```bash:変数の設定:
SNS_TOPIC_NAME="$(date +%Y%m%d)-handson-topic" \
  && echo ${SNS_TOPIC_NAME}
```


0.4. トピックARNの取得
----------------------

```bash:コマンド:
SNS_TOPIC_ARN=$( \
        aws sns list-topics \
          --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
          --output text \
) \
        && echo ${SNS_TOPIC_ARN}
```

```text:結果(例):
      arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:20160509-handson-topic
```


## 0.5. Lambda関数名の指定

```bash:変数の設定
LAMBDA_FUNC_NAME="sns-message-$( date '+%Y%m%d' )"
```






1. 事前作業
===========

## 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がエンドポイントとなります。

```bash:変数の設定:
SNS_NOTIF_ENDPOINT="${LAMBDA_FUNC_ARN}"
```

```bash:変数の設定:
SNS_NOTIF_PROTOCOL='lambda'
```


## 1.3. Subscriptionの確認

登録予定の通知先がトピックに登録されていないことを確認しましょう。

```bash:コマンド:
aws sns list-subscriptions-by-topic \
        --topic-arn ${SNS_TOPIC_ARN} \
        --query "Subscriptions[?Endpoint == \`${SNS_NOTIF_ENDPOINT}\`]"
```

```json:結果(例):
      []
```


2. Subscribeの実施
==================


トピックの購読を行います。

```bash:変数の確認:
cat << ETX

        SNS_TOPIC_ARN:      ${SNS_TOPIC_ARN}
        SNS_NOTIF_PROTOCOL: ${SNS_NOTIF_PROTOCOL}
        SNS_NOTIF_ENDPOINT: ${SNS_NOTIF_ENDPOINT}

ETX
```

```bash:コマンド:
aws sns subscribe \
        --topic-arn ${SNS_TOPIC_ARN} \
        --protocol ${SNS_NOTIF_PROTOCOL} \
        --notification-endpoint ${SNS_NOTIF_ENDPOINT}
```

```json:結果(例):
      {
        "SubscriptionArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:20160724-handson-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
```


# 3. 事後確認

3.1. Subscriptionの状況確認
---------------------------

Subscriptionの状況を確認してみましょう。

```bash:コマンド:
aws sns list-subscriptions-by-topic \
          --topic-arn ${SNS_TOPIC_ARN} \
          --query "Subscriptions[?Endpoint == \`${SNS_NOTIF_ENDPOINT}\`]"
```


```text:結果(例):
[
    {
        "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前の
購読者数よりも増えているはずです。

```bash:コマンド:
SNS_COUNT_CONFIRMD=$( \
        aws sns get-topic-attributes \
          --topic-arn ${SNS_TOPIC_ARN} \
          --query "Attributes.SubscriptionsConfirmed" \
          --output text \
) \
        && echo ${SNS_COUNT_CONFIRMD}
```

```text:結果(例):
      2
```

topic-attributesに反映されるまでにタイムラグがあるようです。

自分しか購読者がいなければ1になっているはずです。



完了
====

トピックの通知先の登録が完了しました。