[Amazon SNS] 配送ステータスが CloudWatch で確認できるようになりました!

Amazon SNS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon SNS の配送ステータスが Cloud Watch で確認可能になりました

本日 Amazon SNS にアップデートがあり、Publish した通知の配送ステータスが Amazon CloudWatch で確認できるようになりました!

ということで、早速使ってみたいと思います。

設定してみる

まず Management Console を開き、SNS Application を選択した状態で「Application Actions」のメニューから「Delivery Status」を選択します。

sns-delivery-status01

成功時、失敗時に使用する IAM Role を指定します。

sns-delivery-status02

「Create IAM Roles」をクリックすると、新規作成フォームが表示されます。

sns-delivery-status03

いずれもデフォルトでは以下のような Policy になっています。

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

作成が完了すると、先ほどのフォームに自動で Arn が入力されます。

sns-delivery-status04

以上で設定完了です。なお上記の設定は SDK を通して API 経由で設定することもできます。詳しくは公式ブログを御覧ください。

配送ステータスを見てみる

あとは Publish したあとに配送ステータスが CloudWatch で確認できるようになります。ということで Publish します。

sns-delivery-status05

Publish が完了すると CloudWatch の Logs に Log Group が増えています。

sns-delivery-status06

Log Stream で分割されているので、選択すると…

sns-delivery-status07

ログが出力されてました。下図は成功時のログです。Endpoint Arn や Dwell Time などが確認できます。

sns-delivery-status08

下図はエラー時のログです。providerResponse にエラーレスポンスが渡されるので、エラーの原因が特定しやすいです。今回は無効なトークンに対する配信だったので、Invalid Token というステータスになっていることが確認できます。

sns-delivery-status09

次に Metrics を見てみましょう。SNS という項目を選択すると Dwell Time の平均や Publish 数、成功数や失敗数を見ることができます。

sns-delivery-status10

Metric をある条件で絞り込みたいときは Log の画面の「Create Metric Filter」からカスタムフィルターを作成することもできます。

sns-delivery-status11

上記の例では Dwell Time が 300 以上という条件のフィルターになります。例えばエラーログで {$.delivery.statusCode=403} などとすれば、あるエラーコードの発生数なども調べることができます。

sns-delivery-status12

Metric Filter を作成後は Log Group に以下のように表示されます。

sns-delivery-status14

「Create Alarm」でアラートを設定すると、作成した Metric Filter に該当する Log が出力されたタイミングで SNS に通知することができます。

sns-delivery-status15

まとめ

GCM や APNs のプッシュ通知ではデバイスに通知が送れないことがよくありますが、今回ご紹介した機能を使うことでエラーハンドリングがしやすくなりました。エンドポイントまで特定できるので、通知が送れなかったユーザーに別なアプローチを行うなどといった使いかたも面白そうですね。ぜひ活用しましょう!