

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SNS メッセージフィルター処理
<a name="sns-message-filtering"></a>

デフォルトでは、Amazon SNS トピックの受信者は、トピックに対して発行されたすべてのメッセージを受信します。メッセージのサブセットのみを受信する場合、受信者はトピックのサブスクリプションに*フィルターポリシー*を割り当てる必要があります。

フィルターポリシーは、受信者が受信するメッセージを定義するプロパティが含まれている JSON オブジェクトです。Amazon SNS は、サブスクリプションに設定したフィルターポリシーの範囲に従って、メッセージ属性またはメッセージ本文に適用されるポリシーに対応します。メッセージ本文のフィルターポリシーは、メッセージペイロードが正しい形式の JSON オブジェクトであることを前提としています。

サブスクリプションにフィルターポリシーがない場合、サブスクライバーは、そのトピックに発行されたすべてのメッセージを受信します。フィルターポリシーを設定してトピックにメッセージを発行すると、Amazon SNS はメッセージ属性またはメッセージ本文をトピックの各サブスクリプションのフィルターポリシー内のプロパティを比較します。すべてのメッセージ属性またはメッセージ本文プロパティがフィルターポリシーで指定された条件を満たす場合、Amazon SNS はメッセージをサブスクライバーに送信します。そうでない場合、Amazon SNS はそのサブスクライバーにメッセージを送信しません。

詳細については、「[トピックに発行されたメッセージのフィルター処理](https://aws.amazon.com/getting-started/tutorials/filter-messages-published-to-topics/)」を参照してください。

# Amazon SNS サブスクリプションフィルターポリシーの範囲
<a name="sns-message-filtering-scope"></a>

`FilterPolicyScope` サブスクリプション属性を使用すると、次のいずれかの値を設定してフィルタリング範囲を定義できます。
+ `MessageAttributes` – フィルターポリシーをメッセージ属性に適用します (デフォルト設定)。
+ `MessageBody` – フィルターポリシーをメッセージ本文に適用します。

**注記**  
既存のフィルターポリシーに範囲が定義されていない場合、範囲はデフォルトで `MessageAttributes` に設定されます。

# Amazon SNS サブスクリプションフィルターポリシー
<a name="sns-subscription-filter-policies"></a>

サブスクリプションフィルターポリシーを使用すると、プロパティ名を指定して、プロパティ名ごとに値のリストを割り当てることができます。詳細については、「[Amazon SNS メッセージフィルター処理](sns-message-filtering.md)」を参照してください。

Amazon SNS がサブスクリプションフィルターポリシーに照らしてメッセージ属性またはメッセージ本文のプロパティを評価する際、ポリシーで指定されていないものは無視されます。

**重要**  
AWS IAM や Amazon SNS などの サービスは、結果整合性と呼ばれる分散コンピューティングモデルを使用します。サブスクリプションフィルターポリシーへの追加または変更は、完全に有効になるまでに最大 15 分かかります。

サブスクリプションは、以下の条件に該当するメッセージを受け入れます。
+ フィルターポリシーの範囲が `MessageAttributes` に設定されている場合、フィルターポリシーの各プロパティ名はメッセージ属性名と一致します。フィルターポリシー内で一致するプロパティ名ごとに、少なくとも 1 つのプロパティ値がメッセージ属性値と一致します。
+ フィルターポリシーの範囲が `MessageBody` に設定されている場合、フィルターポリシーの各プロパティ名はメッセージ本文のプロパティ名と一致します。フィルターポリシー内で一致するプロパティ名ごとに、少なくとも 1 つのプロパティ値がメッセージ本文のプロパティ値と一致します。

Amazon SNS は、現在、以下のフィルター演算子をサポートしています。
+ [AND ロジック](and-or-logic.md#and-logic)
+ [OR ロジック](and-or-logic.md#or-logic)
+ [OR 演算子](and-or-logic.md#or-operator)
+ [キーの一致](attribute-key-matching.md)
+ [数値の完全一致](numeric-value-matching.md#numeric-exact-matching)
+ [数値の anything-but 一致](numeric-value-matching.md#numeric-anything-but-matching)
+ [数値範囲の一致](numeric-value-matching.md#numeric-value-range-matching)
+ [文字列値の完全一致](string-value-matching.md#string-exact-matching)
+ [文字列値の anything-but 一致](string-value-matching.md#string-anything-but-matching)
+ [プレフィックスと anything-but 演算子を使用した文字列の一致](string-value-matching.md#string-anything-but-matching)
+ [文字列値の equals-ignore case](string-value-matching.md#string-equals-ignore)
+ [文字列値の IP アドレス一致](string-value-matching.md#string-address-matching)
+ [文字列値のプレフィックスマッチング](string-value-matching.md#string-prefix-matching)
+ [文字列値のサフィックスマッチング](string-value-matching.md#string-suffix-matching)

# Amazon SNS サンプルフィルターポリシー
<a name="example-filter-policies"></a>

 次の例は、顧客のトランザクションを処理する Amazon SNS トピックから配信されるメッセージペイロードを示しています。

最初の例には、トランザクションを記述する属性がある `MessageAttributes` フィールドが含まれます。
+ 顧客の興味
+ ストア名
+ イベント状態
+ 購入価格 (USD)

このメッセージには `MessageAttributes` フィールドが含まれるため、サブスクリプションで `FilterPolicyScope` が `MessageAttributes` に設定されている限り、`FilterPolicy` を設定するトピックサブスクリプションは、メッセージを選択的に許可または拒否することができます。メッセージへの属性の適用の詳細については、「[Amazon SNS メッセージ属性](sns-message-attributes.md)」を参照してください。

```
{
   "Type": "Notification",
   "MessageId": "a1b2c34d-567e-8f90-g1h2-i345j67klmn8",
   "TopicArn": "arn:aws:sns:us-east-2:123456789012:MyTopic",
   "Message": "message-body-with-transaction-details",
   "Timestamp": "2019-11-03T23:28:01.631Z",
   "SignatureVersion": "4",
   "Signature": "signature",
   "UnsubscribeURL": "unsubscribe-url",
   "MessageAttributes": {
      "customer_interests": {
         "Type": "String.Array",
         "Value": "[\"soccer\", \"rugby\", \"hockey\"]"
      },
      "store": {
         "Type": "String",
         "Value":"example_corp"
      },
      "event": {
         "Type": "String",
         "Value": "order_placed"
      },
      "price_usd": {
         "Type": "Number", 
         "Value": "210.75"
      }
   }
}
```

次の例は、`Message` フィールドに含まれ、*メッセージペイロード*または*メッセージ本文*とも呼ばれる同じ属性を示しています。サブスクリプションで `FilterPolicyScope` が `MessageBody` に設定されている限り、`FilterPolicy` を含むトピックサブスクリプションは、メッセージを選択的に許可または拒否することができます。

```
{
"Type": "Notification",
   "MessageId": "a1b2c34d-567e-8f90-g1h2-i345j67klmn8",
   "TopicArn": "arn:aws:sns:us-east-2:123456789012:MyTopic",
   "Message": "{
      \"customer_interests\": [\"soccer\", \"rugby\", \"hockey\"],
      \"store\": \"example_corp\",
      \"event\":\"order_placed\",
      \"price_usd\":210.75
   }",
   "Timestamp": "2019-11-03T23:28:01.631Z",
   "SignatureVersion": "4",
   "Signature": "signature",
   "UnsubscribeURL": "unsubscribe-url"
}
```

以下のフィルターポリシーでは、プロパティの名前と値に基づいてメッセージを許可または拒否します。

## メッセージ例を許可するポリシー
<a name="policy-accepts-messages"></a>

以下のサブスクリプションフィルターポリシーのプロパティは、メッセージ例に割り当てられた属性に一致します。`MessageAttributes` または `MessageBody` に設定されているかどうかにかかわらず、同じフィルターポリシーが `FilterPolicyScope` に対して有効であることに注意してください。各サブスクライバーは、トピックから受信するメッセージの構成に従ってフィルタリング範囲を選択します。

このポリシーの 1 つのプロパティが、メッセージに割り当てられた属性と一致しなかった場合、ポリシーはメッセージを拒否します。

```
{
   "store": ["example_corp"],
   "event": [{"anything-but": "order_cancelled"}],
   "customer_interests": [
      "rugby",
      "football",
      "baseball"
   ],
   "price_usd": [{"numeric": [">=", 100]}]
}
```

## メッセージ例を拒否するポリシー
<a name="policy-rejects-messages"></a>

以下のサブスクリプションフィルターポリシーでは、そのプロパティと、メッセージ例に割り当てられた属性の間に、複数の不一致があります。例えば、`encrypted` プロパティ名はメッセージ属性に存在していないため、割り当てられている値にかかわらず、このポリシープロパティによってメッセージは拒否されます。

不一致が発生すると、ポリシーはメッセージを拒否します。

```
{
   "store": ["example_corp"],
   "event": ["order_cancelled"],
   "encrypted": [false],
   "customer_interests": [
      "basketball",
      "baseball"
   ]
}
```

# Amazon SNS フィルターポリシーの制約
<a name="subscription-filter-policy-constraints"></a>

Amazon SNS でフィルターポリシーを設定する場合、注意すべき重要なルールがいくつかあります。これらのルールは、システムのパフォーマンスと互換性を維持しながら、フィルターポリシーを効果的に適用するのに役立ちます。

## 共通のポリシーの制約
<a name="subscription-filter-policy-common-constraints"></a>

Amazon SNS でフィルターポリシーを設定するときは、システムのパフォーマンスと互換性を維持しながら効果的に機能するように、次の重要なルールに従ってください。
+ **文字列の一致** – フィルターポリシーでの文字の一致ルールでは、大文字と小文字が区別して比較されます。
+ **数値マッチング** – 数値マッチングでは、値は -109～109 (-10 億～10 億) の範囲で、小数点以下 5 桁の精度で指定できます。
+ **フィルターポリシーの複雑さ** — 値の組み合わせの合計が **150** を超えてはなりません。組み合わせの合計を計算するには、フィルターポリシーの各配列の値の数を乗算します。
+ **キー数の制限** – フィルターポリシーには最大 **5** つのキーを含めることができます。

****追加の考慮事項****
+ フィルターポリシーの JSON には以下のものが含まれます。
  + 引用符で囲まれた文字列
  + 数字
  + 引用符なしのキーワード `true`、`false`、および `null`
+ Amazon SNS API を使用する場合は、フィルターポリシーの JSON を有効な **UTF-8** 文字列として渡す必要があります。
+ フィルターポリシーの最大サイズは **256 KB** です。
+ デフォルトでは、トピックごとに最大 **200** 個のフィルターポリシー、 AWS アカウントごとに最大 **10,000** 個のフィルターポリシーを持つことができます。

  このポリシー制限によっても、[https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) API で Amazon SQS キューサブスクリプションが作成されるのを止めることはできません。ただし、`Subscribe` API コール (または [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) API コール) でフィルターポリシーをアタッチすると失敗します。

  このクォータを引き上げるには、[[AWS Service Quotas]](https://docs.aws.amazon.com/servicequotas/latest/userguide/intro.html) を使用できます。

## 属性ベースのフィルタリングのポリシー制約
<a name="subscription-filter-policy-attribute-constraints"></a>

属性ベースのフィルタリングがデフォルトのオプションです。[https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html#API_SetSubscriptionAttributes_RequestParameters](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html#API_SetSubscriptionAttributes_RequestParameters) は、サブスクリプションでは `MessageAttributes` に設定されています。
+ Amazon SNS は属性ベースのフィルタリングに対して、ネストされたフィルターポリシーを受け入れません。
+ Amazon SNS は、以下のデータ型に該当するメッセージ属性とのみポリシーのプロパティを比較します。
  + `String`
  + `String.Array`
**重要**  
Amazon SNS で属性ベースのフィルタリングを使用する場合は、特定の特殊文字、特に次の文字を二重エスケープする必要があります。  
二重引用符 (")
バックスラッシュ (\$1)
これらの文字を二重エスケープしないと、フィルターポリシーが公開されたメッセージの属性と一致しなくなり、通知は配信されません。

**追加の考慮事項**
+ オブジェクトを配列で渡すことはお勧めしません。属性ベースのフィルタリングではサポートされていないネストが原因で、予期しない結果が発生する可能性があるためです。ネストされたポリシーにペイロードベースのフィルタリングを使用する
+ `Number` は数値の属性値でサポートされています。
+ Amazon SNS は、バイナリデータ型のメッセージ属性を無視します。

**複雑さに関するポリシーの例:**

次のポリシーの例では、最初のキーには **3** つの一致演算子、2 番目のキーには **1** つの一致演算子、3 番目のキーには **2** つの一致演算子があります。

```
{
   "key_a": ["value_one", "value_two", "value_three"],
   "key_b": ["value_one"],
   "key_c": ["value_one", "value_two"]
}
```

組み合わせの合計数は、フィルターポリシーに含まれる各キーの一致演算子の数の積として計算されます。

```
3(match operators of key_a) 
x 1(match operators of key_b) 
x 2(match operators of key_c) 
= 6
```

## ペイロードベースのフィルタリングのポリシー制約
<a name="subscription-filter-policy-payload-constraints"></a>

属性ベース (デフォルト) のフィルタリングからペイロードベースのフィルタリングに切り替えるには、サブスクリプションで [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html) を `MessageBody` に設定する必要があります。
+ Amazon SNS は、ペイロードベースのフィルタリングに対してネストされたフィルターポリシーを受け入れます。
+ ネストされたポリシーの場合、**リーフキー**のみが **5** 個のキー制限の対象としてカウントされます。

**キー制限に関するポリシーの例:**

次のポリシーの例について説明します。
+ リーフキーには、`key_c`と `key_e` の 2 つがあります。
+ `key_c` にはネストされたレベルが **3** の一致演算子が **4** つあり、`key_e`にはネストされたレベルが **2** の一致演算子が **3** つがあります。

```
{
"key_a": {
    "key_b": {
        "key_c": ["value_one", "value_two", "value_three", "value_four"]
        }
    },
"key_d": {
    "key_e": ["value_one", "value_two", "value_three"]
    }
}
```

組み合わせの合計数は、フィルターポリシーに含まれる各キーの一致演算子の数とネストされたレベルの積として計算されます。

```
4(match operators of key_c) 
x 3(nested level of key_c) 
x 3(match operators of key_e) 
x 2(nested level of key_e) 
= 72
```

## ワイルドカードパターンの使用に関するガイドライン
<a name="filter-policy-constraints-wildcard"></a>

 Amazon SQS は、ワイルドカードを含むフィルターポリシーを登録する際の保護機能を実装しており、複雑すぎるフィルターポリシーが作成されないようにしています。こうしたフィルターポリシーは、アプリケーションのパフォーマンスに影響を与えるためです。

**パターン構造**

フィールドには 1 つ以上のパターンが含まれます。次の例は、2 つのパターンを使用するフィールドを示しています。

```
{
    "greeting": [
      {"anything-but": {"prefix": "Hello"}},
      {"wildcard": "H*"}
    ] // 2 patterns
  }
```

**複雑さのルール**
+  すべてのフィールドにおけるワイルドカードの複雑さの合計は、100 ポイントを超えることはできません 
+  パターンあたりのワイルドカードの最大数は 3 つです 

**複雑さの計算**
+  フィールドの複雑さ = `(Sum of pattern points)` × `(Number of patterns)` 
+ パターンポイント:

   単一のワイルドカード: 1 ポイント 

   複数のワイルドカード: 各 3 ポイント 

   anything-but ワイルドカード: 1 ポイント 

  複雑さの計算例を次に示します。

  ```
  {
    "filename": [
      {"wildcard": "*.txt"},     // 1 point
      {"wildcard": "log*"}      // 1 point
    ]                           // Total: (1 + 1) × 2 = 4 points
  }
  ```

# AND/OR ロジック
<a name="and-or-logic"></a>

フィルターポリシーで AND/OR ロジックを使用し、Amazon SNS でメッセージ属性または本文プロパティを照合する方法について説明します。これにより、より正確で柔軟なメッセージフィルタリングが可能になります。

## AND ロジック
<a name="and-logic"></a>

複数のプロパティ名を使用して AND ロジックを適用できます。

次のポリシーについて考えます。

```
{
  "customer_interests": ["rugby"],
  "price_usd": [{"numeric": [">", 100]}]
}
```

このポリシーは、`customer_interests` の値が `rugby` に設定され、*さらに* `price_usd` の値が 100 を超える値に設定されているメッセージ属性またはメッセージ本文プロパティと一致します。

**注記**  
AND ロジックを同じ属性の値に適用することはできません。

## OR ロジック
<a name="or-logic"></a>

プロパティ名に複数の値を割り当てることで OR ロジックを適用できます。

次のポリシーについて考えます。

```
{
   "customer_interests": ["rugby", "football", "baseball"]
}
```

このポリシー属性は、`customer_interests` の値が `rugby`、`football`、*または* `baseball` に設定されているメッセージ属性またはメッセージ本文プロパティと一致します。

## OR 演算子
<a name="or-operator"></a>

`"$or"` 演算子を使用してフィルターポリシーを明示的に定義し、ポリシー内の複数の属性間の OR 関係を表すことができます。

Amazon SNS は、ポリシーが以下の条件をすべて満たしている場合にのみ `"$or"` 関係を認識します。これらの条件がすべて満たされない場合、`"$or"` はポリシー内の他の文字列と同様に通常の属性名として扱われます。
+ ルールには `"$or"` フィールド属性が付けられ、その後に配列 (`“$or” : []` など) が続きます。
+ `"$or"` 配列には少なくとも次の 2 つのオブジェクトがあります: `"$or": [{}, {}]`。
+ `"$or"` 配列内のどのオブジェクトにも、予約キーワードであるフィールド名はありません。

それ以外の場合は、ポリシー内の他の文字列と同様に、`"$or"` は通常の属性名として扱われます。

数値とプレフィックスは予約キーワードであるため、以下のポリシーは OR 関係として解析されません。

```
{ 
   "$or": [ {"numeric" : 123}, {"prefix": "abc"} ] 
}
```

**`OR` 演算子の例**

標準の `OR`:

```
{
  "source": [ "aws.cloudwatch" ], 
  "$or": [
    { "metricName": [ "CPUUtilization" ] },
    { "namespace": [ "AWS/EC2" ] }
  ] 
}
```

このポリシーのフィルターロジックは次のとおりです。

```
"source" && ("metricName" || "namespace")
```

このポリシー属性は、以下のメッセージ属性セットのいずれとも一致します。

```
"source": {"Type": "String", "Value": "aws.cloudwatch"},
"metricName": {"Type": "String", "Value": "CPUUtilization"}
```

または

```
"source": {"Type": "String", "Value": "aws.cloudwatch"},
"namespace": {"Type": "String", "Value": "AWS/EC2"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
    "source": "aws.cloudwatch",
    "metricName": "CPUUtilization"
}
```

または

```
{
    "source": "aws.cloudwatch",
    "namespace": "AWS/EC2"
}
```

### `OR` 関係を含むポリシー制約
<a name="or-operator-constraints"></a>

次のポリシーについて考えます。

```
{
    "source": [ "aws.cloudwatch" ],
    "$or": [
      { "metricName": [ "CPUUtilization", "ReadLatency" ] },
      {
        "metricType": [ "MetricType" ] ,
        "$or" : [
          { "metricId": [ 1234, 4321 ] },
          { "spaceId": [ 1000, 2000, 3000 ] }
        ]
      }
    ]
  }
```

このポリシーのロジックは次のように簡略化することもできます。

```
("source" AND "metricName") 
OR 
("source" AND "metricType" AND "metricId") 
OR 
("source" AND "metricType" AND "spaceId")
```

OR 関係のあるポリシーの複雑さの計算は、各 OR ステートメントの組み合わせの複雑さの合計として簡略化できます。

組み合わせの合計は次のように計算されます。

```
(source * metricName) + (source * metricType * metricId) + (source * metricType * spaceId)
= (1 * 2) + (1 * 1 * 2) + (1 * 1 * 3) 
= 7
```

`source` には 1 つの値、`metricName` には 2 つの値、`metricType` には 1 つの値、`metricId` には 2 つの値、`spaceId` には 3 つの値があります。

次のネストされたフィルターポリシーについて考えてみます。

```
{
    "$or": [
      { "metricName": [ "CPUUtilization", "ReadLatency" ] },
      { "namespace": [ "AWS/EC2", "AWS/ES" ] }
    ],
    "detail" : {
      "scope" : [ "Service" ],
      "$or": [
        { "source": [ "aws.cloudwatch" ] },
        { "type": [ "CloudWatch Alarm State Change"] }
      ]
    }
  }
```

このポリシーのロジックは次のように簡略化できます。

```
("metricName" AND ("detail"."scope" AND "detail"."source")
OR
("metricName" AND ("detail"."scope" AND "detail"."type")
OR
("namespace" AND ("detail"."scope" AND "detail"."source")
OR
("namespace" AND ("detail"."scope" AND "detail"."type")
```

組み合わせの合計の計算は、キーのネストレベルを考慮する必要がある点を除いて、ネストされていないポリシーでも同じです。

組み合わせの合計は次のように計算されます。

```
(2 * 2 * 2) + (2 * 2 * 2) + (2 * 2 * 2) + (2 * 2 * 2) = 32
```

`metricName` には 2 つの値、`namespace` には 2 つの値があります。`scope` は、1 つの値を持つ 2 レベルのネストされたキー、`source` は 1 つの値を持つ 2 レベルのネストされたキー、`type` は 1 つの値を持つ 2 レベルのネストされたキーです。

# キーの一致
<a name="attribute-key-matching"></a>

フィルターポリシーで `exists` 演算子を使用して、特定のプロパティが存在するか存在しないかに基づいて受信メッセージを照合します。
+ `exists` はリーフノード (構造の末端属性) でのみ機能します。
+ ネストされた JSON 構造内の中間ノードには適用されません。
+ `"exists": true` を使用して、指定されたプロパティを含む受信メッセージと一致します。キーには、null でなく、空でない値が必要です。

  例えば、次のポリシーのプロパティは、`true` の値の `exists` 演算子を使用します。

  ```
  "store": [{"exists": true}]
  ```

  次のように、`store` 属性キーを含むすべてのメッセージ属性のリストに一致します。

  ```
  "store": {"Type": "String", "Value": "fans"}
  "customer_interests": {"Type": "String.Array", "Value": "[\"baseball\", \"basketball\"]"}
  ```

  以下のメッセージ本文のいずれとも一致します。

  ```
  {
      "store": "fans"
      "customer_interests": ["baseball", "basketball"]
  }
  ```

  ただし、次のように、`store` 属性キーを*持たない*メッセージ属性の一覧とは一致しません。

  ```
  "customer_interests": {"Type": "String.Array", "Value": "[\"baseball\", \"basketball\"]"}
  ```

  また、次のメッセージ本文にも一致しません。

  ```
  {
      "customer_interests": ["baseball", "basketball"]
  }
  ```
+ `"exists": false` を使用して、指定されたプロパティを*含まない*受信メッセージを一致します。
**注記**  
`"exists": false` は少なくとも 1 つの属性が存在する場合にのみ一致します。属性のセットが空の場合、フィルターは一致しません。

  例えば、次のポリシーのプロパティは、`false` の値の `exists` 演算子を使用します。

  ```
  "store": [{"exists": false}]
  ```

  次のように、`store` 属性キーを含むすべてのメッセージ属性のリストに一致*しません*。

  ```
  "store": {"Type": "String", "Value": "fans"}
  "customer_interests": {"Type": "String.Array", "Value": "[\"baseball\", \"basketball\"]"}
  ```

  次のメッセージ本文にも一致しません。

  ```
  {
      "store": "fans"
      "customer_interests": ["baseball", "basketball"]
  }
  ```

  ただし、次のように、`store` 属性キーを*持たない*メッセージ属性の一覧とは一致します。

  ```
  "customer_interests": {"Type": "String.Array", "Value": "[\"baseball\", \"basketball\"]"}
  ```

  以下のメッセージ本文にも一致します。

  ```
  {
      "customer_interests": ["baseball", "basketball"]
  }
  ```

# 数値の一致
<a name="numeric-value-matching"></a>

数値をメッセージ属性値またはメッセージ本文のプロパティ値に一致させることで、メッセージをフィルタリングできます。JSON ポリシーでは、数値を二重引用符で囲みません。フィルターには次の数値オペレーションを使用できます。

**注記**  
プレフィックスは、*文字列*一致のみがサポートされます。

## 完全一致
<a name="numeric-exact-matching"></a>

ポリシープロパティ値に `numeric` キーワードと演算子 `=` が含まれている場合、同じ名前と等しい数値を持つ任意のメッセージ属性またはメッセージ本文プロパティ値と一致します。

次のポリシーのプロパティについて考えます。

```
"price_usd": [{"numeric": ["=",301.5]}]
```

このポリシー属性は、以下のメッセージ属性のいずれとも一致します。

```
"price_usd": {"Type": "Number", "Value": 301.5}
```

```
"price_usd": {"Type": "Number", "Value": 3.015e2}
```

以下のメッセージ本文のいずれとも一致します。

```
{
   "price_usd": 301.5
}
```

```
{
   "price_usd": 3.015e2
}
```

## 「以外」のマッチング
<a name="numeric-anything-but-matching"></a>

ポリシープロパティ値にキーワード `anything-but` が含まれている場合、そのキーワードは、ポリシープロパティ値を*含まない*任意のメッセージ属性またはメッセージ本文プロパティ値と一致します。

次のポリシーのプロパティについて考えます。

```
"price": [{"anything-but": [100, 500]}]
```

このポリシー属性は、以下のメッセージ属性のいずれとも一致します。

```
"price": {"Type": "Number", "Value": 101}
```

```
"price": {"Type": "Number", "Value": 100.1}
```

以下のメッセージ本文のいずれとも一致します。

```
{
   "price": 101
}
```

```
{
   "price": 100.1
}
```

さらに、次のメッセージ属性にも一致します (これは `100` でも `500` *でもない*値を含むためです)。

```
"price": {"Type": "Number.Array", "Value": "[100, 50]"}
```

また、次のメッセージ本文にも一致します (これは `100` でも `500` *でもない*値が含まれるためです)。

```
{
   "price": [100, 50]
}
```

ただし、次のメッセージ属性とは一致しません。

```
"price": {"Type": "Number", "Value": 100}
```

また、次のメッセージ本文にも一致しません。

```
{
   "price": 100
}
```

## 値範囲の一致
<a name="numeric-value-range-matching"></a>

数値ポリシープロパティには、`=` 演算子に加えて、次の `<`、`<=`、`>`、および `>=` を含めることができます。

次のポリシーのプロパティについて考えます。

```
"price_usd": [{"numeric": ["<", 0]}]
```

負の数値を持つ任意のメッセージ属性またはメッセージ本文プロパティと一致します。

別のポリシー属性について考えます。

```
"price_usd": [{"numeric": [">", 0, "<=", 150]}]
```

最大 150 までの正の数を持つメッセージ属性またはメッセージ本文プロパティと一致します。

# 文字列値の一致
<a name="string-value-matching"></a>

文字列値をメッセージ属性値またはメッセージ本文のプロパティ値に一致させることで、メッセージをフィルタリングできます。JSON ポリシーでは、文字列値を二重引用符で囲みます。次の文字列オペレーションを使用して、メッセージ属性またはメッセージ本文のプロパティと一致させることができます。

## 完全一致
<a name="string-exact-matching"></a>

完全一致は、ポリシープロパティ値が 1 つ以上のメッセージ属性値と一致した場合に発生します。`String.Array` 型属性の場合、配列内の各要素は、マッチングのために個別の文字列として扱われます。

次のポリシーのプロパティについて考えます。

```
"customer_interests": ["rugby", "tennis"]
```

このポリシー属性は、以下のメッセージ属性と一致します。

```
"customer_interests": {"Type": "String", "Value": "rugby"}
```

```
"customer_interests": {"Type": "String", "Value": "tennis"}
```

```
"customer_interests": {"Type": "String.Array", "Value": "[\"rugby\", \"tennis\"]"}
```

また、次のメッセージ本文にも一致します。

```
{
   "customer_interests": "rugby"
}
```

```
{
   "customer_interests": "tennis"
}
```

ただし、次のメッセージ属性とは一致しません。

```
"customer_interests": {"Type": "String", "Value": "baseball"}
```

```
"customer_interests": {"Type": "String.Array", "Value": "[\"baseball\"]"}
```

また、次のメッセージ本文にも一致しません。

```
{
   "customer_interests": "baseball"
}
```

## 「以外」のマッチング
<a name="string-anything-but-matching"></a>

ポリシープロパティ値にキーワード `anything-but` が含まれている場合、そのキーワードは、ポリシープロパティ値を*含まない*任意のメッセージ属性またはメッセージ本文値と一致します。`anything-but` は、`"exists": false` と組み合わせることができます。`String.Array` 型属性の場合、配列のどの要素もポリシープロパティに含まれていなければ、このマッチングは一致します。

次のポリシーのプロパティについて考えます。

```
"customer_interests": [{"anything-but": ["rugby", "tennis"]}]
```

このポリシー属性は、次のメッセージ属性と一致します。

```
"customer_interests": {"Type": "String", "Value": "baseball"}
```

```
"customer_interests": {"Type": "String", "Value": "football"}
```

```
"customer_interests": {"Type": "String.Array", "Value": "[\"rugby\", \"baseball\"]"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
   "customer_interests": "baseball"
}
```

```
{
   "customer_interests": "football"
}
```

さらに、次のメッセージ属性にも一致します (これは `rugby` でも `tennis` *でもない*値を含むためです)。

```
"customer_interests": {"Type": "String.Array", "Value": "[\"rugby\", \"baseball\"]"}
```

また、次のメッセージ本文にも一致します (これには `rugby` でも `tennis` でもない値が含まれるためです)。

```
{
   "customer_interests": ["rugby", "baseball"]
}
```

ただし、次のメッセージ属性とは一致しません。

```
"customer_interests": {"Type": "String", "Value": "rugby"}
```

```
"customer_interests": {"Type": "String.Array", "Value": "[\"rugby\"]"}
```

また、次のメッセージ本文にも一致しません。

```
{
   "customer_interests": ["rugby"]
}
```

**`anything-but` でプレフィックスを使用する**

文字列一致では、`anything-but` 演算子と共にプレフィックスを使用することもできます。例えば、次のポリシープロパティが `order-` プレフィックスを拒否します。

```
"event":[{"anything-but": {"prefix": "order-"}}]
```

このポリシー属性は、以下の属性のいずれとも一致します。

```
"event": {"Type": "String", "Value": "data-entry"}
```

```
"event": {"Type": "String", "Value": "order_number"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
   "event": "data-entry"
}
```

```
{
   "event": "order_number"
}
```

ただし、次のメッセージ属性とは一致しません。

```
"event": {"Type": "String", "Value": "order-cancelled"}
```

また、次のメッセージ本文にも一致しません。

```
{
   "event": "order-cancelled"
}
```

**anything-but ワイルドカード**

次のポリシープロパティは、`*ball` ワイルドカードを拒否します。

```
"customer_interests" : [{ "anything-but": { "wildcard": "*ball" }}]
```

このポリシー属性は、次の属性と一致します。

```
{"customer_interests": ["hockey", "rugby", "soccer] }
```

ただし、次のメッセージ属性とは一致しません。

```
{"customer_interests": ["baseball", "basketball"] }
```

**anything-but サフィックス** 

次のポリシープロパティは、`-ball`

 サフィックスを拒否します。

```
"customer_interests": [ { "anything-but": { "suffix": "ball" } } ]
```

このポリシー属性は、次の属性と一致します。

```
{"customer_interests": ["hockey", "rugby", "soccer] }
```

ただし、次のメッセージ属性とは一致しません。

```
 {"customer_interests": ["baseball", "basketball"] }
```

## Equals-ignore-case マッチング
<a name="string-equals-ignore"></a>

ポリシープロパティに `equals-ignore-case` キーワードが含まれている場合、任意のメッセージ属性または本文プロパティ値を使用して、大文字と小文字を区別しない一致が実行されます。

次のポリシーのプロパティについて考えます。

```
"customer_interests": [{"equals-ignore-case": "tennis"}]
```

このポリシー属性は、以下のメッセージ属性のいずれとも一致します。

```
"customer_interests": {"Type": "String", "Value": "TENNIS"}
```

```
"customer_interests": {"Type": "String", "Value": "Tennis"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
    "customer_interests": "TENNIS"
}
```

```
{
    "customer_interests": "teNnis"
{
```

## IP アドレスマッチング
<a name="string-address-matching"></a>

`cidr` 演算子を使用して、受信メッセージが特定の IP アドレスまたはサブネットから発信されているかどうかを確認できます。

次のポリシーのプロパティについて考えます。

```
"source_ip":[{"cidr": "10.0.0.0/24"}]
```

このポリシー属性は、以下のメッセージ属性のいずれとも一致します。

```
"source_ip": {"Type": "String", "Value": "10.0.0.0"}
```

```
"source_ip": {"Type": "String", "Value": "10.0.0.255"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
   "source_ip": "10.0.0.0"
}
```

```
{
   "source_ip": "10.0.0.255"
}
```

ただし、次のメッセージ属性とは一致しません。

```
"source_ip": {"Type": "String", "Value": "10.1.1.0"}
```

また、次のメッセージ本文にも一致しません。

```
{
   "source_ip": "10.1.1.0"
}
```

## プレフィックスマッチング
<a name="string-prefix-matching"></a>

ポリシープロパティに `prefix` キーワードが含まれている場合、指定した文字で始まる任意のメッセージ属性または本文プロパティ値と一致します。

次のポリシーのプロパティについて考えます。

```
"customer_interests": [{"prefix": "bas"}]
```

このポリシー属性は、以下のメッセージ属性のいずれとも一致します。

```
"customer_interests": {"Type": "String", "Value": "baseball"}
```

```
"customer_interests": {"Type": "String", "Value": "basketball"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
   "customer_interests": "baseball"
}
```

```
{
   "customer_interests": "basketball"
}
```

ただし、次のメッセージ属性とは一致しません。

```
"customer_interests": {"Type": "String", "Value": "rugby"}
```

また、次のメッセージ本文にも一致しません。

```
{
   "customer_interests": "rugby"
}
```

## サフィックスマッチング
<a name="string-suffix-matching"></a>

ポリシープロパティに `suffix` キーワードが含まれている場合、指定した文字で終わる任意のメッセージ属性または本文プロパティ値と一致します。

次のポリシーのプロパティについて考えます。

```
"customer_interests": [{"suffix": "ball"}]
```

このポリシー属性は、以下のメッセージ属性のいずれとも一致します。

```
"customer_interests": {"Type": "String", "Value": "baseball"}
```

```
"customer_interests": {"Type": "String", "Value": "basketball"}
```

以下のメッセージ本文のいずれとも一致します。

```
{
    "customer_interests": "baseball"
}
```

```
{
    "customer_interests": "basketball"
}
```

ただし、次のメッセージ属性とは一致しません。

```
"customer_interests": {"Type": "String", "Value": "rugby"}
```

また、次のメッセージ本文にも一致しません。

```
{
    "customer_interests": "rugby"
}
```

## ワイルドカード
<a name="string-value-wildcard"></a>

 ワイルドカード文字 (\$1) を使用してイベントパターン内の文字列値と一致させることができます。

次のポリシーでは、ワイルドカード (\$1) 文字を使用しています。

```
"customer_interests": [ { "wildcard": "*ball" } ]
```

このポリシー属性は、次の属性と一致します。

```
{"customer_interests": ["baseball", "basketball"] }
```

# Amazon SNS でサブスクリプションフィルターポリシーを適用する
<a name="message-filtering-apply"></a>

Amazon SNS でメッセージフィルタリングを使用すると、フィルターポリシーに基づいてサブスクライバーにメッセージを選択的に配信できます。これらのポリシーは、メッセージがサブスクリプションに配信されるために満たす必要がある条件を定義します。raw メッセージ配信はメッセージ処理に影響を与える可能性があるオプションですが、サブスクリプションフィルターが機能するために必須ではありません。

Amazon SNS コンソールを使用して、Amazon SNS サブスクリプションにフィルターポリシーを適用できます。または、プログラムでポリシーを適用するには、Amazon SNS API、 AWS Command Line Interface (AWS CLI)、または Amazon SNS をサポートする任意の AWS SDK を使用できます。 Amazon SNS を使用することもできます AWS CloudFormation。

**raw メッセージ配信の有効化**

raw メッセージ配信では、追加のエンコーディングや変換を行わずに、メッセージペイロードがそのままサブスクライバーに配信されます。これは、サブスクライバーが処理のために元のメッセージ形式を必要とする場合に役立ちます。ただし、raw メッセージ配信は、サブスクリプションフィルターの機能とは直接関係ありません。

**サブスクリプションフィルターの適用**

メッセージフィルターをサブスクリプションに適用するには、JSON 構文を使用してフィルターポリシーを定義します。このポリシーは、サブスクリプションに配信されるためにメッセージが満たす必要がある条件を指定します。フィルターは、メッセージ属性、メッセージ構造、メッセージコンテンツなどのメッセージ属性に基づいて設定できます。

**raw メッセージ配信とサブスクリプションフィルターの関係**

raw メッセージ配信を有効にすると、サブスクライバーによるメッセージの配信と処理方法に影響を与える可能性がありますが、サブスクリプションフィルターを使用するための前提条件ではありません。ただし、サブスクライバーが変更されていない元のメッセージ形式を必要とするシナリオでは、raw メッセージ配信の有効化は、サブスクリプションフィルターとあわせて役立つ場合があります。

**効果的なフィルタリングに関する考慮事項**

メッセージフィルタリングを実装する場合は、アプリケーションとサブスクライバーの特定の要件を考慮してください。メッセージ配信の基準に正確に一致するフィルターポリシーを定義して、効率的でターゲットを絞ったメッセージ配信を確実に行います。

**重要**  
AWS IAM や Amazon SNS などの サービスは、結果整合性と呼ばれる分散コンピューティングモデルを使用します。サブスクリプションフィルターポリシーへの追加または変更は、完全に有効になるまでに最大 15 分かかります。

## AWS マネジメントコンソール
<a name="message-filtering-apply-console"></a>

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**サブスクリプション**] を選択します。

1. サブスクリプションを選択したら、[**編集**] を選択します。

1. **[Edit]**(編集) ページで、**[Subscription filter policy]**(サブスクリプションフィルターポリシーセクション) を展開します。

1. **属性ベースのフィルタリング**または**ペイロードベースのフィルタリング**のいずれかを選択します。

1. **[JSON editor]**(JSON エディタ) フィールドで、フィルターポリシーの **[JSON body]**(JSON 本文) を提供します。

1. [**変更を保存**] をクリックします。

   Amazon SNS により、フィルターポリシーがサブスクリプションに適用されます。

## AWS CLI
<a name="message-filtering-apply-cli"></a>

 AWS Command Line Interface (AWS CLI) でフィルターポリシーを適用するには、次の例に示すように [https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html](https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html) コマンドを使用します。`--attribute-name` オプションで、`FilterPolicy` を指定します。`--attribute-value` で、**JSON ポリシー**を指定します。

```
$ aws sns set-subscription-attributes --subscription-arn arn:aws:sns: ... --attribute-name FilterPolicy --attribute-value '{"store":["example_corp"],"event":["order_placed"]}'
```

ポリシーに有効な JSON を提供するには、属性名と値を二重引用符で囲みます。また、ポリシーの引数全体を引用符で囲む必要があります。引用符のエスケープを避けるため、上に示した例のように、一重引用符を使用してポリシーを囲み、二重引用符を使用して JSON 名と値を囲みます。

メッセージフィルタリングを属性ベース (デフォルト) からペイロードベースに切り替える場合は、[set-subscription-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html) コマンドも使用できます。`--attribute-name` オプションで、`FilterPolicyScope` を指定します。`--attribute-value` の場合、`MessageBody` を指定します。

```
$ aws sns set-subscription-attributes --subscription-arn arn:aws:sns: ... --attribute-name FilterPolicyScope --attribute-value MessageBody
```

フィルターポリシーが適用されたことを確認するには、`get-subscription-attributes` コマンドを使用します。ターミナル出力の属性には、以下の例に示すように、`FilterPolicy` キーのフィルターポリシーが表示されます。

```
$ aws sns get-subscription-attributes --subscription-arn arn:aws:sns: ...
{
    "Attributes": {
        "Endpoint": "endpoint . . .", 
        "Protocol": "https",
        "RawMessageDelivery": "false", 
        "EffectiveDeliveryPolicy": "delivery policy . . .",
        "ConfirmationWasAuthenticated": "true", 
        "FilterPolicy": "{\"store\": [\"example_corp\"], \"event\": [\"order_placed\"]}", 
        "FilterPolicyScope": "MessageAttributes",
        "Owner": "111122223333", 
        "SubscriptionArn": "arn:aws:sns: . . .", 
        "TopicArn": "arn:aws:sns: . . ."
    }
}
```

## AWS SDKs
<a name="message-filtering-apply-sdks"></a>

次のサンプルコードは、`SetSubscriptionAttributes` を使用する方法を説明しています。

**重要**  
SDK for Java 2.x の例を使用している場合、クラス `SNSMessageFilterPolicy` はそのままでは使用できません。このクラスをインストールする方法については、GitHub ウェブサイトの[例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/sns/src/main/java/com/example/sns/SNSMessageFilterPolicy.java)を参照してください。

------
#### [ CLI ]

**AWS CLI**  
**サブスクリプション属性を設定するには**  
次の `set-subscription-attributes` の例では、`RawMessageDelivery` 属性を SQS サブスクリプションに設定します。  

```
aws sns set-subscription-attributes \
    --subscription-arn arn:aws:sns:us-east-1:123456789012:mytopic:f248de18-2cf6-578c-8592-b6f1eaa877dc \
    --attribute-name RawMessageDelivery \
    --attribute-value true
```
このコマンドでは何も出力されません。  
次の `set-subscription-attributes` の例では、`FilterPolicy` 属性を SQS サブスクリプションに設定します。  

```
aws sns set-subscription-attributes \
    --subscription-arn arn:aws:sns:us-east-1:123456789012:mytopic:f248de18-2cf6-578c-8592-b6f1eaa877dc \
    --attribute-name FilterPolicy \
    --attribute-value "{ \"anyMandatoryKey\": [\"any\", \"of\", \"these\"] }"
```
このコマンドでは何も出力されません。  
次の `set-subscription-attributes` の例では、`FilterPolicy` 属性を SQS サブスクリプションから削除します。  

```
aws sns set-subscription-attributes \
    --subscription-arn arn:aws:sns:us-east-1:123456789012:mytopic:f248de18-2cf6-578c-8592-b6f1eaa877dc \
    --attribute-name FilterPolicy \
    --attribute-value "{}"
```
このコマンドでは何も出力されません。  
+  API の詳細については、「*AWS CLI コマンドリファレンス*」の「[SetSubscriptionAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-subscription-attributes.html)」を参照してください。

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SnsException;
import java.util.ArrayList;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class UseMessageFilterPolicy {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <subscriptionArn>

                Where:
                   subscriptionArn - The ARN of a subscription.

                """;

        if (args.length != 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String subscriptionArn = args[0];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        usePolicy(snsClient, subscriptionArn);
        snsClient.close();
    }

    public static void usePolicy(SnsClient snsClient, String subscriptionArn) {
        try {
            SNSMessageFilterPolicy fp = new SNSMessageFilterPolicy();
            // Add a filter policy attribute with a single value
            fp.addAttribute("store", "example_corp");
            fp.addAttribute("event", "order_placed");

            // Add a prefix attribute
            fp.addAttributePrefix("customer_interests", "bas");

            // Add an anything-but attribute
            fp.addAttributeAnythingBut("customer_interests", "baseball");

            // Add a filter policy attribute with a list of values
            ArrayList<String> attributeValues = new ArrayList<>();
            attributeValues.add("rugby");
            attributeValues.add("soccer");
            attributeValues.add("hockey");
            fp.addAttribute("customer_interests", attributeValues);

            // Add a numeric attribute
            fp.addAttribute("price_usd", "=", 0);

            // Add a numeric attribute with a range
            fp.addAttributeRange("price_usd", ">", 0, "<=", 100);

            // Apply the filter policy attributes to an Amazon SNS subscription
            fp.apply(snsClient, subscriptionArn);

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  API の詳細については、*AWS SDK for Java 2.x API リファレンス*の「[SetSubscriptionAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetSubscriptionAttributes)」を参照してください。

------
#### [ Python ]

**SDK for Python (Boto3)**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
class SnsWrapper:
    """Encapsulates Amazon SNS topic and subscription functions."""

    def __init__(self, sns_resource):
        """
        :param sns_resource: A Boto3 Amazon SNS resource.
        """
        self.sns_resource = sns_resource


    @staticmethod
    def add_subscription_filter(subscription, attributes):
        """
        Adds a filter policy to a subscription. A filter policy is a key and a
        list of values that are allowed. When a message is published, it must have an
        attribute that passes the filter or it will not be sent to the subscription.

        :param subscription: The subscription the filter policy is attached to.
        :param attributes: A dictionary of key-value pairs that define the filter.
        """
        try:
            att_policy = {key: [value] for key, value in attributes.items()}
            subscription.set_attributes(
                AttributeName="FilterPolicy", AttributeValue=json.dumps(att_policy)
            )
            logger.info("Added filter to subscription %s.", subscription.arn)
        except ClientError:
            logger.exception(
                "Couldn't add filter to subscription %s.", subscription.arn
            )
            raise
```
+  API の詳細については、**「AWS SDK for Python (Boto3) API リファレンス」の「[SetSubscriptionAttributes](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/SetSubscriptionAttributes)」を参照してください。

------
#### [ SAP ABAP ]

**SDK for SAP ABAP**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)での設定と実行の方法を確認してください。

```
    TRY.
        lo_sns->setsubscriptionattributes(
            iv_subscriptionarn = iv_subscription_arn
            iv_attributename  = 'FilterPolicy'
            iv_attributevalue = iv_filter_policy ).
        MESSAGE 'Added filter policy to subscription.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Subscription does not exist.' TYPE 'E'.
    ENDTRY.
```
+  API の詳細については、 *AWS SDK for SAP ABAP API リファレンス*の「[SetSubscriptionAttributes](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)」を参照してください。

------

## Amazon SNS API
<a name="message-filtering-apply-api"></a>

Amazon SNS API を使用してフィルターポリシーを適用するには、[https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) アクションへのリクエストを作成します。`AttributeName` パラメータを `FilterPolicy` に設定し、`AttributeValue` パラメータをフィルターポリシーの JSON に設定します。

メッセージフィルタリングを属性ベース (デフォルト) からペイロードベースのメッセージフィルタリングに切り替える場合は、[https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) アクションも使用できます。`AttributeName` パラメータを `FilterPolicyScope` に設定し、`AttributeValue` パラメータを `MessageBody` に設定します。

## AWS CloudFormation
<a name="message-filtering-apply-cloudformation"></a>

を使用してフィルターポリシーを適用するには CloudFormation、JSON または YAML テンプレートを使用してスタックを作成します CloudFormation 。詳細については、 *AWS CloudFormation ユーザーガイド*の `AWS::SNS::Subscription`リソースの [`FilterPolicy`プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy)と[サンプル CloudFormation テンプレート](https://github.com/aws-samples/aws-sns-samples/blob/master/templates/SNS-Subscription-Attributes-Tutorial-CloudFormation.template)を参照してください。

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation) にサインインします。

1. [**スタックの作成**] を選択します。

1. [**テンプレートの選択**] ページで、[**テンプレートを Amazon S3 にアップロード**] を選択してから、ファイルを選択して [**次へ**] をクリックします。

1. [**詳細の指定**] ページで、以下の作業を行います。

   1. [**スタックの名前**] に「`MyFilterPolicyStack`」と入力します。

   1. [**myHttpEndpoint**] に、トピックにサブスクライブする HTTP エンドポイントを入力します。
**ヒント**  
HTTP エンドポイントがない場合は作成します。

1. [**オプション**] ページで、[**次へ**] をクリックします。

1. [**Review**] ページで、[**作成**] を選択します。

# Amazon SNS のサブスクリプションフィルターポリシーを削除する
<a name="message-filtering-policy-remove"></a>

サブスクリプションに送信されるメッセージのフィルター処理を停止するには、サブスクリプションのフィルターポリシーを空の JSON 本文に上書きすることで削除します。このポリシーを削除したら、サブスクリプションは発行されるすべてのメッセージを受け取るようになります。

## の使用 AWS マネジメントコンソール
<a name="message-filtering-policy-remove-console"></a>

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**サブスクリプション**] を選択します。

1. サブスクリプションを選択したら、[**編集**] を選択します。

1. [**Edit *EXAMPLE1-23bc-4567-d890-ef12g3hij456***] ページで、[**サブスクリプションフィルターポリシー**] セクションを展開します。

1. [**JSON エディタ**] フィールドで、フィルターポリシーの空の JSON 本文を指定します (`{}`)。

1. [**変更を保存**] をクリックします。

   Amazon SNS により、フィルターポリシーがサブスクリプションに適用されます。

## の使用 AWS CLI
<a name="message-filtering-policy-remove-cli"></a>

でフィルターポリシーを削除するには AWS CLI、 [https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html](https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html) コマンドを使用して `--attribute-value`引数に空の JSON 本文を指定します。

```
$ aws sns set-subscription-attributes --subscription-arn arn:aws:sns: ... --attribute-name FilterPolicy --attribute-value "{}"
```

## Amazon SNS API の使用
<a name="message-filtering-policy-remove-api"></a>

Amazon SNS API を使用してフィルターポリシーを削除するには、[https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) アクションへのリクエストを行います。`AttributeName` パラメータを `FilterPolicy` に設定し、`AttributeValue` パラメータに空の JSON 本文を指定します。