✉️

Amazon SNS(Simple Notification Service)のサブスクリプションを一括で登録する

2024/09/24に公開

動機

通常、AWS マネジメントコンソールからSNSのサブスクリプションを登録するには以下の手順が必要です。

  • サブスクリプションしたいトピックの選択
  • 「サブスクリプションの作成」を押下
  • プロトコルを選択し、エンドポイントにメールアドレスを登録する
  • 指定したメールアドレスに確認メールが届くので、urlを押下して認証する

トピックが数個程度ならいいのですが、何十個とある場合に1つ1つ手作業でポチポチと登録するのはかなりの手間になり、登録が漏れる可能性も大きいです。
そこで、複数あるトピックに対して一括でサブスクリプション登録できる方法を検討しようと思いました。

前提

SNSに存在する全トピックに対して一括で1つのEメールアドレスをサブスクリプション登録することを前提としています。

IAMなど基本的な設定については省略します。
また、AWS CLIが使える状態にあるという前提です。

手順

それでは早速手順のご紹介です。

トピックのARN一覧を取得

一括でサブスクリプション登録するために、まずはトピックARNの一覧を動的に取得したいと思います。
以下コマンドで取得することができます。

aws sns list-topics --query "Topics[].[TopicArn]" --output text

実行結果

arn:aws:sns:ap-northeast-1:111111111111:some-event-1
arn:aws:sns:ap-northeast-1:111111111111:some-event-2

aws sns list-topicsだけでも取得はできますが、
この後にスクリプトでループ処理を行うので処理を複雑にしないためにも出力時にフォーマットしてしまうのがベターだと思います。

aws sns list-topicsを実行した場合

{
    "Topics": [
        {
            "TopicArn": "arn:aws:sns:ap-northeast-1:111111111111:some-event-1"
        },
        {
            "TopicArn": "arn:aws:sns:ap-northeast-1:111111111111:some-event-2"
        }
    ]
}

スクリプト作成と実行

トピックのARN一覧を取得できたら、あとは登録したいメールアドレスを指定して一覧をループさせて登録処理を行うだけです。
以下が実行するスクリプトです。

sns_bulk_subscribe.sh
#!/bin/bash

# サブスクライブするEメールアドレス
email_address="your_email@example.com"

# トピックARNを動的に取得
topic_arns=($(aws sns list-topics --query "Topics[].[TopicArn]" --output text))

# 各トピックに対してEメールアドレスをサブスクライブ
for topic_arn in "${topic_arns[@]}"; do
    echo "Subscribing $email_address to $topic_arn"
    aws sns subscribe \
        --topic-arn "$topic_arn" \
        --protocol email \
        --notification-endpoint "$email_address"

    if [ $? -eq 0 ]; then
        echo "Successfully subscribed $email_address to $topic_arn"
    else
        echo "Failed to subscribe $email_address to $topic_arn"
    fi
done

echo "Bulk subscription complete."

スクリプトの実行権限を付与。

chmod +x sns_bulk_subscribe.sh

スクリプトを実行。

./sns_bulk_subscribe.sh

実行結果

Bulk subscribing your_email@example.com to all SNS topics...
Subscribing your_email@example.com to arn:aws:sns:ap-northeast-1:111111111111:some-event-1
{
    "SubscriptionArn": "pending confirmation"
}
Successfully subscribed your_email@example.com to arn:aws:sns:ap-northeast-1:111111111111:some-event-1
Subscribing your_email@example.com to arn:aws:sns:ap-northeast-1:111111111111:some-event-2
{
    "SubscriptionArn": "pending confirmation"
}
Successfully subscribed your_email@example.com to arn:aws:sns:ap-northeast-1:111111111111:some-event-2
Bulk subscription complete.

確認

それでは、確認メールが飛んでいるか確認します。
無事取得した全ARNに対しサブスクリプションの登録ができていました!!

あとがき

一括で登録できたのはいいのですが、
結局確認メール内のサブスクリプションの確認(Confirm Subscription)は全て手動でポチポチしないといけないのが手間に感じました。

もしかしたらサブスクリプション作成時のオプション等でこちらの確認をスキップする方法もあるかもしれませんが、この認証プロセスを飛ばしてしまうことはセキュリティの観点から好ましくないと思いますので本記事では検討しないことにしました。

他にもより良い方法があればコメント等いただけますと幸いです。

参考記事

https://blog.serverworks.co.jp/aws-cli-sns

Sun* Developers

Discussion