日: 2018年9月27日

  • unsubscribeされてしまったcloudwatch (SNS)通知を検知する

    unsubscribeされてしまったcloudwatch (SNS)通知を検知する

    はじめに

    AWSでcloudwatchで監視し、異常があったらSNSで通知する事はあるが、SNSではデフォルトで「配信停止(unsubscribe)する場合は、ここクリックしてね」とありがたいことに(?)記載されてある。

    チーム開発しているとSNSの通知先がメーリングリストにしていると、誤って押されてしまうと、その後のメールが来なくなってしまう。

    配信停止(unsubscribe)を押された場合検知はさっくり作れたのでそれをまとめる

    手順

    awsコマンドとjqコマンドをうまく組み合わせる

    aws sns list-subscriptions | jq -r '.Subscriptions[] | select(.SubscriptionArn == "Deleted") '

    結果

    aws sns list-subscriptions | jq -r '.Subscriptions[] | select(.SubscriptionArn == "Deleted") '
    {
      "SubscriptionArn": "Deleted",
      "Owner": "xxxxxxxxxx",
      "Protocol": "email",
      "Endpoint": "sute@sumito.jp",
      "TopicArn": "arn:aws:sns:ap-northeast-1:xxxxxxx:xxxxxxxxx"
    }
    

    unsubscribeされたメールドレスや、TopicArn情報などを確認することができる。

    ちなみにチャットワークに通知する場合は以下の通りシェルでラップする

    #!/bin/bash
    aws --profile=$1 sns list-subscriptions | jq -r '.Subscriptions[] | select(.SubscriptionArn == "Deleted") ' > /tmp/check-unsubscribe.$1
    
    # 文字を整形する
    # headder
    cat << _EOT_ > /tmp/check-unsubscribe.$1.txt
    [info]
    [title]Someone clicked unsubscribe link
    [/title]
    _EOT_
    
    # contents
    cat  /tmp/check-unsubscribe.$1 >> /tmp/check-unsubscribe.$1.txt
    echo "[/info]"  >> /tmp/check-unsubscribe.$1.txt
    
    _roomid=xxxxxxxxxxxxx # (your chatroom id)
    _body=`cat /tmp/check-unsubscribe.$1.txt`
    
    # 1件以上あれば通知する
    if [ `wc -l /tmp/check-unsubscribe.$1 | awk '{print $1}'` -gt 0 ] ; then
        curl -X POST -H "X-ChatWorkToken: 123456789" -d "body=${_body}" "https://api.chatwork.com/v2/rooms/${_roomid}/messages"
    fi
    
    exit 0