私のメッセージが、Amazon Simple Notification Service (Amazon SNS) のトピックから発行されるときに、フィルタリングされています。
簡単な説明
デフォルトでは、Amazon SNS トピックサブスクライバーは、トピックに対して発行されたすべてのメッセージを受信します。メッセージのサブセットのみを受信するには、サブスクライバーはフィルターポリシーをトピックサブスクリプションに割り当てる必要があります。詳細については、「Amazon SNS メッセージフィルタリング」を参照してください。
FilterPolicyScope サブスクリプション属性を使用すると、次のいずれかの値を設定してフィルタリング範囲を選択できます:
- MessageAttributes: フィルターポリシーは、メッセージ属性に適用されます。これがデフォルトです。
- MessageBody: フィルターポリシーは、メッセージ本文に適用されます。
注: サブスクリプションフィルターポリシーを適用しているときに、フィルターポリシーの範囲が定義されていない場合、その範囲はデフォルトで MessageAttributes に設定されます。
解決策
メッセージフィルタリングに関連する一般的な問題とそのトラブルシューティング方法を次に示します:
Amazon SNS サブスクリプションのフィルターポリシーで 15 分の待機時間がある
AWS Identity and Access Management (IAM) と Amazon SNS は、結果整合性と呼ばれる分散コンピューティングモデルを使用します。サブスクリプションフィルターポリシーへの追加または変更が完全に有効になるまでに最大で 15 分かかります。この期間は短縮できません。
エラー:
値の組み合わせの合計(120)が100を超えてはなりません
Amazon SNS サブスクリプションフィルターポリシーの場合、AWS アカウントあたりのトピックごとのデフォルトの制限は 200 です。AWS アカウントあたりのフィルターポリシーの制限は 10,000 です。
Amazon SNS サブスクリプションフィルターポリシーの上限を引き上げるには、内部サービスチームの承認が必要です。承認は、ユースケース、地域、発行されたメッセージの数、サブスクリプションの詳細の件数などの要素に基づいて行われます。
Amazon SNS サブスクリプションフィルターポリシーの要件が増えることが予想される場合は、代替オプションを検討してください。
考えられる解決策
- トピックのサブスクリプションに関連付けられている同じフィルターポリシーで複数の条件 (またはフィルター) を設定します。
- AWS Lambda 関数を Amazon SNS トピックにサブスクライブし、Lambda 関数コード内のフィルターロジックを処理します。Lambda 関数はフィルターロジックを処理し、メッセージ属性に基づいてサブスクリプションを含む別の SNS トピックに発行します。
エラー:
AuthorizationErrorException
このエラーは、SetSubscriptionAttributes リクエストを行うユーザーまたはロールに十分な権限がない場合に表示されます。
SetSubscriptionAttributes 権限をユーザーに追加し、サブスクリプションフィルターポリシーを編集します。権限の追加の詳細については、「Amazon SNS でのアイデンティティベースのポリシーの使用」を参照してください。
このエラーは、通常、クロスアカウント環境において、権限の問題がある場合にも発生します。たとえば、Amazon SNS でクロスアカウントを設定したとします。SetSubscriptionAttributes API 呼び出しを使用してサブスクリプションにフィルターポリシーを追加しているユーザーに対しては「Not authorized to access this subscription」というエラーが表示されます。
SetSubscriptionAttributes を使用すると、サブスクリプション所有者はサブスクリプションの属性のようなフィルターポリシーを設定できます。SNS とのクロスアカウント設定 (例: Amazon SNS と Amazon Simple Queue Service とのクロスアカウント) では、サブスクリプション所有者は、サブスクリプションを作成するためにサブスクライブ API 呼び出しを行うときに使用された AWS アカウントです。(サブスクリプションを所有していない) 別のアカウントからのユーザーが、SetSubscriptionAttributes API 呼び出しを使用してサブスクリプションにフィルターポリシーを追加しようとする可能性があります。このユーザーには「Not authorized to access this subscription」というエラーが表示されるようになりました。
正しいフィルターポリシーを適用しても SNS トピックに通知が送信されない
サブスクリプションは、次の条件においてメッセージを受け付けます:
- フィルターポリシーの範囲が MessageAttributes に設定されている
- フィルターポリシーの範囲が MessageBody に設定されている
注: フィルターポリシーの詳細については、「Amazon SNS サブスクリプションフィルターポリシー」を参照してください。
問題のトラブルシューティングと調査を行うには、以下について確認します:
- 正しいメッセージ属性を渡していることを確認します。
- メッセージ本文のフィルタリングの場合は、メッセージペイロードが正しい形式の JSON オブジェクトであることを確認します。詳細については、ペイロードベースのメッセージフィルタリングに関するこのブログを参照してください。
- 次に示されている SNS Amazon CloudWatch メトリクスをチェックして、それらのデータポイントが入力されているかどうかを確認してください:
NumberOfNotificationsFilteredOut: サブスクリプションフィルターポリシーによって拒否されたメッセージの数。メッセージ属性がポリシー属性と一致しない場合、フィルターポリシーはメッセージを拒否します。
NumberOfNotificationsFilteredOut-MessageAttributes: 属性ベースのフィルタリングのサブスクリプションフィルターポリシーによって拒否されたメッセージの数。
NumberOfNotificationsFilteredOut-MessageBody: ペイロードベースのフィルタリングのサブスクリプションフィルターポリシーによって拒否されたメッセージの数。
NumberOfNotificationsFilteredOut-InvalidAttributes: メッセージの属性が有効でないためにサブスクリプションフィルターポリシーによって拒否されたメッセージの数。たとえば、JSON 属性の形式が正しくないために拒否されたメッセージがこれに該当します。
NumberOfNotificationsFilteredOut-NoMessageAttributes: メッセージに属性がないためにサブスクリプションフィルターポリシーによって拒否されたメッセージの数。
NumberOfNotificationsFilteredOut-InvalidMessageBody: メッセージ本文がフィルタリングのために有効でないためにサブスクリプションフィルターポリシーによって拒否されたメッセージの数。たとえば、無効な JSON メッセージ本文があるメッセージがこれに該当します。
詳細については、「Amazon SNS のメトリクス」を参照してください。
関連情報
Amazon SNS リソース