Amazon SNSのSMS配信のロギングを有効にしてみた

2021.12.03

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、Amazon SNSのSMS配信のロギングを有効にして、配信ログを確認してみました。

既定で記録されるログ情報では詳細な情報が分からない

Amazon SNSのSMS配信のログは既定では配信の成功数と失敗数のメトリクスが記録されます。

しかしそれ以上の情報は記録されないため、例えば配信が届かないとユーザーから連絡があった際に原因調査を行おうとしても「どの電話番号への配信が、どのような理由により失敗したのか?」までは追跡できません。

やってみる

そこで、下記のドキュメントを参考にAmazon SNSのSMSメッセージの配信ログのロギングを有効にしてみます。

ロギングを有効にする

Amazon SNSのコンソールで、[Text messaging (SMS)]-[Text messaging preferences]で[Edit]をクリックします。

[Delivery status logging - optional]を開いて、[Success sample rate]で100を指定します。これによりすべての配信の成功および失敗のログが記録されるようになります。

ちなみに0を指定すると失敗した配信のみ記録され、10を指定すると成功した配信のうち10%のみ記録されるようになります。

For Success sample rate, specify the percentage of successful SMS deliveries for which Amazon SNS will write logs in CloudWatch Logs. For example:

  • To write logs only for failed deliveries, set this value to 0.
  • To write logs for 10% of your successful deliveries, set it to 10.

If you don't specify a percentage, Amazon SNS writes logs for all successful deliveries.

Amazon SNSがCloudWatch Logsに書き込む際のサービスロールを指定できます。今回は新規作成してみます。[Create new service role]を選択して[Create new roles]をクリックします。

Amazon SNSへのアクセス権限を求められるので[Allow]をクリックします。

この時使用されるポリシードキュメントは以下のようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:PutMetricFilter",
        "logs:PutRetentionPolicy"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

ロールを作成したらmessage preference編集画面に戻ります。[Save changes]をクリックして変更を保存します。

動作確認

まずは利用可能な電話番号に送信して、配信が成功した場合のログを確認してみます。

CloudWatch Logsを見ると、sns/{region}/{accountId}/DirectPublishToPhoneNumberというロググループが作成され、その中にログストリームが作成されています。開いてみます。

ログの内容から配信が成功した電話番号、タイムスタンプ、プロバイダーレスポンス(理由)などが確認できました。

{
    "notification": {
        "messageId": "ed892ca3-1e7f-567b-8746-768731b681e6",
        "timestamp": "2021-12-03 14:45:29.108"
    },
    "delivery": {
        "mnc": 1,
        "numberOfMessageParts": 1,
        "destination": "+8190XXXXXXXX",
        "priceInUSD": 0.07451,
        "smsType": "Transactional",
        "mcc": 440,
        "providerResponse": "Message has been accepted by phone carrier",
        "dwellTimeMs": 431,
        "dwellTimeMsUntilDeviceAck": 3197
    },
    "status": "SUCCESS"
}

次は利用不可な電話番号に送信して、配信が失敗した場合のログを見てみます。

すると次はCloudWatch Logsにsns/{region}/{accountId}/DirectPublishToPhoneNumber/Failureというロググループが作成されました。その中にログストリームが作成されているので、開いてみます。

こちらも同じくログの内容から配信が失敗した電話番号やプロバイダーレスポンス(理由)などが確認できました。

{
    "notification": {
        "messageId": "33953643-e2f1-540d-82a5-6c67d16b8f16",
        "timestamp": "2021-12-03 15:01:46.674"
    },
    "delivery": {
        "numberOfMessageParts": 1,
        "destination": "+810000000000",
        "priceInUSD": 0.07451,
        "smsType": "Transactional",
        "providerResponse": "Phone is currently unreachable/unavailable",
        "dwellTimeMs": 470,
        "dwellTimeMsUntilDeviceAck": 946
    },
    "status": "FAILURE"
}

まとめ

  • Amazon SNSのSMS配信では、既定では配信の成功および失敗のメトリクスしか記録されない
  • ロギングを有効にすることにより、どの電話番号への配信がどのような理由により成功/失敗したのかをCloudWatch Logsに記録することができる
  • 失敗した配信のみを記録したり、成功した配信のうち指定の割合のみ記録することも可能

以上