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